1. Основы пентестинга и архитектура безопасности ядра WordPress
Основы пентестинга и архитектура безопасности ядра WordPress
Более 40% всех сайтов в интернете работают на WordPress. Эта статистика делает систему самой желанной целью для злоумышленников: обнаружив одну критическую уязвимость в ядре или популярном плагине, атакующий получает потенциальный доступ к миллионам ресурсов. Однако вопреки расхожему мнению о «дырявости» системы, само ядро WordPress (Core) проектируется с учетом жестких стандартов безопасности. Проблемы чаще всего возникают на стыке архитектурных решений, кастомного кода и специфики PHP-окружения. Для пентестера понимание того, как именно WordPress обрабатывает данные «под капотом», является фундаментом, без которого невозможно отличить ложноположительное срабатывание сканера от реальной бреши.
Философия безопасности WordPress: модель угроз и доверия
Безопасность WordPress строится на принципе разграничения полномочий и строгой фильтрации входящих потоков данных. В отличие от многих фреймворков, WordPress не является монолитным приложением в строгом смысле слова — это событийно-ориентированная система, где выполнение кода зависит от «хуков» (hooks). С точки зрения пентестера, это означает, что вектор атаки может быть внедрен практически в любой момент жизненного цикла запроса.
Модель угроз WordPress разделяет риски на три уровня:
Пентестинг WordPress начинается не с запуска автоматизированных утилит, а с понимания иерархии файлов и того, как система определяет, является ли пользователь тем, за кого себя выдает. Центральным узлом здесь выступает файл wp-config.php, который связывает файловую систему с базой данных и содержит ключи «соления» (salts) для хеширования куки.
Архитектура аутентификации и механизмы Cookie-авторизации
WordPress не использует стандартные PHP-сессии (H\text{HMAC}\text{expiration}\text{token}\text{key}post_id), атакующий с правами «Подписчика» может удалять чужой контент, манипулируя параметрами запроса.
Жизненный цикл запроса и точки входа для атак
Чтобы эффективно искать уязвимости, нужно понимать, как запрос проходит через ядро. Типичный путь HTTP-запроса:
index.php: Все запросы перенаправляются сюда через .htaccess или правила Nginx.wp-load.php: Загружается конфигурация и устанавливается соединение с БД.wp-includes/): Подгружаются основные функции, классы и API.plugins_loaded: В этот момент инициализируются все активные плагины. Это критическая точка: если плагин содержит уязвимый код, выполняющийся сразу при загрузке, атаку можно провести на любом этапе.init: Основная точка инициализации для большинства задач.Пентестеру важно знать о «скрытых» точках входа. Помимо очевидных страниц, существуют:
admin-ajax.php: Единая точка для всех AJAX-запросов. Часто становится источником IDOR (Insecure Direct Object Reference) и SQL-инъекций./wp-json/): Современный интерфейс WordPress. Ошибки в реализации разрешений в REST-контроллерах — одна из самых частых причин утечки данных пользователей.xmlrpc.php): Устаревший, но часто активный протокол. Используется для атак типа Brute Force (через метод system.multicall, позволяющий проверять сотни паролей в одном запросе) и SSRF (Server Side Request Forgery) через функционал пингбэков.Очистка и валидация данных: встроенные механизмы защиты
Ядро WordPress предоставляет мощный набор функций для обеспечения безопасности, и большинство успешных атак на систему происходят именно тогда, когда разработчики пренебрегают этими инструментами.
Защита от SQL-инъекций
Для взаимодействия с базой данных используется классid = results = id");
`
Здесь переменная id = results = wpdb->prepare(
"SELECT * FROM wp_posts WHERE ID = %d",
wpdb->query("... $variable ...") без использования prepare является приоритетной задачей.Защита от XSS (Cross-Site Scripting)
WordPress следует правилу: «Валидируй на входе, очищай на выходе».
Для очистки данных (Sanitization) используются функции:
sanitize_text_field() — удаляет теги и лишние пробелы.
sanitize_email() — проверяет соответствие формату email.Для вывода данных (Escaping) используются:
esc_html() — для вывода текста внутри HTML-тегов.
esc_attr() — для вывода данных внутри атрибутов тегов (например, value="...").
esc_url() — критически важна для ссылок, предотвращает использование протоколов типа javascript:.Особое внимание пентестер должен уделять функциям
wp_kses(). Это мощный фильтр, который разрешает только определенные HTML-теги и атрибуты. Если в плагине реализована возможность оставлять отзывы с форматированием, неправильная настройка wp_kses может позволить внедрить атрибуты onmouseover или теги <script>.Механизм Nonces (Number used once)
Одной из главных защит от CSRF-атак (Cross-Site Request Forgery) в WordPress являются «нонсы». В классической криптографии nonce — это одноразовое число. В WordPress это, скорее, временный токен, привязанный к пользователю, действию и времени.
Когда администратор нажимает кнопку «Удалить пост», в URL добавляется параметр
_wpnonce. Сервер проверяет:
Был ли этот токен сгенерирован для текущего пользователя?
Соответствует ли он конкретному действию (удаление поста)?
Не истекло ли время его жизни (обычно 12–24 часа)? Если пентестер обнаруживает форму или ссылку, выполняющую важное действие (смена пароля, удаление данных, изменение настроек), в которой отсутствует проверка
check_admin_referer() или wp_verify_nonce(), — это подтвержденная CSRF-уязвимость.Файловая система и конфигурация: критические узлы
Архитектура WordPress предполагает, что веб-сервер имеет право на запись в определенные директории (например,
wp-content/uploads). Это создает вектор для загрузки бэкдоров.wp-config.php — сердце системы
Этот файл не входит в состав дистрибутива, он создается при установке. Помимо доступов к БД, в нем настраиваются критические параметры безопасности:
DISALLOW_FILE_EDIT: Если установлено в true, отключает встроенный редактор тем и плагинов в админке. Это важный шаг hardening'а, так как при захвате аккаунта администратора хакер первым первым делом идет в редактор, чтобы вставить PHP-шелл.
DISALLOW_FILE_MODS: Запрещает обновление и установку новых плагинов/тем.
FORCE_SSL_ADMIN: Принудительное использование HTTPS для админки..htaccess и защита директорий
В контексте пентестинга важно проверять наличие листинга директорий. Если сервер настроен некорректно, обращение к /wp-content/uploads/ может выдать список всех загруженных файлов, что облегчает поиск чувствительной информации или загруженных скриптов.Стандартная структура каталогов:
wp-admin/: Панель управления. Защита этой папки на уровне веб-сервера (Basic Auth) — отличная практика.
wp-includes/: Логика ядра. Здесь не должно быть исполняемых файлов, загруженных пользователем.
wp-content/: Единственное место, где код может меняться (плагины, темы, загрузки).Протокол XML-RPC и современные векторы атак
Хотя WordPress активно переходит на REST API, файл
xmlrpc.php остается в корне большинства сайтов для обратной совместимости. Для атакующего это «швейцарский нож». Усиление Brute Force: Метод system.multicall позволяет в одном HTTP-запросе передать массив пар логин-пароль. Это обходит многие плагины защиты, которые считают количество запросов, а не количество попыток входа.
SSRF через Pingback: Функция уведомления о ссылках позволяет использовать сервер WordPress как прокси для сканирования внутренних портов сети или проведения DDoS-атак на другие ресурсы. При аудите безопасности первым делом проверяется доступность
xmlrpc.php. Если он не используется мобильными приложениями или сервисами типа Jetpack, его следует отключить.Аудит базы данных: на что смотреть пентестеру
База данных WordPress имеет простую структуру, но именно в ней хранятся «ключи от королевства». При получении доступа к SQL (через инъекцию или кражу конфига) внимание следует уделить следующим таблицам:
wp_users: Содержит логины и хеши паролей. WordPress использует библиотеку Portable PHP password hashing framework, которая делает перебор паролей ресурсозатратным.
wp_usermeta: Здесь хранятся права доступа. Изменение значения wp_capabilities для обычного пользователя на a:1:{s:13:"administrator";b:1;} мгновенно повышает его привилегии до максимума.
wp_options: Самая интересная таблица. Здесь хранятся настройки сайта, активные плагины и, часто, ключи API сторонних сервисов. Поле active_plugins можно отредактировать, чтобы отключить плагины безопасности (например, Wordfence или Sucuri) перед основной атакой.Иерархия безопасности и логика «песочницы»
WordPress не имеет встроенной изоляции плагинов друг от друга. Если один плагин скомпрометирован, злоумышленник получает права, с которыми работает PHP-процесс. Это означает доступ ко всей файловой системе сайта и базе данных.
Однако ядро старается минимизировать ущерб через:
Filesystem API: Абстракция для работы с файлами, которая может требовать FTP-доступы для записи, если права на папки установлены слишком жестко.
Pluggable Functions: Функции, которые можно переопределить. Это позволяет плагинам безопасности заменять стандартные механизмы (например, функцию wp_hash) на более защищенные.Для профессионального пентестера работа с WordPress — это всегда поиск баланса между удобством пользователя и строгостью ядра. Понимание того, как
wp-includes/formatting.php обрабатывает строки или как map_meta_cap() вычисляет права в реальном времени, позволяет находить логические уязвимости, которые не видит ни один автоматический сканер.Безопасность WordPress — это не состояние, а процесс. Ядро предоставляет все необходимые инструменты: нонсы для защиты от CSRF,
prepare для защиты от SQLi, и kses` для борьбы с XSS. Задача аудитора — убедиться, что эти механизмы не просто задекларированы, а реально внедрены в каждом компоненте экосистемы конкретного сайта.