- Регистрация
- 9 Май 2015
- Сообщения
- 1,071
- Баллы
- 155
- Возраст
- 51
В 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.
Запись впервые появилась .
Технические детали
Разберемся подробнее, чем вызван данный баг. Первое, на что стоит обратить внимание — это файл ./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 реализовано приведение типов. На скриншоте ниже можно увидеть эту проблему наглядно:
Если вы используете версии WordPress, подверженные данной уязвимости, рекомендуем вам немедленно обновить версию WordPress.
Запись впервые появилась .