Mon site internet a été infecté par des liens indésirables

WRInaute discret
Bonjour,

Je viens de m'apercevoir que quand je suis en version texte seul sur mon site (google cache), je vois plus d'une centaine de liens indésirables sur ma page d'accueil. C'est étrange car quand je suis en version intégrale, les liens n'apparaissent pas sur le site.

Ce qui est étonnant, c'est que dans mon WebmasterTools, il n'y a pas de message affichant un problème de sécurité.

Que faire pour supprimer ces liens ?
 
WRInaute accro
webilyas a dit:
quand je suis en version texte seul sur mon site (google cache), je vois plus d'une centaine de liens indésirables sur ma page d'accueil. C'est étrange car quand je suis en version intégrale, les liens n'apparaissent pas sur le site.
Cloaking ton site est "piraté". Change tout tes mots de passe et recharge une version propre du site.
 
WRInaute discret
@zeb

J'avais déjà supprimé des fichiers suspects dans mon serveur et j'avais aussi modifié mes mots de passe.

Peut être que le cache de mon site n'est pas à jour sur google ? Comment vérifier la date ?
 
WRInaute accro
webilyas a dit:
Comment vérifier la date ?
Dans le style tu en pose souvent des questions de base monsieur le SEO de Belgique qui a pignon sur rue ... 8O
Ceci est le cache Google de http://******. Il s'agit d'un instantané de la page telle qu'elle était affichée le 20 sept. 2015 10:25:44 GMT.
Bref si tu as été infecté ET que le cache est daté d'après tes correction c'est que tu est toujours infecté.
Soit dit en passant et pour prévenir la potentielle question suivante si tu est encore infecté ET que tu avais fait le ménage il faut maintenant trouver la faille pour la combler et refaire le ménage en même temps.
 
WRInaute discret
Marie-Aude a dit:
Waow c'est énorme ! :lol:

Je cherche une solution à mon problème ici, je n'ai pas besoin de commentaires inutiles comme le vôtre :!: Ça devient agaçant savez-vous :?:

De plus, ce qui est gênant, vous n'agissez pas comme un modérateur. Merci de vous abstenir si vous n'avez rien à dire d'intéressant :wink:
 
WRInaute accro
C'est un WP.
Ça peut être n'importe lequel, il faut rechercher dans les fichiers avec grep ou N++ ou demander à ton développeur.
 
WRInaute accro
webilyas a dit:
Je cherche une solution à mon problème ici, je n'ai pas besoin de commentaires inutiles comme le vôtre :!: Ça devient agaçant savez-vous :?:

De plus, ce qui est gênant, vous n'agissez pas comme un modérateur. Merci de vous abstenir si vous n'avez rien à dire d'intéressant :wink:

Merci de vous abstenir de me donner des ordres. A moins qu'on recommence la discussion qu'on a eu l'autre fois et que j'avais totalement oubliée (et que votre commentaire m'a rappelée)

Mon boulot de modérateur consiste à supprimer ce qui est hors charte et corriger les posts des gens qui, comme vous, ne sont pas capable de faire la différence entre "citer" et "répondre" et donnent l'impression d'un bégaiement à tout lecteur du fil.

Pour le reste, je suis, comme n'importe quel membre du forum, autorisée à exprimer des opinions, tant qu'elles restent courtoises.

Sur ce, si vous voulez des réponses efficaces, dites de quel site il s'agit, s'il est fait avec un CMS, lequel, plugins, extensions, etc c'est là qu'on pourra vous guider.

Perso, je ne réponds pas en utilisant la boule de cristal.
 
WRInaute accro
webilyas a dit:
Comment trouver la faille pour enlever tous ces liens indésirables ?
il y a 1000 et une façon simple c'est un métier mon brave monsieur.

Bon passons sur ce qui pourrait être considéré comme du sarcasme ou avec un peut d'esprit des pics destinés a faire progresser.

1/ la technique Spout (long et chiant)

2/ md5 > tu calcul un hash de tous les fichiers via une récursive sur le site et en local (site non infecté) ensuite tu compare.
Perso j'ai ça en natif sur mon CMS donc j'ai une base des hash normaux et un script qui calcule en live si différence j'ai une alerte et je regarde si c'est normal (certains fichiers changent c'est normal donc faut trier dans les différences ensuite).

Faut bien sur prévoir le coup a l'avance c'est mieux.

3/ linux (ou ton serveur en SSH si tu bosse sur du microsoft car je ne sais pas si ça existe sous cet OS) : http://www.linux-france.org/article/man-fr/man1/diff-1.html . Il est évident qu'un fichier en plus ne sera pa vu donc il faut aussi comparer le nombre de fichiers présents.

4/ en local tu compare les tailles des fichiers mais c'est moins fiable.

Un peu de code pour se prémunir a l'avenir :

Code:
CREATE TABLE IF NOT EXISTS `miroir_fichier` (
  `id` bigint(20) NOT NULL auto_increment,
  `fichier` varchar(256),
  `version` varchar(10),
  `hash` varchar(32) NOT NUL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `solo` (`fichier`,`version`)
)

la fonction php qui va bien :

config.php > fichier qui contiens tes variables comme tes accès base de données
s_mysqli_query > équivalent de mysqli_query lié au CMS
${table_miroir_fichier} > le bom de la table qui contiens les sortie (ici ^^ `miroir_fichier`)

appel de la fonction > String parse_folder(string path , bool affichage direct, bool initialisation de la base , bool récursif dans les sous dossiers rencontrés);


PHP:
<span class="syntaxdefault">    function parse_folder</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dir</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$display</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$init</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$subfolder</span><span class="syntaxkeyword">){<br /></span><span class="syntaxdefault">        require</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$_SERVER</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'DOCUMENT_ROOT'</span><span class="syntaxkeyword">].</span><span class="syntaxstring">'/config.php'</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxdefault">        if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dh </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> opendir</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dir</span><span class="syntaxkeyword">))</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">            while </span><span class="syntaxkeyword">((</span><span class="syntaxdefault">$file </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> readdir</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dh</span><span class="syntaxkeyword">))</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">!=</span><span class="syntaxdefault"> false</span><span class="syntaxkeyword">){<br /></span><span class="syntaxdefault">                if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">is_dir</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dir</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$file</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">&&</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">(!</span><span class="syntaxdefault">preg_match</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"/^\./"</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$file</span><span class="syntaxkeyword">))){<br /></span><span class="syntaxdefault">                    if</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$subfolder</span><span class="syntaxkeyword">){</span><span class="syntaxdefault">$log </span><span class="syntaxkeyword">.=</span><span class="syntaxdefault"> parse_folder</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dir</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$file</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'/'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$display</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$init</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$subfolder</span><span class="syntaxkeyword">);}<br /></span><span class="syntaxdefault">                </span><span class="syntaxkeyword">}else{<br /></span><span class="syntaxdefault">                    $hash </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> hash_file</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'md5'</span><span class="syntaxkeyword">,(</span><span class="syntaxdefault">$dir</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$file</span><span class="syntaxkeyword">));<br /></span><span class="syntaxdefault">                    if</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$hash</span><span class="syntaxkeyword">!=</span><span class="syntaxstring">'d41d8cd98f00b204e9800998ecf8427e'</span><span class="syntaxkeyword">){</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// (Hash of an empty string)<br /></span><span class="syntaxdefault">                        $short_file </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> preg_replace</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'#^'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$_SERVER</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'DOCUMENT_ROOT'</span><span class="syntaxkeyword">].</span><span class="syntaxstring">'#si'</span><span class="syntaxkeyword">,</span><span class="syntaxstring">""</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$dir</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$file</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">                        $sql1 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">"SELECT `hash` FROM `</span><span class="syntaxkeyword">${</span><span class="syntaxdefault">table_miroir_fichier</span><span class="syntaxkeyword">}</span><span class="syntaxstring">` WHERE `fichier` = '</span><span class="syntaxdefault">$short_file</span><span class="syntaxstring">' AND `version` = '</span><span class="syntaxdefault">$version</span><span class="syntaxstring">'"</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">                        $sql2 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">"INSERT INTO `</span><span class="syntaxkeyword">${</span><span class="syntaxdefault">table_miroir_fichier</span><span class="syntaxkeyword">}</span><span class="syntaxstring">` (`id`, `fichier`, `version`, `hash`) VALUES ('', '</span><span class="syntaxdefault">$short_file</span><span class="syntaxstring">', '</span><span class="syntaxdefault">$version</span><span class="syntaxstring">', '"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$hash</span><span class="syntaxkeyword">.</span><span class="syntaxstring">"')"</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">                        $rs </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> s_mysqli_query</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$sql1</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">                        $cr </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> mysqli_num_rows</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$rs</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">                        if</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$cr </span><span class="syntaxkeyword">==</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">){<br /></span><span class="syntaxdefault">                            </span><span class="syntaxcomment">// un résultat en base on a déjà rencontré le fichier<br /></span><span class="syntaxdefault">                            $rec </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> mysqli_fetch_array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$rs</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">                            if</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$rec</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]==</span><span class="syntaxdefault">$hash</span><span class="syntaxkeyword">){<br /></span><span class="syntaxdefault">                                if</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$display</span><span class="syntaxkeyword">){</span><span class="syntaxdefault">echo </span><span class="syntaxstring">"<tr><td></span><span class="syntaxdefault">$short_file</span><span class="syntaxstring"></td><td><font color='green'>Ok</font></td><td></span><span class="syntaxdefault">$hash</span><span class="syntaxstring"></td></tr>\n"</span><span class="syntaxkeyword">;}<br /></span><span class="syntaxdefault">                            </span><span class="syntaxkeyword">}else{<br /></span><span class="syntaxdefault">                                if</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$display</span><span class="syntaxkeyword">){</span><span class="syntaxdefault">echo </span><span class="syntaxstring">"<tr><td></span><span class="syntaxdefault">$short_file</span><span class="syntaxstring"></td><td><font color='red'>Attention</font></td><td></span><span class="syntaxdefault">$hash</span><span class="syntaxstring"></td></tr>\n"</span><span class="syntaxkeyword">;}<br /></span><span class="syntaxdefault">                                $log </span><span class="syntaxkeyword">.=</span><span class="syntaxdefault"> </span><span class="syntaxstring">"[</span><span class="syntaxdefault">$short_file</span><span class="syntaxstring">] corruption possible md5 base : "</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$rec</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">].</span><span class="syntaxstring">" / md5 filesystem : </span><span class="syntaxdefault">$hash</span><span class="syntaxstring"><br/>\n"</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">                            </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">                        </span><span class="syntaxkeyword">}else{</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// fichier jamais vu en base donc possible corruption<br /></span><span class="syntaxdefault">                            if</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$init</span><span class="syntaxkeyword">){</span><span class="syntaxdefault">s_mysqli_query</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$sql2</span><span class="syntaxkeyword">);}<br /></span><span class="syntaxdefault">                            if</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$display</span><span class="syntaxkeyword">){</span><span class="syntaxdefault">echo </span><span class="syntaxstring">"<tr><td></span><span class="syntaxdefault">$short_file</span><span class="syntaxstring"></td><td><font color='red'>Fichier inconnu</font></td><td></span><span class="syntaxdefault">$hash</span><span class="syntaxstring"></td></tr>\n"</span><span class="syntaxkeyword">;}<br /></span><span class="syntaxdefault">                            $log </span><span class="syntaxkeyword">.=</span><span class="syntaxdefault"> </span><span class="syntaxstring">"[</span><span class="syntaxdefault">$short_file</span><span class="syntaxstring">] ajout possible md5 base : inéxistant / md5 filesystem : </span><span class="syntaxdefault">$hash</span><span class="syntaxstring"><br/>\n"</span><span class="syntaxkeyword">;</span><span class="syntaxdefault">                <br />                        </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">                    </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">                </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">            </span><span class="syntaxkeyword">}</span><span class="syntaxdefault">        <br />        </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">        closedir</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dh</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">        return $log</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">    </span><span class="syntaxkeyword">}&nbsp;</span><span class="syntaxdefault"></span>

et un exemple de sortie écran :

983465551.jpg


sur cet exemple tu remarque des fichiers connus à la racine (vert OK), une alerte sur le fichier htaccess (normal il a été modifié) et le fichier favicon.ico qui fait gueuler le système car il n'était pas présent au scan précédent.
 
WRInaute accro
De toute façon le cloacking il y a en effet pas a tortiller du c*l pour chi*r droit il y a pas masse de scripts ou tu peux intervenir.
 
WRInaute discret
Je pense avoir trouvé la faille de sécurité, c'est ma base de donnée PhpMyAdmin en fait qui n'a pas été mise à jour depuis très longtemps. Je suis actuellement en version: 4.0.10.7, et la dernière version stable est : 4.5.0.2 :/ Je suis à 99 % sûr que c'est ça le problème.

J'ai contrôlé les fichiers de mon serveur, et je n'ai rien trouvé de suspect comme fichier.
 
WRInaute accro
webilyas a dit:
Je pense avoir trouvé la faille de sécurité, c'est ma base de donnée PhpMyAdmin en fait qui n'a pas été mise à jour depuis très longtemps. Je suis actuellement en version: 4.0.10.7, et la dernière version stable est : 4.5.0.2 :/ Je suis à 99 % sûr que c'est ça le problème.

J'en doute très fortement, parce que normalement :

1- ton phpmyadmin est sécurisé par ton hébergeur, à moins que tu sois sur un dédié
2- accéder à ton phpmyadmin implique d'avoir sa localisation sur le serveur et les mots de passe, ce qui se fait par le site
3- de très nombreux phpmyadmin sont anciens, sans aucun problème de sécurité

ce qui ne veut pas dire, bien entendu, que le contenu de la base n'a pas été modifié... mais via ton cms, pas via phpmyadmin, sauf installation perso avec faille de sécurité flagrante :)
 
WRInaute passionné
Quelle version PHP, MySQL ?
Quelle version de WP ?
Ton mot de passe était un peu chiadé ? Autre chose qu'un mot de passe du style 123456 !
 
WRInaute impliqué
Si c'est un wordpress (d'ailleurs tu ne le dis pas ???), une recherche d'une fonction ressemblant à eval(base64_decode... avec derrière toute une suite de chiffres et de lettres peut te donner une indication.

Cela infecte la base de données de manière récurrente.

Je pense avoir trouvé la faille de sécurité, c'est ma base de donnée PhpMyAdmin en fait qui n'a pas été mise à jour depuis très longtemps. Je suis actuellement en version: 4.0.10.7, et la dernière version stable est : 4.5.0.2 :/ Je suis à 99 % sûr que c'est ça le problème.

La version de PHPMYADMIN n'a strictement rien à voir dans ton problème. Evites de dire que tu penses à 99% que tu sais avant de faire une chose surtout quand t'es très loin...
Dans ce cas, c'est plutôt un problème de version de wordpress (si encore c'est un worpdress...)

C'est étrange car quand je suis en version intégrale, les liens n'apparaissent pas sur le site.
Souvent les hackers s'arrangent pour encapsuler les liens dans des DIV avec un style du genre "position:absolute;top:-1000px" ce qui sort la div de l'écran mais elle est bien présente pour le moteur de recherche.
 
WRInaute impliqué
probablement un thème ou plugin de wordpress pas à jour, voir wordpress pas à jour.
Faut Tout réinstall et vérifier manuellement chaque fichier que tu voudrais réutiliser, des backdoors peuvent se cacher sous plein de façons différentes voire quasiment anodines.
 
WRInaute accro
Je n'irai pas jusque-là. Pour cleaner, la recherche de eval(base64_decode dans le code source suffit très souvent. Reste à identifier la faille (déjà en désactivant tous les plugins non maintenus, ou plus utilisés, ça permet de faire du ménage, idem pour tous les thèmes qui ne servent pas).
 
WRInaute impliqué
des backdoors n'ont pas besoin de eval ou base64 pour fonctionner.
je me suis déjà fait hacker et y'avait plein de backdoors, certains avec eval, mais d'autres non.
Il existe une tonne de façons d'éxécuter du code malveillant à distance autre que eval
 
WRInaute impliqué
madri2 a dit:
des backdoors n'ont pas besoin de eval ou base64 pour fonctionner.
je me suis déjà fait hacker et y'avait plein de backdoors, certains avec eval, mais d'autres non.
Il existe une tonne de façons d'éxécuter du code malveillant à distance autre que eval

C'est vrai, mais une première recherche sur eval, base64... peut s'avérer positive. A partir de ce moment, enlever ce code malveillant, mettre à jour Wordpress sur la dernière version pour éviter les failles, enlever les thèmes inutilisés, mettre à jour les plugins, changer ses codes d'accès et nettoyer sa base de données peut suffire à éradiquer le souci sans pour autant tout repartir de 0.
De toute façon, tu le vois très vite derrière, ta base de données étant de nouveau infectée très rapidement...
 
WRInaute accro
Si c'est un wordpress il y a des outils très efficaces, y compris pour vérifier par rapport aux originaux, mais comme on ne sait pas ce que c'est...
 
WRInaute impliqué
Marie-Aude a dit:
Si c'est un wordpress il y a des outils très efficaces, y compris pour vérifier par rapport aux originaux, mais comme on ne sait pas ce que c'est...

C'est effectivement tout le problème depuis le début :)
 
WRInaute discret
bon je remet les choses en place. OUI c'est un CMS WP dernière version et mes plugins sont à jour à part les thèmes par défaut de WP.
 
WRInaute discret
@zeb

merci de ton aide mais je ne comprends en rien de ton truc qui est assez compliqué pour moi :/ tu n'as pas une autre méthode pour identifier le virus et trouver son emplacement ? (une méthode simple stp merci)
 
WRInaute discret
madri2 a dit:
probablement un thème ou plugin de wordpress pas à jour, voir wordpress pas à jour.
Faut Tout réinstall et vérifier manuellement chaque fichier que tu voudrais réutiliser, des backdoors peuvent se cacher sous plein de façons différentes voire quasiment anodines.

c'est un WP à jour. désolé de ne pas l'avoir précisé dans le post. ça m'a échappé..
 
WRInaute discret
spout a dit:
C'est un WP.
Ça peut être n'importe lequel, il faut rechercher dans les fichiers avec grep ou N++ ou demander à ton développeur.

c'est moi le développeur du site. j'ai analysé le code de mes pages web aucune trace!
 
WRInaute accro
Le fait que tes plugins sont à jour est une chose, mais sont-ils maintenus ? Si tu as été hacké, il y a une faille (et tu t'es certainement fait véroler plusieurs pages). Donc il faut creuser, passer en revue ton template, les autres templates présents sur le serveur, les plugins les plus anciens, etc. Voire le core.
 
WRInaute impliqué
qu'est ce qui empêche un malware d'automatiquement modifier le code de wordfence une fois installé pour désactiver toute détection de malware ?
 
WRInaute passionné
Encore un qui a installé un plugin WP douteux...ah comme je suis content d'avoir mon propre CMS fais maison...Ceci dit je me suis déjà fait hacker mon mot de passe sur un mutu il y a bien longtemps de çà...C'est assez impressionnant le nombre de scan que mon serveur reçoit pour rechercher les failles WP, joolma, etc...

vérifie tes plugins douteux. ou dans le doute vire tes plugins douteux...
 
Discussions similaires
Haut