ГлавнаяПлагиныXSS уязвимость в Jetpack, WordPress SEO, All in One SEO и других популярных плагинах

XSS уязвимость в Jetpack, WordPress SEO, All in One SEO и других популярных плагинах

Команда Sucuri проанализировала ряд популярных плагинов в директории WordPress.org на использование функций add_query_arg() и remove_query_arg(). Многие из них оказались уязвимыми.

Уязвимые плагины

Среди уязвимых плагинов были названы следующие:

  • Jetpack
  • WordPress SEO
  • Google Analytics by Yoast
  • All In one SEO
  • BuddyPress
  • bbPress
  • Gravity Forms
  • Ряд плагинов от Easy Digital Downloads
  • UpdraftPlus
  • WP-E-Commerce
  • WPTouch
  • Download Monitor
  • Related Posts for WordPress
  • My Calendar
  • P3 Profiler
  • Give
  • Множество продуктов iThemes, включая Builder and Exchange
  • Broken-Link-Checker
  • Ninja Forms

При использовании любого из этих плагинов, убедитесь в том, что у вас установлена самая свежая версия. Многие авторы уже выпустили обновления, а для самых популярных плагинов, включая Jetpack от Automattic, команда WordPress.org решила выпустить фоновое обновление.

Учтите, что если в данном списке нет ваших плагинов, это не значит, что они не уязвимы. Команда Sucuri проверила лишь 400 плагинов в порядке их популярности. В случае если вы не уверены, обязательно обратитесь на страницу плагина на сайте WordPress.org и посмотрите раздел Changelog, чтобы узнать в какой версии была устранена данная уязвимость.

Разработчикам тем и плагинов рекомендуется проанализировать использование функций add_query_arg() и remove_query_arg() в своих плагинах.

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

Многие разработчики, используя функции add_query_arg() или remove_query_arg() подразумевали, что они экранируют вывод результата, но к сожалению это не так.

При отсутствии аргумента $query, эти функции используют текущий адрес сайта, который находится в глобальном массиве $_SERVER['REQUEST_URI']. При этом, найденный адрес используется как есть, и может содержать любой пользовательский ввод:

$link = add_query_arg( 'foo', 'bar' );
printf( '<a href="%s">link</a>', $link );

На первый взгляд кажется, что данная безобидная функция добавляет аргумент foo=bar к текущему URL и выводит в виде ссылки, но поскольку результат функции зависит от текущего адреса, злоумышленник может запросить что-нибудь подобное:

http://example.org/?"><script>alert()</script>

Здесь двойные кавычки закрывают тэг ссылки, и далее злоумышленник может исполнять любой JavaScript код, включая кражу куки авторизованных пользователей. Исправить это легко с помощью функций экранирования esc_url() и esc_url_raw():

$link = add_query_arg( 'foo', 'bar' ); // Опасно!
$link = esc_url( $link ); // Теперь безопасно.
printf( '<a href="%s">link</a>', $link );

В случае работы с редиректами, или HTTP API в WordPress, вместо esc_url() следует использовать функцию esc_url_raw(), которая экранирует адрес, но не готовит его для вывода на экран.

Об основах безопасности WordPress и о том, почему следует всегда обновлять ядро, темы и плагины, читайте в нашей статье.

Подписаться на рассылку

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!

  • rirock

    А «$query_args =» безопасно?
    $query_args = array( ‘action’ => ‘bbp_unsubscribe’, ‘topic_id’ => $topic_id );

    • Это не имеет значения.

      • rirock

        так и думал спасибо

    • Что-то я не понял что происходит в этом коде :)

      • rirock

        Это код из одной темы, которой я пользуюсь, эта часть отвечает как-то за bbpress.

      • В add_query_arg() вместо первых двух параметров можно передать массив:

        $url = add_query_arg( ‘foo’, ‘bar’, $original_url );
        $url = add_query_arg( array( ‘foo’ => ‘bar’ ), $original_url );

        Это удобно, когда нужно добавить к адресу более одного параметра.

  • Дамир

    ооо наконец-то я начал хоть немного понимать статьи где встречается PHP-код, второй месяц уже на PHP-курсы хожу… :)

    вот только я не понял как можно с помощью javascript своровать куки у посетителя, если сайт не твой? взломщики что ли через AJAX могут внедрить трояна на чужой хостинг, а потом воровать куки, так чтоли?

    • Нет, троян не нужен. С помощью javascript (document.cookie) можно получить значения куки текущего посетителя, с помощью простого iframe/ajax/редирект можно эти значения передать на собственный сервер.