Написать пост

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

Аватар Антон Корольков

В WordPress обнаружена уязвимость, которая позволяет незарегистрированным пользователям модифицировать контент любого поста или страницы на сайте. Данный баг распространяется на версии 4.7.0 и 4.7.1. С версией 4.7.2 вышел фикс.

Технические детали

Разберемся подробнее, чем вызван данный баг. Первое, на что стоит обратить внимание — это файл ./wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:

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

Данный кусок кода спроектирован так, чтобы принимать параметр запроса 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 найдена уязвимость, которая позволяет менять содержимое любого поста 2

Для злоумышленников это означает, что 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К показов