Онлайн-проверка уязвимостей PHP2Shell

Введите URL своего сайта или сайта, который вам разрешено тестировать. Изучите признаки PHP, версии и ответы на формы, чтобы оценить риски PHP2Shell и определить дальнейшие меры.

2

Уязвимости ядра PHP

9.2

Оценка CVSS v4.0 (критическая)

4

Исправленные основные ветки 8.2–8.5

Обзор уязвимостей

Что такое PHP2Shell и почему нужна срочная проверка?

PHP2Shell объединяет две уязвимости безопасности памяти ядра PHP: CVE-2026-109618 и CVE-2026-109619, обе с оценкой CVSS v4.0 9.2. Они могут позволить удалённое выполнение кода без аутентификации; последствия зависят от версии, развёртывания и пути атаки.

Официальное уведомление PHP

Проблема в самом PHP, а не только в приложении

Проверьте PHP-FPM, Apache mod_php, php-cgi, FrankenPHP, LiteSpeed и другие PHP-среды, обслуживающие веб-запросы. По данным PHP, mod_php несёт наибольший риск: атака продемонстрирована до запуска кода приложения. Простые страницы и безопасный код не исключают угрозу.

Проверяйте среду PHP вместе с ПО сайта

Обновление WordPress, Drupal, фреймворка или плагина не обязательно обновляет PHP. Проверьте версию для каждого сайта, пулы FPM, образы контейнеров, узлы и PHP, встроенный в панели или устройства. Официальные исправленные версии выпущены 21 октября 2026 года.

Что проверяется

Признаки PHP, ответы на запросы и состояние исправлений

Как семь запросов помогают проверке?

Сначала выполните базовый GET, затем отправьте URL-кодированную и multipart-форму для каждого из трёх методов. Изучайте каждый ответ до следующего запроса. Обычные запросы сравнивают поведение без нагрузок для выполнения кода или исчерпания памяти.

Семь HTTP-запросов для проверки PHP2Shell
Порядок Метод Содержимое запроса На что обратить внимание
01GETБез тела запросаДоступность, перенаправления, открытая версия PHP и заголовки ответа.
02POSTapplication/x-www-form-urlencodedОдно обычное текстовое поле как контроль для POST.
03POSTmultipart/form-dataОдно текстовое поле для сравнения с контрольным POST, без файлов и полей прогресса загрузки.
04PUTapplication/x-www-form-urlencodedОдно обычное текстовое поле для наблюдения за обработкой PUT по этому пути.
05PUTmultipart/form-dataСравните с URL-кодированным PUT, чтобы выявить различия из-за типа содержимого.
06PATCHapplication/x-www-form-urlencodedОдно обычное текстовое поле как контроль для PATCH.
07PATCHmultipart/form-dataСравните с контрольным PATCH, не делая выводов обо всех методах только по POST.

Указания PHP в X-Powered-By или Server и cookies вроде PHPSESSID — лишь признаки среды. Они могут быть скрыты, изменены или настроены произвольно. Cookie также не доказывает, что PHP разобрал тело запроса.

Проверки охватывают только указанный URL и путь. Другие маршруты, правила CDN и доступные напрямую серверы могут вести себя иначе. Не переносите результат главной страницы на весь сайт. Проверяйте только разрешённые пути, подходящие для запросов форм.

Как понимать результаты

Отличайте признаки риска от подтверждённых исправлений

Публичные ответы дают лишь часть данных. Версии могут быть скрыты или изменены, а старые сборки могут содержать бэкпорты. Проверяйте фактическую среду и не принимайте недостаток данных за безопасность.

Типичные ошибки оценки

Обнаружен признак исправленной версии

Открытая версия не ниже порога исправления своей ветки — полезный признак, но прокси может менять заголовки. Убедитесь на сервере, что все экземпляры загрузили исправленный код.

Обнаружен риск старой версии

В первую очередь проверяйте версии ниже официального порога, учитывая бэкпорты дистрибутива или LTS-поставщика. Если их статус неизвестен, отмечайте необходимость проверки, а не подтверждённое удалённое выполнение кода.

Запросы отклонены или ответы различаются

Успех контрольного запроса при multipart 4xx может указывать на ограничение типа содержимого. Два ответа 405 могут означать лишь неподдерживаемый метод. По одним кодам нельзя отличить отказ CDN, веб-сервера или приложения.

Нет признаков PHP или пригодного ответа

Скрытые версии, кэш прокси, нестандартные cookies, ошибки подключения и тайм-ауты ограничивают оценку. Отмечайте недостаток данных или невозможность оценки вместо зелёного заключения о безопасности.

Порядок проверки

Начните с URL и изучите данные

1

Введите целевой URL

Укажите адрес своего или разрешённого для тестирования сайта вместе с проверяемым путём.

2

Изучайте каждый ответ по мере получения

Начните с базового GET, затем по одному сравните ответы на URL-кодированные и multipart-запросы POST, PUT и PATCH.

3

Изучите результаты и рекомендации

Оцените коды состояния и признаки версии, затем сверьте исправления с фактической средой PHP и уведомлениями поставщика.

Проверка на сервере

Как убедиться, что сайт использует исправленный PHP?

Внешние проверки дают подсказки, но исправления нужно подтвердить на хосте, в контейнерах или панели хостинга. Зафиксируйте среду, источник пакета, исправленную версию и состояние процессов после обновления.

1. Найдите PHP, обрабатывающий запросы

Проверьте PHP сайта, модуль веб-сервера или пул FPM. Учтите параллельные версии, сайты, контейнеры и узлы балансировки. php -v показывает только текущую CLI-версию, которая может отличаться от веб-среды. Не публикуйте страницу phpinfo для этой проверки.

php -v

2. Сверьте полную версию пакета и уведомление

Узнайте версию установленного пакета и сравните её целиком с уведомлением дистрибутива. Пакет Ubuntu 24.04 8.3.6-0ubuntu0.24.04.13 уже исправлен; строка PHP 8.3.6 скрывает сведения о бэкпорте. Выберите подходящий пример и замените имя пакета.

dpkg-query -W php8.3-fpm
rpm -q php-fpm
Официальный список пакетов Ubuntu

3. Установите исправление для нужной ветки

Используйте исправленную основную версию, последующий выпуск безопасности той же ветки или подтверждённый бэкпорт. PHP в панелях, устройствах и контейнерах обновляйте через поставщиков. Для PHP 8.1 и старше обычная поддержка завершена: проверьте LTS-исправления или мигрируйте. Также предоставлены минимальные исходные бэкпорты для 7.4, 8.0 и 8.1.

4. Перезапустите и проверьте каждый экземпляр

Убедитесь в перезапуске PHP-FPM, Apache и других процессов, а также замене контейнеров и узлов. Обновлённые файлы на диске не гарантируют замену старых процессов. Необычные запросы, нехватка памяти и сбои помогают расследованию, но отсутствие этих записей не доказывает отсутствие воздействия.

Самопроверка: семь запросов curl из терминала

Скрипт поочерёдно отправляет один GET, затем URL-кодированные и multipart-формы методами POST, PUT и PATCH. Используются только текстовые поля, без файлов и полей прогресса загрузки. Запускайте его только на разрешённых путях для тестовых форм: обычный запрос тоже может запускать действия приложения.

Bash / curl
#!/usr/bin/env bash
# PHP2Shell HTTP observations: 7 sequential requests, no exploit payload.
set -u

URL="${1:-https://example.com/}"
case "$URL" in
  http://*|https://*) ;;
  *) printf 'ERROR=HTTP(S)_URL_REQUIRED\n' >&2; exit 2 ;;
esac

if ! command -v curl >/dev/null 2>&1 || ! command -v awk >/dev/null 2>&1; then
  printf 'ERROR=CURL_AND_AWK_REQUIRED\n' >&2
  exit 127
fi

probe() {
  printf '\n[%s/7] %s %s\n' "$1" "$2" "$3"
  local method="$2"
  shift 3
  curl -q --globoff --proto '=http,https' --silent --show-error \
    --connect-timeout 5 --max-time 15 --request "$method" \
    --dump-header - --output /dev/null \
    --write-out '\nHTTP_CODE=%{http_code} TOTAL_SECONDS=%{time_total}\n' \
    "$@" --url "$URL" |
  awk '{
    sub(/\r$/, "")
    line = tolower($0)
    if ($0 ~ /^HTTP\// || line ~ /^(server|x-powered-by|content-type):/ || $0 ~ /^HTTP_CODE=/) {
      print
    } else if (line ~ /^set-cookie:[ \t]*phpsessid[ \t]*=/) {
      print "PHPSESSID=present; value hidden"
    }
  }'
  local curl_status="${PIPESTATUS[0]}"
  if [ "$curl_status" -ne 0 ]; then
    printf 'CURL_EXIT=%s\n' "$curl_status"
    FAILED=1
  fi
}

FAILED=0
probe 1 GET baseline
probe 2 POST urlencoded --data-raw 'php2shell_check=1'
probe 3 POST multipart --form-string 'php2shell_check=1'
probe 4 PUT urlencoded --data-raw 'php2shell_check=1'
probe 5 PUT multipart --form-string 'php2shell_check=1'
probe 6 PATCH urlencoded --data-raw 'php2shell_check=1'
probe 7 PATCH multipart --form-string 'php2shell_check=1'
exit "$FAILED"

Используйте Bash в Linux/macOS либо WSL или Git Bash в Windows. Сохраните файл php2shell-self-check.sh и выполните команду ниже с разрешённым тестовым URL. Не вставляйте Bash-скрипт напрямую в PowerShell.

bash php2shell-self-check.sh https://example.com/test.php

Ожидание соединения ограничено 5 секундами, весь запрос — 15 секундами. Скрипт игнорирует личные настройки curl, проверяет TLS, не следует перенаправлениям и не повторяет запросы. При 3xx проверьте разрешение на конечный URL, затем запустите проверку для него. PHPSESSID отмечается только как присутствующий; значения cookie и тела ответов не выводятся.

HTTP_CODE — статус ответа, TOTAL_SECONDS — общее время. Ненулевой CURL_EXIT означает ошибку передачи; остальные проверки продолжаются. Ненулевой код завершения скрипта указывает на проблему входных данных, зависимостей или передачи. HTTP 4xx/5xx записываются штатно; код завершения не оценивает уязвимости и исправления.

Как читать вывод терминала

Заголовки версии дают лишь подсказки

Server или X-Powered-By могут быть скрыты или устареть. Проверьте PHP, который действительно обслуживает сайт: первые официально исправленные версии соответствующих веток — 8.2.35, 8.3.36, 8.4.27 и 8.5.12. Бэкпорты поставщика подтверждайте по полной версии пакета и уведомлению о безопасности.

Сравнивайте обе кодировки одного метода

Если для одного метода urlencoded возвращает 2xx или 3xx, а multipart — 403 или 406, это показывает лишь разницу ответов. Это не подтверждает блокировку WAF или отказ до передачи запроса в PHP.

Успешный ответ не доказывает разбор в PHP

Ответ 2xx или 3xx на multipart означает только получение успешного ответа или перенаправления. Он не доказывает, что тело достигло PHP и было разобрано, и не определяет наличие уязвимости.

405 и признаки PHP сами по себе не дают ответа

Одинаковые ответы 405 не доказывают исправление. Отсутствие признаков PHP не доказывает, что PHP не используется. Cookie PHPSESSID также не определяет, был ли разобран multipart и какой слой сформировал ответ.

Официальные исправленные версии и рекомендации по обновлению
Что дают временные меры до обновления?

PHP указывает, что полное исправление даёт только обновление. Настройки ниже уменьшают риск отдельных известных путей, но не делают неисправленную среду безопасной. Перед изменениями учтите требования приложения и официальные рекомендации.

  • Отключите session.upload_progress.enabled и перезапустите все рабочие процессы. Настройка должна действовать до разбора запроса через php.ini, пул FPM или конфигурацию сервера, а не ini_set() или .user.ini FPM. Блокируются только подтверждённые пути через session.
  • Для PHP 8.5 официальные рекомендации включают отключение fatal_error_backtraces и перезапуск процессов. Это перекрывает только подтверждённый путь fatal backtrace, но не другие варианты.
  • Проверьте ограничения размера тела, числа полей и multipart-частей на веб-сервере или прокси, а также доступность origin в обход CDN. Скрытие ошибок, блокировка одного метода или проверка одного пути не заменяют исправление.

Официальные исправленные версии

Проверьте пороги исправлений PHP 8.2–8.5

Сравнивайте версии в рамках одной ветки: порог 8.3 не определяет статус 8.4. Не считайте предварительные выпуски и неизвестные ветки исправленными. Проверяйте бэкпорты и собственные сборки по полной версии пакета, журналам сборки и уведомлениям поставщика.

Официальные рекомендации по обновлению

Используете BaoTa Panel? Обновите PHP через магазин ПО

Согласно уведомлению BaoTa от 2026-10-21, в панели доступны некоторые выпуски PHP с исправлениями безопасности. Актуальный список версий проверяйте в магазине ПО вашей панели.

Прочитать уведомление BaoTa об обновлении

Перед обновлением сохраните резервные копии сайта, баз данных и конфигурации и выберите подходящее время обслуживания.

  1. Найдите PHP, который использует сайт

    Войдите в BaoTa Panel, откройте Магазин ПО → Установлено, найдите версию PHP, которую использует сайт, и откройте её страницу управления.

  2. Установите выпуск с исправлениями для своей ветки

    Проверьте обновления на странице управления PHP и по инструкции установите указанный выше исправленный выпуск своей ветки или более поздний выпуск безопасности той же ветки.

  3. Перезапустите PHP и проверьте сайт

    После обновления перезапустите соответствующую службу PHP и убедитесь, что все рабочие процессы перезагружены. Проверьте фактическую версию PHP сайта, доступ к страницам, загрузку файлов, подключение к базе данных и другие функции.

Если установлено несколько версий PHP, проверьте каждую используемую версию. При установке другой версии также убедитесь, что сайт переключён на исправленную среду PHP.

Частые вопросы

Вопросы о проверке и исправлении PHP2Shell

Различайте признаки версии, коды состояния и бэкпорты, чтобы не переоценивать результаты.

Что такое PHP2Shell и какие сайты нужно проверить?

PHP2Shell — это две уязвимости ядра PHP, CVE-2026-109618 и CVE-2026-109619, допускающие удалённое выполнение кода без аутентификации. Проверьте все неисправленные PHP-среды для веб-запросов, даже если код приложения безопасен.

Доказывают ли ответы 403, 405 или 413 наличие защиты?

Нет. Эти коды могут возникать из-за аутентификации, неподдерживаемого метода, ограничения размера или прокси. Отказ multipart описывает только текущий путь и не доказывает исправление PHP или блокировку всех атак.

Означает ли отсутствие заголовков PHP, что сайт не затронут?

Не обязательно. Показ версии может быть отключён, а CDN, обратный прокси или статическая главная страница могут скрывать серверную технологию. Отсутствие признаков означает недостаток данных: проверьте реальную среду сервера.

Какие версии исправлены и всегда ли старые остаются без исправления?

Основные исправления доступны в PHP 8.2.35, 8.3.36, 8.4.27 и 8.5.12. Используйте исправленный или более поздний безопасный выпуск своей ветки. Старые версии могут иметь бэкпорты: сверяйте полную версию пакета с уведомлениями поставщика. Для PHP 8.1 и старше обычная поддержка завершена. После обновления перезапустите процессы.

Зачем проверять PUT и PATCH помимо POST?

Методы могут проходить разные маршруты и фильтры. Начиная с PHP 8.4 приложения могут использовать request_parse_body() для multipart не только в POST. Это не означает автоматический разбор PUT или PATCH всеми приложениями. По POST нельзя судить о защите других методов или путей.

Что означает POST 200, PUT/PATCH 405 без признаков PHP?

Отметьте среду PHP и исправления как неподтверждённые. POST 200 означает ответ, а 405 — отказ метода на некотором уровне. Так могут отвечать статические страницы, другие среды и PHP со скрытыми признаками. Проверьте среду на сервере, не объявляя безопасность или подтверждённую уязвимость.

Источники об уязвимостях и исправлениях проверены 2026-10-22. Внешние наблюдения ограничены; при принятии мер следуйте актуальным уведомлениям PHP и поставщиков.

Получите ясную картину рисков PHP2Shell

Проверяйте публичные ответы по одному, оценивайте данные и подтверждайте исправления в реальной среде сервера.

Подробнее о проверках