Votre site PHP est-il fiable et à l’abri des hackers ?

Protéger votre site PHP

Les CMS (Content Management System) sont utilisés par des milliers de personnes pour créer rapidement et facilement des sites, des blogs et toute sorte de forums.

Les plus connus sont WordPress, PhpBB, Joomla, IPBoard et s’ils ont l’avantage d’être suivi par une large communauté d’utilisateurs, ils s’avèrent être des proies facile pour des internautes mal intentionné: les hackers.

En effet, les nombreux plugins disponibles sont autant de portes d’entrées pouvant être utilisées par les pirates pour s’introduire sur votre site ou votre serveur et y corrompre des données.

Récemment mes serveurs ont subis des attaques et un forum utilisant PHPBB a été la faille qui a permis aux hackers de prendre le contrôle d’une partie du serveur et de compromettre des données.

Je vous propose donc plusieurs méthodes afin de savoir si votre site PHP est susceptible d’avoir été piraté et compromis.

Comment un site PHP peut-il être piraté ?

C’est la première question que l’on se pose… une fois que l’on s’est fait piraté 🙂

Il faut savoir que la majorité des hacks sont dus à une erreur DE VOTRE PART.
En effet, les pirates utilisent des failles de programmation telles que les Remote File Inclusion (RFI) afin d’avoir accès à votre contenu.

Et il ne faut pas croire qu’il est compliqué de trouver et d’utiliser une vulnérabilité. En effet, plusieurs sites recense les dernières failles trouvées sur un CMS, un moteur de blog et sur les milliers de plugins disponibles.

Lorsque j’étais jeune (et débile :-)), j’utilisais le fameux site milw0rm afin de trouver les dorks google et les dernier RFI disponibles. En quelques heures, on arrivait facilement à une dizaine de sites exploitables. Aujourd’hui il existe des dizaines de sites de ce genre.

Mais rassurez-vous (un peu): la plupart des intrusions et des pirates ne vous visent pas personnellement et utilisent des robots qui scannent des milliers des sites. Vous n’avez juste pas eu de bol :p

Les règles de bases pour protéger votre site

Tout d’abord, vos mots de passe et identifiants doivent être uniques, complexes et vous ne devez jamais les divulguer.

Ensuite, il faut installer uniquement des cms et des plugins qui sont suivis et dont les mises à jour sont fréquentes. En programmation, on a une règle simple: plus un code est vieux et moins il est performant et sécurisé.

Il est également possible d’utiliser votre hébergeur pour détecter une anomalie:

  • envoi d’emails spam
  • trafic anormal
  • consommation CPU et mémoire atypique
  • espace disque faible

Personnellement l’hébergeur de mon forum m’a envoyé un email suite à la détection d’un envoi massif de spam. Il a donc immédiatement bloqué le port SMTP sur le serveur et c’est ce qui m’a permis de trouver les fichiers malveillants sur ma machine.

Des outils tel que Google Webmaster scanne régulièrement votre site et vous alerte si un code malicieux est détecté. C’est totalement gratuit et très utile car il vous donne des informations concernant le malware détecté.

Enfin, il faut sauvegarder régulièrement vos fichiers et votre base de données afin de pouvoir revenir à un état stable rapidement.

Malgré toutes ces mesures préventives, votre site peut se faire pirater. Voyons comment déceler une attaque ou une intrusion.

Vérifier les fichiers de log

Il est primordial de vérifier le plus souvent possible les fichiers de logs de votre serveur Web (Apache, IIS, …), de votre serveur FTP et de votre serveur d’emails. Les fichiers de logs systèmes sont également intéressants.

Vous pourrez ainsi détecter rapidement une activité suspecte:

  • requêtes sur des pages inexistantes
  • envoi massif d’emails
  • tentative de connexions sur votre FTP avec des logins bizarres
  • tentative d’écriture de fichiers dans des répertoires en droit 777

Dans les fichiers de logs de votre serveur Web, il ne faut pas négliger les requêtes de type POST. En effet, les hackers les utilisent fréquemment car on n’y fait moins attention et car certaines configurations ne loguent que les requêtes GET.

Trouver les fichiers PHP modifiés

La première chose à faire est de trouver les fichiers PHP qui ont été récemment modifiés. En effet, il est rare qu’on modifie les fichiers PHP et il y a donc de fortes chances qu’il s’agisse de modifications non désirées.

La commande suivante permet de trouver tous les fichiers dont l’extension est “.php” et qui ont été modifiés dans les 7 derniers jours:

find . -type f -name '*.php' -mtime -7

Trouver du code PHP malicieux

J’utilise plusieurs commandes qui me permettent de déceler du code potentiellement dangereux dans mes fichiers PHP.

Il faut savoir que la plupart du temps, les pirates utilisent du code obfusqué (crypté) afin de rendre leur détection plus compliquée.

Tout d’abord, je cherche les fichiers contenant les commandes eval, base64_decode, gzinflate ou bien str_rot13. En effet, ces commandes sont souvent utilisées par les pirates pour crypter leur code, le rendant alors moins facilement identifiable.

find . -type f -name '*.php' | xargs grep -l "eval *(" --color find . -type f -name '*.php' | xargs grep -l "base64_decode *(" --color find . -type f -name '*.php' | xargs grep -l "gzinflate *(" --color

Il est possible d’étendre la recherche à d’autres fonctions fréquemment utilisées dans les scripts malwares. L’exemple suivant utilise la commande egrep afin d’utiliser des expressions régulières dans le pattern de recherche.

find . -type f -name '*.php' | xargs egrep -i "(mail|fsockopen|pfsockopen|stream_socket_client|exec|system|passthru|eval|base64_decode) *\("

Vous pouvez également chercher du code utilisant les fonctions preg_replace et base64 car elles sont utilisées pour le cryptage et l’évaluation de code:

find . -type f -name '*.php' | xargs egrep -i "preg_replace *\((['|\"])(.).*\2[a-z]*e[^\1]*\1 *," --color
 
find . -type f -name '*.php' | xargs grep base64_ | less find . -type f -name '*.php' | xargs grep base64_ > results.txt

Enfin, vous pouvez chercher du code hexadécimal comment la moustache fermante “}” (code: x29) ou le point virgule “;” (code x3B)

find . -type f -name '*.php' | xargs grep -il x29

Évidemment, chaque résultat doit être analysé et comparé avec le fichier original afin de savoir s’il a réellement été corrompu.

Avoir des sauvegardes

Il est primordial d’avoir des sauvegardes de votre site dans un état irréprochable. Je vous recommande ainsi de faire chaque semaine une semaine des fichiers de votre site et de la base de données.

Ensuite créez une copie de votre site en renommant le dossier en “site-ok”.

Vous pourrez alors utiliser la commande “diff” pour comparer le répertoire de backup et le répertoire de production:

diff -r site-ok/ site-ok/ -x excludefolder

Restreindre les droits d’écriture dans les répertoires

Il est primordial de maitriser les droits sur les répertoires et les fichiers.

Le script “find777.sh” suivant vous permet de trouver facilement les répertoires qui sont en 777, c’est a dire qui sont en écriture libre.

#!/bin/bash
 
search_dir=$(pwd)
writable_dirs=$(find $search_dir -type d -perm 0777)
 
for dir in $writable_dirs
do
#echo $dir
find $dir -type f -name '*.php'
done

Pour exécuter le script suivant, veuillez lancer les commandes suivantes:

chmod +x find777.sh
./find777.sh

Il faut contrôler au maximum les droits et surtout limiter les répertoires en 777 qui autorisent d’écrire, de modifier et de créer des fichiers.

Il peut également être pratique de rechercher un fichier php grâce à la commande:

find yoursite/uploads -type f | xargs grep -i php

ou

find yoursite/uploads -type f -iname '*.jpg' | xargs grep -i php

Cette seconde commande permet de trouver des fichiers php qui porte une extension .jpg. Cette méthode de renommage de fichier est couramment utilisée par les pirates pour rendre leurs scripts incognito.

Trouver les scripts dangereux cachés

Les pirates sont de plus en plus inventifs et ils cachent de mieux en mieux leurs scripts.

Vous pouvez donc consulter le code source générés de vos pages (via Chrome ou Firefox en utilisant la touche F12) et chercher les mots clés “iframe” ou “eval”.

La console de debugging de Chrome est une aide précieuse pour trouver des anomalies sur votre site:

  • requetes non désirées vers un site tiers (qui permet de trouver des iframes, de l’ajax injection, …)
  • code javascript malveillant
  • plugins suspects

Vérifier votre base de données

Les pirates sont malins: ils stockent également du code malveillant dans votre base de données. C’est principalement le cas si vous utilisez des plugins de CMS ou forums tels que WordPress ou vBulletin.

Il est assez difficile de trouver ces injections mais cela reste possible en utilisant l’interface de votre PHPMyAdmin et en cliquant sur le bouton “Search”.

Vous pourrez alors chercher les chaines %base64_% and %eval(% pour analyser le contenu de votre base de données.

PETITE ASTUCE: si votre base de données est volumineuse, je vous recommande de sauvegarder (dumper) votre base de données et de la réimporter sur votre pc, çà évitera de surcharger ou de crasher votre serveur de production.

Nettoyer votre fichier .htaccess

Si votre serveur Web est Apache, il peut être intéressant de vérifier que le fichier .htaccess n’a pas été corrompu.

En effet, les fonctions auto_append_file et auto_prepend_file insère des fichiers (php ou autre) au début ou à la fin de toutes les pages.

Vous pouvez utiliser les commandes suivantes pour trouver les utilisations de ces 2 fonctions:

find . -type f -name '\.htaccess' | xargs grep -i auto_prepend_file;
find . -type f -name '\.htaccess' | xargs grep -i auto_append_file;

La commande suivante peut également être utilisée afin de trouver des redirections indésirables vers d’autres sites:

find . -type f -name '\.htaccess' | xargs grep -i http;

Pas facile de protéger son site web

Il n’est pas simple de protéger son site internet: les pirates sont de plus en plus malins et de nouvelles failles apparaissent chaque jour.

L’utilisation de CMS et des milliers de plugins disponibles sont autant de failles exploitables par les hackers.

Le plus important est de faire des sauvegardes régulières afin de pouvoir redémarrer rapidement votre site après une attaque.

Leave a Reply

Your email address will not be published. Required fields are marked *