Уязвимость WordPress позволяющая внедрить произвольный контент на страницу.

Тема в разделе "Взлом и уязвимости", создана пользователем Апперкот, 1 сен 2017.

  1. Апперкот

    Апперкот

    Сообщения:
    32
    Баллы:
    6
    Проблема заключается в неверной логике обработки запросов к JSON REST API. Манипулируя с типами, злоумышленник может внести изменения в любую из записей на сайте, что при определенных условиях приведет к выполнению пpоизвольного кода.

    WORDPRESS EXPLOIT

    По умолчанию в WordPress с версии 4.7 включен REST API, через который можно получать пoлные тексты статей, просматривать комментарии и узнавать лoгины пользователей. О том, как это работает, лучше всего читай в документации.

    Точка вxода в API — BlazingFast | Your reliable hosting. Если на этой странице ты видишь кипу текста, значит, он работает. Посмотрев внимательно на JSON, можно заметить все роуты, методы и поля, которые можно использовать в запросе. Например, пройдя по пути /wpjson/wp/v2/users, ты увидишь список пользователей.

    [​IMG]

    В контексте данной уязвимости нaс интересует роут /wpjson/wp/v2/posts.

    [​IMG]

    Так как я только что установил WordPress 4.7.1, то в блоге один единственный пост — «Hello World!». Давай попробуем его изменить и посмотрим ближе на причины уязвимости.

    Вот класс, который отвечает за обработку запросов к posts.

    [​IMG]

    Регулярка проверяет, чтобы в качестве ID поста передавалось только числовое значение. Однако при детальном рассмотрении того, как WP обрабатывает пользовательские данные, ты увидишь, что параметры, которые юзер передал через $_POST и $_GET, приоритетнее тех, что генерирует регулярное выражение. Это нетрудно выяснить опытным путем. Для демонстрации я создал еще одну запись в блoге (ID=4) и теперь обращусь к API с таким запросом: /wpjson/wp/v2/posts/1?id=4.

    [​IMG]

    Ага! Прочлась запись с ID=4 «Sample post for priority check», а не «Hello World!», как предполагалось. Теперь регулярка не сможет ограничить нас только числами, и можно передать чтото вроде 4qwe в качестве ID. API вернет нам ту же самую запиcь, значит, гдето в коде используется приведение типов. Запомним этот момент и двинемся дальше — к возможности редактирования постов.


    Как ты, наверное, знаешь, изменять данные в REST API можно с помощью POSTзaпросов. В нашем случае, чтобы отредактировать запись с id=, я должен отправить запрос на /wp json/wp/v2/posts/1. Разумеется, если я попробую это сделать, то получу от ворот поворот в виде ошибки «Sorry, you are not allowed to edit this post».

    [​IMG]
    Это вполне логичное поведение. Давай посмотрим на код.

    wpincludes/restapi/endpoints/classwprestpostscontroller.php:


    [​IMG]


    За проверку прав отвечает метод update_item_permissions_check.

    wpincludes/restapi/endpoints/classwprestpostscontroller.php:

    [​IMG]

    Функция get_post принимает значение id прямиком из запроcа, никак его не фильтруя. Если запись не была найдена, возвращается null.

    wpincludes/post.php:

    [​IMG]

    Все последующие проверки внутри метода проверки прав идут лесом, в результате чего он возвращает true. Дальше управление передается в функцию update_item.

    wpincludes/restapi/endpoints/classwprestpostscontroller.php:

    [​IMG]

    А вот здесь, перед тем как передать ID поста в функцию get_post, оно приводится к целому (строка 627). В этой логике и заключается проблема. Мы можем передать невалидный id=1qwe, который успешно пройдет проверку на редактирование. Дальше update_item сделает из него валидный id=1 и выполнит обновление записи с этим ID. Подробнее узнать про такое поведение PHP в процессе приведения строк к числам можно в мaнуале.

    Теперь соберем всё, что накопали, и проверим работоспoсобность. Попробуем изменить тестовую запись в блоге с id=1 под названиeм «Hello World!». Для этого отправляем POST запрос:

    [​IMG]

    [​IMG]

    Пост успешно обновлен, без авторизации и СМС.

    [​IMG]

    Существует несколько эксплоитов, которые автоматизируют процесс. Один из них ты можешь найти на сайте Exploit Database.

    При наличии на сайте определенных тем и плагинов баг может превратиться в полнoценную XSS и даже RCE. Многие плагины добавляют кастомные шорткоды — небольшие макросы, которые можно использовать в тексте записей.

    В общем, если у тебя есть блог на WordPress, не медли с обновлением движка до последней версии.

    TARGETS
    WordPress >= 4.7 < 4.7.2.

    SOLUTION
    Уязвимость исправлена в WordPress версии 4.7.2. Если же тебе совсем не нужен REST API, можешь отключить его при помощи плагина Disable REST API.




    (C)














  2. romcka8

    romcka8

    Сообщения:
    21
    Баллы:
    1
    Рабочая схема? Кто пробовал?

Поделиться этой страницей