Безопасность PHP: Почему использование функции unserialize() с пользовательскими данными может привести к удаленному выполнению кода (RCE)?

Функция `unserialize()` в PHP восстанавливает объект или структуру данных из сериализованной строки. Именно это делает её крайне опасной при использовании с непроверенными пользовательскими данными.

## Как работает уязвимость

Когда PHP десериализует объект, он автоматически вызывает магические методы класса — прежде всего `__wakeup()` и `__destruct()`. Если в кодовой базе приложения существуют классы с такими методами, выполняющими потенциально опасные операции (запись файлов, выполнение команд, SQL-запросы), злоумышленник может сконструировать вредоносную сериализованную строку и передать её серверу.

## Механизм атаки — PHP Object Injection

Атака называется **PHP Object Injection** и работает следующим образом:

1. Злоумышленник изучает исходный код приложения (или его зависимости) и находит классы с опасными магическими методами — так называемые **«гаджеты» (gadgets)**.
2. Создаётся цепочка гаджетов (gadget chain), где один объект при уничтожении вызывает метод другого, и в итоге выполняется произвольный код.
3. Злоумышленник сериализует вредоносный объект и передаёт его через cookie, POST-параметр, заголовок HTTP или любой другой входной канал.
4. Сервер вызывает `unserialize()`, PHP восстанавливает объект и автоматически запускает магические методы — происходит **Remote Code Execution**.

## Пример опасного кода

php
class FileManager {
public $filename;
public function __destruct() {
unlink($this->filename); // удаление файла при уничтожении объекта
}
}

$data = unserialize($_COOKIE[‘user_data’]); // ОПАСНО!

Передав в cookie строку `O:11:»FileManager»:1:{s:8:»filename»;s:9:»/etc/passwd»;}`, атакующий заставит сервер удалить системный файл.

## Популярные векторы атак

— **Популярные фреймворки и библиотеки** (Laravel, Symfony, Zend) содержат классы с магическими методами, которые при умелой комбинации образуют готовые цепочки гаджетов. Инструмент **PHPGGC** содержит сотни таких цепочек.
— **Cookies и сессии** — частые точки входа для сериализованных данных.
— **API-параметры** и скрытые поля форм.

## Как защититься

1. **Никогда не передавайте пользовательские данные в `unserialize()`** — это главное правило.
2. Используйте **JSON** (`json_encode` / `json_decode`) вместо сериализации объектов — JSON не восстанавливает объекты PHP.
3. Если десериализация необходима, используйте параметр `allowed_classes` в PHP 7+: `unserialize($data, [‘allowed_classes’ => false])`.
4. Подписывайте сериализованные данные криптографической подписью (HMAC) и проверяйте её перед десериализацией.
5. Применяйте **WAF** и мониторинг для обнаружения подозрительных сериализованных строк.
6. Регулярно обновляйте зависимости — многие уязвимые цепочки гаджетов закрываются в новых версиях библиотек.

Уязвимость `unserialize()` входит в **OWASP Top 10** (категория A8: Insecure Deserialization) и является одной из наиболее критичных в экосистеме PHP.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.