Imbutus
← Атака

php2shell: три цепочки БЕТА

Один бюллетень, три разные атаки. Разные цели, разные доказательства.

Результат принадлежит той цепочке, которая его дала. «php2shell работает» само по себе ничего не значит.

ЦепочкаНужноДоказывает
A — sink приложенияПараметр include, записываемая папка сессийКод от веб-пользователя, внутри приложения
B — движок, CVEmod_php prefork, один рабочий, display_errors, без патчаВывод команды на хосте (без sink)
C — доступность на FPMПул FPM, тело больше memory_limitТолько отказ, никогда доступ

Цепочка A — собственный sink приложения

Прогресс загрузки пишет файл; приложение его подключает. Без порчи памяти и без смещений.

  • Параметр include / LFI, который уже есть в приложении — найденный, не предположенный
  • Записываемая папка сессий
  • Тело больше memory_limit
  • Работает и на ЗАКРЫТОМ PHP — это не CVE 2026 года

php2shell lfi https://site/ --attempt --upload / --lfi "https://site/?page={page}"

Загруженный маркер выполняется от веб-пользователя. Находка принадлежит приложению — и исправление тоже.

Называть это «php2shell RCE» неверно: патч PHP его не останавливает.

Цепочка B — цепочка движка (CVE)

Нехватка памяти плюс устаревшее состояние запроса портят освобождённую память; поддельная HashTable с pDestructor = system() выполняет команду.

  • mod_php под Apache prefork, не FPM
  • Оба запроса должен обслужить один и тот же процесс: один рабочий или закрепление. Несколько рабочих — нормально
  • display_errors включён, memory_limit мал относительно тела, session.upload_progress включён, use_strict_mode выключен
  • Без патча 8.3 / 8.4 / 8.5 и сборка, под которую подходят смещения

php2shell-chain https://site/index.php --attempt -c "id>p.txt" --fetch /p.txt

PROOF: uid=33(www-data) — вывод команды, а перед ним утёкшие базы chunk и libphp.

Сначала идут две меньшие ступени: утечка 4096-байтной cookie и утечка libphp. Утечки без PROOF значат неверную раскладку, а не безопасный сайт.

Доказано на официальных сборках 8.3 / 8.4 / 8.5; сборка определяется перебором таблицы.

Цепочка C — доступность на FPM

Огромные поля формы вычерпывают пул; FPM завершает каждый рабочий с кодом 70 и поднимает новый.

  • PHP-FPM, любой размер пула
  • memory_limit ниже тела, без ограничения тела на периметре
  • N запросов вычерпывают пул из N

php-dos https://site/ --attempt --workers 20 --mb 12

Ошибки запросов и задержка. Шелла не будет, и доступом мы это не называем.

Честный ответ, когда цепочка B неприменима: отказ возможен, выполнение кода — нет.

Какую выберет запуск?

План решает в таком порядке:

  • Для цели записан sink → сначала A: секунды, без смещений, работает и на закрытом PHP
  • Sink нет, mod_php prefork, без патча → B
  • Sink нет, FPM → C, и отчёт только про доступность
  • Цепочка никогда не наследует результат другой

Не проверено или недоступно: раскладки утечек для PHP 5.4–8.2, display_errors=Off, Windows. Нет строки PROOF — значит не доказано, а не «безопасно».