Уязвимость десериализации в WordPress и защита сайта

Уязвимость deserialization, или небезопасной десериализации, возникает в тот момент, когда приложение превращает полученные извне данные обратно в объекты и автоматически запускает связанный с ними код. Для WordPress эта проблема особенно важна из-за экосистемы плагинов: расширение может использовать PHP-функцию unserialize(), собственные обработчики импорта или механизм хранения сложных параметров в базе данных.

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

Как работает небезопасная десериализация

Сериализация преобразует массив, объект или другое значение в строку, которую удобно сохранить в базе данных или передать между компонентами. PHP умеет восстанавливать такие структуры с помощью unserialize(). Во время восстановления объектов могут автоматически вызываться специальные методы: __wakeup(), __unserialize(), __destruct() и другие магические методы.

Атакующий обычно не создаёт новый вредоносный класс на сервере. Он использует классы, которые уже загружены WordPress, темой или плагинами. Если в одном классе есть опасное действие при уничтожении объекта, в другом — возможность изменить путь к файлу, а в третьем — выполнение произвольного вызова, эти элементы могут быть соединены в так называемую POP-цепочку.

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

Где появляется риск в WordPress

WordPress хранит многие настройки в таблице параметров в сериализованном виде. Это нормальная штатная практика, и наличие строк вроде a:... в базе данных не означает взлом. Опасность появляется, когда разработчик принимает аналогичные данные из формы, cookie, REST API, AJAX-запроса, URL или загружаемого файла и без строгой проверки отправляет их в unserialize().

Частый источник проблем — плагины с импортом и экспортом настроек, конструкторы страниц, интеграции с CRM, системы резервного копирования и расширения, обрабатывающие пользовательские профили. Вредоносное значение может попасть в сайт через уязвимый endpoint, украденную сессию администратора или другой уже скомпрометированный компонент.

Важно отличать уязвимость самого ядра от ошибки стороннего кода. Обновлённый WordPress не компенсирует небезопасную обработку данных в старом плагине. При проверке интеграций оценивайте весь путь данных: от HTTP-запроса до функции, которая сохраняет или восстанавливает объект. Если сайт взаимодействует с внешними платформами, включая инструменты представлений SharePoint, проверяйте авторизацию, формат обмена и правила обработки импортируемых значений.

Чем десериализация отличается от других атак

SQL-инъекция изменяет структуру SQL-запроса, а межсайтовый скриптинг пытается внедрить код в страницу, которую увидит браузер. При небезопасной десериализации вредоносная логика часто активируется на сервере в момент восстановления объекта или его последующего уничтожения. Это делает атаку менее заметной для пользователя и потенциально более серьёзной.

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

Nonce WordPress защищает запросы от подделки, однако не заменяет проверку типа и содержимого данных. Проверка capability ограничивает круг пользователей, но не устраняет дефект, если скомпрометированный администратор или уязвимый endpoint уже может передать опасное значение. Защита должна строиться на нескольких уровнях: безопасный формат, контроль доступа, обновления и мониторинг.

Как разработчику закрыть уязвимость

Лучший вариант — отказаться от PHP-сериализации для данных, которые могут поступить от пользователя. Для простых структур подойдут JSON, массивы с явной схемой или отдельные поля базы данных. JSON не запускает магические методы PHP-объектов, хотя его содержимое всё равно необходимо проверять по типам, длине и допустимым значениям.

Если десериализация неизбежна, в PHP следует использовать ограничение классов:

$value = unserialize($input, ['allowed_classes' => false]);

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

В коде плагина стоит разделять данные, пришедшие от пользователя, и внутренние значения, сформированные самим приложением. Нужно применять строгую валидацию схемы, ограничивать размер запроса, проверять права через current_user_can(), использовать nonce для административных форм и не вызывать универсальный десериализатор для произвольного входа.

Для тестирования исправлений удобно создать отдельную копию сайта. Инструкция по установке WordPress на XAMPP поможет подготовить локальную среду, где можно включать расширения, анализировать запросы и проверять обновления без риска для рабочего проекта. Локальная копия не должна содержать реальные пароли, токены и персональные данные.

Что делать владельцу сайта

Владельцу WordPress не требуется самостоятельно искать каждую строку unserialize(), но полезно выстроить регулярный процесс контроля. Обновляйте ядро, тему и плагины из официальных источников, удаляйте неиспользуемые расширения и проверяйте историю изменений. Если плагин давно не поддерживается, его безопаснее заменить, даже когда видимых проблем пока нет.

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

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

Мера Что она предотвращает Ограничение
Обновление WordPress и плагинов Эксплуатацию известных ошибок Не устраняет дефекты собственного кода
Замена unserialize() на JSON Выполнение магических методов объектов Требует проверки структуры данных
allowed_classes => false Восстановление произвольных классов Не заменяет валидацию и контроль доступа
Ограничение прав пользователей Часть атак через панель управления Украденная привилегированная учётная запись всё ещё опасна
Резервные копии и журналирование Быстрое восстановление и расследование Не блокирует атаку самостоятельно
Локальное тестирование обновлений Сбои и несовместимость на рабочем сайте Тестовая среда должна быть изолирована

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

Иконка пользователя в серых тонах

Настройка Windows

Доступ к скрытым параметрам конфигурации, отключение телеметрии, работа с диспетчером задач и тонкая настройка меню «Пуск» в стиле Windows XP для Windows 7.

Иконка браузера в серо-синих тонах

Веб-браузеры

Скрытые страницы конфигурации в Firefox, Chrome и Opera, быстрый текстовый редактор прямо в браузере, эффект Lightbox JS для изображений и настройка внешнего вида Firefox.

Иконка папки в нейтральных серых тонах

WordPress и блоги

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

Изометрический 3D-рендер: светлый веб-сайт с серо-голубым заголовком, парящий над чистой белой поверхностью Изометрический 3D-рендер: тёмно-серая иконка социального букмаркинга на светлом фоне

Обратная связь

Есть вопрос или предложение по темам блога? Напишите — автор на связи.