В WordPress найдена уязвимость, которая позволяет менять содержимое любого поста
Новости
6К открытий6К показов
В WordPress обнаружена уязвимость, которая позволяет незарегистрированным пользователям модифицировать контент любого поста или страницы на сайте. Данный баг распространяется на версии 4.7.0 и 4.7.1. С версией 4.7.2 вышел фикс.
Технические детали
Разберемся подробнее, чем вызван данный баг. Первое, на что стоит обратить внимание — это файл ./wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
:
Данный кусок кода спроектирован так, чтобы принимать параметр запроса ID в виде цифрового значения. Например, если вы посылаете запрос на /wp-json/wp/v2/posts/1234
, ID будет равняться 1234.
Это хороший способ предотвратить использование невалидных ID, но если взглянуть на код еще раз, можно увидеть, что значения от $_GET
и $_POST
являются приоритетными по отношению к тем, которые вычисляются из регулярного выражения. Исходя из этого, злоумышленник может послать запрос вроде /wp-json/wp/v2/posts/1234?id=12345helloworld
, и ID будет равняться 12345helloworld.
Взглянем на метод update_item_permissions_check
на скриншоте ниже.
Вкратце, он передает наше значение ID, содержащее буквы и цифры, в метод get_post()
. Эта функция валидирует запрос, проверяя, что такой пост существует и что у текущего пользователя есть привилегии на редактирование этого поста. Если мы пошлем ID, который не соответствует ни одному посту, мы можем обойти проверку привилегий и перейти в метод update_item
, продолжая выполнение запроса.
Интересно то, что метод get_post()
также может потерпеть неудачу в поиске поста вследствие использования статического метода get_instance()
, который используется в wp_posts
для поиска постов.Как вы можете увидеть в коде, метод работает неправильно на любой строке, которая состоит не только из цифр.
Для злоумышленников это означает, что WordPress выполнит метод update_item
, посчитав, что у пользователя достаточно привилегий для редактирования поста.Последнее, на что стоит обратить внимание — WordPress приводит параметр ID к типу integer перед тем, как передать его в get_post
. Это вызывает проблемы из-за того, как в PHP реализовано приведение типов. На скриншоте ниже можно увидеть эту проблему наглядно:Это приводит нас к опасной ситуации, когда злоумышленник может использовать запрос, вроде /wp-json/wp/v2/posts/123?id=456ABC
, чтобы изменить пост с ID 456. Следовательно, любой пост на сайте с версией WordPress 4.7.0 или 4.7.1 может быть изменен злоумышленниками.
Если вы используете версии WordPress, подверженные данной уязвимости, рекомендуем вам немедленно обновить версию WordPress.
6К открытий6К показов