0

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

В 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.

Источник: Sucuri