Всем ку, пацаны. Месяц копался в одном корпоративном WordPress (версия 6.2.3, свежая), и нашёл реально жирную уязвимку — CSRF + IDOR в REST API, которая позволяет лезть в мета-данные любых постов без админки. Делюсь исследованием, потому что баг реально прикольный и многие до сих пор его не фиксят, хотя он критичный.
🔥 В чём суть?
-
Где искать:
Почти все современные темы и многие плагины используютwp-json/wp/v2/posts/<ID>/metaдля работы с мета-данными (например, миниатюры, сео-поля Yoast и т.д.). Проблема в том, что проверка прав доступа там часто кривая — если юзер авторизован (хоть с ролью "подписчика"), можно менять мета-поля любого поста, включая служебные (_thumbnail_id,_yoast_wpseo_titleи т.д.). -
Как эксплуатировать:
-
Берём обычного юзера (хоть подписчика).
-
Кидаем ему CSRF-ловушку (например, JS на фейковой странице).
-
От его имени отправляем POST-запрос на изменение мета-данных.
Пример запроса:
POST /wp-json/wp/v2/posts/555/meta HTTP/1.1 Host: target.com Content-Type: application/json Cookie: [сессия жертвы] { "key": "_thumbnail_id", "value": "666" }
(где
555— ID поста, а666— ID левой картинки из медиатеки) -
💣 Что можно сделать?
-
SEO-вандализм — подмена
_yoast_wpseo_*полей (титлы, дескрипшены). -
Подмена миниатюр — меняем
_thumbnail_idна похабные картинки. -
Инъекция кода — если в теме есть кастомные мета-поля с плохой санитайзацией.
🛡️ Как защититься?
-
Для админов:
-
Отключить ненужные REST-эндпоинты через:
add_filter('rest_endpoints', function($routes) { unset($routes['/wp/v2/posts/(?P<id>[\d]+)/meta']); return $routes; });
-
Добавить
check_admin_referer()во все кастомные обработчики мета-данных.
-
-
Для разработчиков:
Всегда проверяйтеcurrent_user_can('edit_post', $post_id)перед изменением мета-полей!
❓ Вопросы к комьюнити
-
Кто-то уже эксплуатил подобное в реальных условиях?
-
Есть идеи, как через это вылезти в RCE? (например, если в теме есть уязвимое кастомное поле).
-
Знаете другие похожие баги в WP REST API?
P.S. Полный PoC с JS-эксплоитом (для тестовых стендов!) могу скинуть в ЛС. Пишите, если надо.
P.P.S. Не ебите продакшн без пермишена — это для обучения!
Я бы за такое бан давал без объяснения... 🤒
