Уведомления
Очистить все

[Практика/Обучение] Лютый баг в WordPress - CSRF + IDOR в REST API, даю детали


liki
 liki
(@liki)
New Member
Присоединился: 1 год назад
Записи: 1
Создатель темы  

Всем ку, пацаны. Месяц копался в одном корпоративном WordPress (версия 6.2.3, свежая), и нашёл реально жирную уязвимку — CSRF + IDOR в REST API, которая позволяет лезть в мета-данные любых постов без админки. Делюсь исследованием, потому что баг реально прикольный и многие до сих пор его не фиксят, хотя он критичный.

🔥 В чём суть?

  1. Где искать:
    Почти все современные темы и многие плагины используют wp-json/wp/v2/posts/<ID>/meta для работы с мета-данными (например, миниатюры, сео-поля Yoast и т.д.). Проблема в том, что проверка прав доступа там часто кривая — если юзер авторизован (хоть с ролью "подписчика"), можно менять мета-поля любого поста, включая служебные (_thumbnail_id, _yoast_wpseo_title и т.д.).

  2. Как эксплуатировать:

    • Берём обычного юзера (хоть подписчика).

    • Кидаем ему CSRF-ловушку (например, JS на фейковой странице).

    • От его имени отправляем POST-запрос на изменение мета-данных.

    Пример запроса:

    http
     
    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 на похабные картинки.

  • Инъекция кода — если в теме есть кастомные мета-поля с плохой санитайзацией.

🛡️ Как защититься?

  1. Для админов:

    • Отключить ненужные REST-эндпоинты через:

      php
       
      add_filter('rest_endpoints', function($routes) {  
          unset($routes['/wp/v2/posts/(?P<id>[\d]+)/meta']);  
          return $routes;  
      });  
    • Добавить check_admin_referer() во все кастомные обработчики мета-данных.

  2. Для разработчиков:
    Всегда проверяйте current_user_can('edit_post', $post_id) перед изменением мета-полей!

❓ Вопросы к комьюнити

  1. Кто-то уже эксплуатил подобное в реальных условиях?

  2. Есть идеи, как через это вылезти в RCE? (например, если в теме есть уязвимое кастомное поле).

  3. Знаете другие похожие баги в WP REST API?

P.S. Полный PoC с JS-эксплоитом (для тестовых стендов!) могу скинуть в ЛС. Пишите, если надо.

P.P.S. Не ебите продакшн без пермишена — это для обучения!



   
Цитата
Rudi8
(@rudi8)
Active Member
Присоединился: 4 года назад
Записи: 16
 

Я бы за такое бан давал без объяснения... 🤒 

 



   
ОтветитьЦитата