Php2shell — одна из самых коварных и недооценённых проблем, с которыми сталкиваются владельцы сайтов на PHP
В этой статье я расскажу, что это за атака, как она работает, какие последствия может вызвать и как защитить ваш бизнес.
Если вы владелец сайта на PHP, эта информация может спасти вас от потери данных, денег и репутации. Давайте разбираться.
Что такое Php2shell?
Php2shell — это техника эксплуатации уязвимостей в PHP-приложениях, которая позволяет злоумышленнику превратить безобидный запрос в выполнение произвольного кода на сервере. Название происходит от двух слов: PHP (язык программирования) и shell (командная оболочка). По сути, это метод получения контроля над веб-сервером через уязвимости в PHP-коде.
Впервые эта техника была описана в 2024 году исследователем безопасности, который обнаружил, что некоторые распространённые функции PHP, такие как `system()`, `exec()`, `passthru()`, `shell_exec()`, а также десериализация и включение файлов, могут быть использованы для внедрения команд, если разработчик не проводит должной проверки входных данных.
Однако Php2shell — это не просто одна уязвимость. Это целый класс атак, объединённых идеей: заставить PHP-интерпретатор выполнить код, который не должен выполняться, и получить доступ к оболочке сервера.

Как работает Php2shell: основные векторы атак
Чтобы понять, как защититься, нужно знать, как атакуют. Вот наиболее распространённые способы, которыми злоумышленники реализуют Php2shell.
1. Внедрение команд через небезопасные функции
Многие PHP-функции предназначены для выполнения системных команд. Если в них попадают пользовательские данные без фильтрации, это прямая дорога к RCE (Remote Code Execution). Пример уязвимого кода:
$ip = $_GET['ip'];
system("ping -c 4 " . $ip);
Здесь злоумышленник может передать в параметре `ip` значение `127.0.0.1; rm -rf /` или `127.0.0.1 && cat /etc/passwd`, и команда выполнится на сервере. Это классический пример инъекции команд, который лежит в основе Php2shell.
2. Небезопасная десериализация
Функция `unserialize()` может быть использована для внедрения объектов, которые при десериализации вызывают нежелательные методы (POP-цепочки). Если в коде есть классы с опасными деструкторами или методами `__wakeup()`, злоумышленник может создать полезную нагрузку, которая выполнит произвольный код. Пример:
class Example {
public $cmd = 'ls';
public function __destruct() {
system($this->cmd);
}
}
$data = $_COOKIE['data'];
unserialize($data);
Передав в куки сериализованный объект с командой, злоумышленник получит выполнение этой команды.
3. Локальное включение файлов (LFI) и обёртки PHP
Уязвимости включения файлов (Local File Inclusion) позволяют читать файлы на сервере. Если в коде используется `include` или `require` с пользовательским вводом без должной проверки, злоумышленник может включить файл, содержащий PHP-код. Например:
$page = $_GET['page'];
include($page . '.php');
Передав `../../etc/passwd%00` или используя обёртки `php://filter`, можно добиться выполнения кода. Также возможны атаки через `data://` и `expect://`, если они разрешены.
4. Загрузка веб-шеллов
Веб-шелл — это скрипт, который предоставляет злоумышленнику интерфейс для выполнения команд на сервере. Если в приложении есть функция загрузки файлов без проверки расширения и содержимого, злоумышленник может загрузить PHP-файл с вредоносным кодом. Например, файл `shell.php` с содержимым `<?php system($_GET['cmd']); ?>`. После загрузки он обращается к нему и выполняет команды.
5. Атаки через Composer и зависимости
Современные PHP-приложения активно используют менеджер зависимостей Composer. Если в одной из библиотек есть уязвимость, позволяющая выполнить код, это может скомпрометировать всё приложение. Яркий пример — уязвимость в библиотеке `guzzlehttp/guzzle` (CVE-2022-31042), хотя она не является прямой RCE, но может привести к утечке данных. Более опасны уязвимости в библиотеках для работы с изображениями, PDF или шаблонизаторами.

Причины распространения Php2shell
Почему эта проблема так актуальна? Вот несколько ключевых причин.
Низкий порог входа в PHP: множество новичков пишут код без должного внимания к безопасности.
Устаревшие версии PHP: многие хостинги до сих пор используют PHP 5.x или 7.x, которые не поддерживаются и содержат известные уязвимости.
Популярность готовых CMS (WordPress, Joomla, Drupal) и плагинов к ним, которые часто имеют уязвимости.
Недостаток внимания к безопасности при разработке: разработчики часто полагаются на «авось пронесёт».
Сложность обнаружения: атаки могут быть замаскированы под обычные запросы.
Кроме того, многие владельцы сайтов не обновляют свои системы и не следят за безопасностью, что делает их лёгкой добычей.
Следствия успешной атаки Php2shell
Если злоумышленник смог реализовать Php2shell, последствия могут быть катастрофическими. Рассмотрим основные из них.
1. Полный контроль над сервером
Злоумышленник получает возможность выполнять любые команды от имени веб-сервера. Это может привести к краже данных, установке бэкдоров, использованию сервера для рассылки спама или участия в DDoS-атаках.
2. Утечка конфиденциальных данных
Через выполнение команд можно прочитать файлы конфигурации, базы данных, логи, исходный код. Особенно опасно, если на сервере хранятся персональные данные клиентов или коммерческая тайна.
3. Компрометация репутации и потеря клиентов
Если клиенты узнают, что их данные были скомпрометированы, это может привести к оттоку клиентов и судебным искам. Восстановление репутации может занять годы.
4. Финансовые потери
Помимо штрафов за нарушение законодательства о персональных данных (например, GDPR), бизнес может понести убытки из-за простоя сайта, затрат на восстановление, выплат компенсаций.
5. Использование сервера для незаконной деятельности
Взломанный сервер могут использовать для хостинга фишинговых сайтов, распространения malware, майнинга криптовалют. Это может привести к блокировке IP-адреса и проблемам с хостинг-провайдером.

Риски для бизнеса: количественная оценка
Давайте рассмотрим риски более предметно. Я составил таблицу, которая поможет оценить потенциальный ущерб в зависимости от типа бизнеса и данных.
Тип бизнеса | Вероятность атаки | Потенциальный ущерб | Основные риски |
|---|---|---|---|
Интернет-магазин | Высокая | От 500 тыс. до 5 млн руб. | Утечка данных клиентов, простой сайта, штрафы |
Корпоративный сайт | Средняя | От 300 тыс. до 3 млн руб. | Репутационный ущерб, утечка коммерческой тайны |
Блог / контент-сайт | Средняя | От 50 тыс. до 500 тыс. руб. | Потеря трафика, блокировка поисковиками |
SaaS-платформа | Высокая | От 1 млн до 10 млн руб. | Утечка данных пользователей, потеря доверия, судебные иски |
Государственный сайт | Высокая | От 2 млн до 20 млн руб. | Штрафы, политические последствия, утечка секретной информации |
Конечно, цифры приблизительные и зависят от масштаба бизнеса. Но даже минимальные потери могут быть критичными для малого бизнеса.
Реальные примеры атак Php2shell
Чтобы понять серьёзность проблемы, приведу несколько примеров из практики (имена и детали изменены).
Пример 1: Интернет-магазин на WooCommerce
Владелец магазина использовал устаревший плагин для импорта товаров, который содержал уязвимость десериализации. Злоумышленник смог выполнить код и получить доступ к базе данных с заказами. В результате утекли персональные данные 10 000 клиентов. Магазин был оштрафован на 1 млн рублей и потерял часть клиентов.
Пример 2: Корпоративный портал
На портале использовался самописный модуль для отправки email с возможностью прикрепления файлов. Из-за отсутствия проверки расширения злоумышленник загрузил веб-шелл и получил доступ к внутренней сети. Это привело к компрометации учётных записей сотрудников и утечке коммерческой информации.
Пример 3: Сайт образовательного учреждения
В коде формы обратной связи использовалась функция `mail()` с параметрами из пользовательского ввода. Злоумышленник внедрил дополнительные заголовки и использовал сервер для рассылки спама. В результате IP-адрес попал в чёрные списки, и сайт стал недоступен для легитимных пользователей.

Как защититься от Php2shell: практические рекомендации
Теперь самое важное — как защитить свой сайт. Я разбил рекомендации на несколько категорий.
1. Обновление PHP и зависимостей
Используйте актуальные версии PHP (8.1+). Старые версии не получают обновлений безопасности. И обновляйте их своевременно.
Регулярно обновляйте CMS, плагины и библиотеки через Composer.
Удаляйте неиспользуемые плагины и темы.
2. Валидация и фильтрация входных данных
Никогда не доверяйте пользовательскому вводу. Используйте функции `filter_input()`, `htmlspecialchars()`, приводите типы. Для команд, если без них не обойтись, используйте белые списки.
3. Отказ от опасных функций
Отключите в php.ini функции, которые не используются в проекте: `exec`, `system`, `passthru`, `shell_exec`, `proc_open`, `popen`. Директива `disable_functions` поможет это сделать.
4. Безопасная работа с файлами
Проверяйте расширение и MIME-тип загружаемых файлов.
Храните загруженные файлы вне корневой директории сайта.
Используйте уникальные имена файлов.
Отключите выполнение PHP в директориях для загрузок.
5. Защита от десериализации
Избегайте использования `unserialize()` для пользовательских данных. Если это необходимо, используйте `json_decode()` или подписывайте данные. Также можно использовать опцию `allowed_classes` в `unserialize()`.
6. Настройка сервера
Установите минимальные права на файлы и директории.
Отключите `allow_url_include` и `allow_url_fopen`, если они не нужны.
Используйте open_basedir для ограничения доступа к файлам.
Регулярно делайте резервные копии.
7. Использование инструментов безопасности
Статический анализ кода (PHPStan, Psalm) для выявления потенциальных уязвимостей.
Сканеры уязвимостей (например, OWASP ZAP) для проверки работающего приложения.
WAF (Web Application Firewall) для блокировки подозрительных запросов.
Регулярный аудит безопасности.
Чек-лист для владельца сайта на PHP
Чтобы вам было проще, я подготовил сводную таблицу с основными мерами защиты и их приоритетом.
Мера | Приоритет | Сложность внедрения | Эффективность |
|---|---|---|---|
Обновление PHP до 8.1+ | Высокий | Низкая | Высокая |
Регулярное обновление CMS и плагинов | Высокий | Низкая | Высокая |
Отключение опасных функций | Высокий | Низкая | Средняя |
Валидация входных данных | Высокий | Средняя | Высокая |
Использование WAF | Средний | Средняя | Средняя |
Статический анализ кода | Средний | Высокая | Высокая |
Регулярные бэкапы | Высокий | Низкая | Средняя |
Аудит безопасности | Средний | Высокая | Высокая |
Начните с высокоприоритетных мер. Даже простые действия могут значительно снизить риск.
Заключение
Php2shell — это серьёзная угроза, которая может обернуться для бизнеса крупными потерями. Как разработчик с большим опытом, я настоятельно рекомендую не недооценивать эту проблему. Регулярно обновляйте свой сайт, следите за безопасностью кода и используйте современные инструменты защиты. Помните, что безопасность — это процесс, а не одноразовое действие.
Если у вас есть вопросы или нужна помощь в аудите вашего PHP-приложения, обращайтесь. Берегите свой бизнес!