Hardening PHP

L’hardening PHP se fait principalement dans le fichier de configuration php.ini. Dans ce fichier on retrouve un ensemble de directives qui vont nous permettre de sécuriser au mieux nos applications PHP. Pour les besoins de cet article j’ai créé une application volontairement vulnérable. Au programme une LFI :

1.png

Et un webshell :

2.png

Tout au long de cet article nous verrons comment empêcher l’exploitation de ces vulnérabilités sans pour autant toucher au code de l’application.

I/ Modifier la configuration PHP

Probablement l’une des premières choses à faire selon moi c’est de vérifier que PHP n’émet pas de bannières via les headers HTTP. Pour cela il faudra éditer le fichier :

/etc/php/7.x/apache2/php.ini

Et chercher la ligne :

expose_php

Si ce n’est pas le cas il faudra positionner la directive à Off.

Ensuite nous allons empêcher toute émission de messages d’erreurs. Nous sommes sur un environnement de production donc nous n’avons pas besoin de messages de debugging qui serait susceptible d’offrir de précieuses informations aux attaquants. Pour cela il faudra trouver les lignes display_errors et display_startup_errors et s’assurer qu’elles sont paramétrées de la sorte :

display_errors = Off
display_startup_errors = Off

Pour mitiger toutes les vulnérabilités de type RFI nous n’aurons besoin de modifier que deux paramètres. Ces deux paramètres sont allow_url_fopen et allow_url_include qui doivent être configurés avec ces valeurs :

allow_url_open = Off
allow_url_include = Off

Pour mitiger les vulnérabilités de type LFI il faudra modifier une troisième directive : openbasedir. Openbasedir est une sorte de chroot dans le sens où PHP cette directive indique à PHP dans quel répertoire il peut inclure des fichiers. Cette directive peut être constituée d’un seul répertoire autorisé ou de plusieurs espacés via le caractère « : ». Pour ma part je n’autorise l’inclusion de fichiers locaux que s’ils sont présents dans le répertoire /var/www/html :

open_basedire = "/var/www/html"

En reloadant la configuration d’Apache2 on remarque qu’il n’est plus possible d’inclure le fichier /etc/passwd :

3-1.png

Si votre application ne contient pas de formulaires d’upload de fichier alors vous pourrez désactiver cette fonction en paramétrant la directive file_upload à Off :

file_upload = Off

Si une fonctionnalité d’upload est présente alors il est vivement conseillé de limiter la taille des fichiers que l’on pourra uploader. Pour cela on pourra modifier ces directives en leur attribuant les valeurs suivantes :

file_upload = On
upload_max_filesize = 3M (dépendra de la taille des fichiers à uploader)

Enfin il pourra être judicieux de modifier le répertoire de stockage des fichiers uploadés en modifiant la directive :

upload_tmp_dir

Encore une fois tout dépendra de l’application hostée sur votre serveur.

En ce qui concerne les vulnérabilités liées à l’utilisation de fonctions dangereuses (system, exec etc…) la façon la plus simple de s’en débarrasser est de les désactiver. Pour cela on pourra modifier la directive disable_functions et y ajouter ces fonctions :

shell_exec,exec,system,pass_thru

Il ne sera ainsi plus possible d’exécuter de commandes :

4.png

Mais il ne faut pas s’arrêter là ! En effet de petits malins tels que pentestmonkey ont écrit des scripts PHP qui permettent d’obtenir des reverse shell sans passer par les fonctions system. Il est donc intéressant d’étudier ces scripts et de bloquer leurs fonctions phares. Suivant l’application que vous utilisez il sera possible de désactiver la fonction PHP fsockopen() utilisée pour ouvrir une socket.

Pour finir sur la configuration du fichier php.ini nous pourrons désactiver la directive register_globals :

register_globals = Off

Cette configuration, utilisée conjointement avec le module ModSecurity, devrait vous assurer un niveau de sécurité maximal 😉 !

2 commentaires

    1. Hello, j’ai prévu de faire une série sur nodejs mais un peu plus tard puisque pour le moment j’ai un énorme projet à finir. Au programme je présenterai le fonctionnement basique, comment le pentester et même comment l’utiliser dans des campagnes de malware 🙂 !

      J'aime

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s