Эксплуатация уязвимостей обратного вызова в WordPress через самописные плагины

Время чтения: 7 минут
Есть вопросы? Мы в соц сетях

Что такое уязвимости обратного вызова?

Уязвимости обратного вызова (callback vulnerabilities) — это класс веб-уязвимостей, при которых злоумышленник может заставить приложение выполнить произвольную функцию, передав её имя через пользовательский ввод. В контексте WordPress это особенно опасно, так как многие самописные плагины используют call_user_func, call_user_func_array или хуки для гибкости, но забывают проверять, какие функции вызываются. Это позволяет атакующему выполнить системные команды, удалить файлы или получить доступ к базе данных.

Как злоумышленники находят слабые места?

Атакующие сканируют сайты на WordPress, ищут плагины с известными уязвимостями или проверяют параметры запросов. Например, если плагин принимает параметр action и передаёт его в do_action() без фильтрации, злоумышленник может подставить wp_delete_post или exec. Также часто используются файлы-инклуды и десериализация в сочетании с обратными вызовами.

Практический пример эксплуатации

Рассмотрим гипотетический плагин с кодом:

add_action('wp_ajax_custom_action', 'handle_custom_action');
function handle_custom_action() {
$callback = $_POST['callback'];
$data = $_POST['data'];
call_user_func($callback, $data);
}

Злоумышленник отправляет POST-запрос с параметрами: callback=system&data=rm -rf /. В результате выполняется системная команда, удаляющая файлы на сервере. Даже если используется call_user_func_array, риск остаётся. Важно: никогда не передавайте пользовательский ввод напрямую в функции обратного вызова.

Как защитить свой плагин?

Вот несколько обязательных мер:

  • Никогда не используйте пользовательский ввод в call_user_func или do_action без проверки.
  • Используйте белый список допустимых функций. Например, создайте массив разрешённых callback'ов и проверяйте, что переданное значение есть в массиве.
  • Применяйте nonce и проверку прав доступа для всех AJAX-запросов.
  • Экранируйте и валидируйте все входные данные с помощью функций вроде sanitize_text_field, intval.
  • Не полагайтесь на скрытие параметров — всегда проверяйте на сервере.

Чеклист безопасности для разработчика

ШагОписаниеСтатус
1Проверить все вызовы call_user_func и call_user_func_array
2Убедиться, что параметры хуков не приходят от пользователя
3Добавить nonce для всех AJAX-действий
4Использовать белые списки для callback-функций
5Валидировать и экранировать все входные данные
6Провести аудит кода с помощью статического анализатора

Вывод

Уязвимости обратного вызова в WordPress — серьёзная угроза, особенно в самописных плагинах, где разработчики часто жертвуют безопасностью ради гибкости. Злоумышленники активно используют такие ошибки для удалённого выполнения кода. Чтобы защитить свой сайт, необходимо внедрить строгую валидацию входных данных, использовать белые списки функций и регулярно проводить аудит кода. Помните: безопасность начинается с каждого вызова функции.

Мы разрабатывали
apeironspace
jivosite
мтс
originalvirginia
эльдорадо
eparcel
decken-wood
wildberies