![image](https://habrastorage.org/getpro/habr/post_images/1c9/d0b/fdd/1c9d0bfddde628eea0f43e550089538f.png)
Увидев как все ринулись искать XSS на прекрасно-синем Хабрахабре решил попытать свое счастье. POST-овые self-xss, бесполезные во многих контекстах и векторах, начиная с фильтрации в самых популярных браузеров (chrome/safari/ie etc) и заканчивая сложностью их же применения и эксплуатации было решено оставить остальным первопроходцам и отправиться на поиски чего-то более стоящего.
Попытка номер раз
Сначала было решено проверить авторизацию и регистрацию. Ту «чудную» XSS, найденную в этом посте я пропустил, видимо опоздав на несколько дней (а что было бы если бы мысль поискать пришла немного раньше?). Я не любитель заумных приспособлений для поиска и тестирования XSS и предпочитаю очень удобный функционал, встроенный в Chrome, позволяющий скопировать все заголовки в curl и воспользоваться ими через консоль.
![image](https://habrastorage.org/getpro/habr/post_images/4e6/1ee/53e/4e61ee53ef01e6954eb2c860e81d484c.png)
Поиграв с параметрами и ничего не найдя, я по привычке проверил как работает 302 редирект в случае неправильного пути и оказалось что совсем не так как на основном домене.
Отправляя серверу:
curl 'https://auth.habrahabr.ru//%22%3E%3Ch1%3Etest'
Был получен очень интересный ответ:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Документ переехал!</title>
</head>
<body>
<a href="http://habrahabr.ru/auth/"><h1>test/">http://habrahabr.ru/auth/"><h1>test/</a>
</body>
</html>
Как видно из запроса — первая вставка uri не фильтруется, вторая же фильтруется, из-за чего на первый взгляд возникает XSS. Однако попробовав атаку через обычные браузеры и не увидев обещанной XSS, я решил копнуть глубже и увидел что хитрый сервер мало того что добавляет слэш в конец, из-за чего сервер вместо редиректа показывал нам 404ую (довольно странное правило для веб сервера?), так еще и кидает на habrahabr.ru/auth/%xss% ДО того как успеет выполниться js из нашей баги. Первая проблема решилась легко и быстро — все что пришлось сделать так это поставить "?", чтобы все остальное «отбросилось» как GET параметр:
curl 'https://auth.habrahabr.ru//%22%3E%3Ch1%3Etest?'
Теперь ответ выглядел так:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Документ переехал!</title>
</head>
<body>
<a href="http://habrahabr.ru/auth/"><h1>test?/">http://habrahabr.ru/auth/"><h1>test?/</a>
</body>
</html>
Вторую же проблему мне так и не удалось решить. Код упорно не успевал выполняться, кроме как на IE <8 или через тот-же курл.
Что я только не пытался с горя, например убрать meta-refresh:
var mr = document.getElementById("meta-refresh");
mr.parentNode.removeChild(mr);
Но, к сожалению, нулевое время рефреша не оставило мне никаких шансов и я отправился на дальнейшие поиски, так как подобная недоуязвимость меня не устраивала.
Попытка номер 2
После первого фейла было решено не сдаваться и попробовать свои силы в других частях сайта. Воспользовавшись волшебным и неустаревающим гуглом было найдено несколько старых и новых страниц платных промо различных компаний. Самые последние промо страницы всем атакам сопротивлялись очень серьезно, выводимые данные эскейпили, в некоторых местах даже по два раза. Вспомнив про различные конкурсы, где Хабр позволяет обычным смертным зарегистрироваться, я зашел на habrahabr.ru/special/miss, попробовал в регистрации использовать никнейм со спец символами:
![image](https://habrastorage.org/getpro/habr/post_images/d6e/9ce/006/d6e9ce00646d39a15099b33bc5e50700.png)
Подтвердив регистрацию я увидел долгожданный алерт:
![image](https://habrastorage.org/getpro/habr/post_images/785/d66/209/785d66209a9d507d3b08042600f0a6b0.png)
На нем останавливаться было нельзя, ведь он выводится после авторизации, в блоке который видит сам пользователь. Можно было конечно авторизовать пользователя через CSRF (она как раз была в форме авторизации), а затем перенаправить его уже на нашу XSS, но это не наши методы.
Не найдя ни в куках, ни где-то еще своего айдишника, стал перебирать максимальный id профиля и нашел его:
![image](https://habrastorage.org/getpro/habr/post_images/33f/126/a88/33f126a888e168daab435897bd31f3ea.png)
Пожалуй на этом можно было остановиться и репортить администрации, активная XSS есть, никакие браузерные фильтры ей не страшны… но… но хотелось еще!
Google Power
habrahabr active xss dork:
site:.habrahabr.ru/special inurl:register
Гугл выдал около 10+ результатов, из которых большинство были, некоторые вообще еле-еле работали, были частично прикрыты, как например habrahabr.ru/special/panasonic/3d.
Попробовал зарегистрироваться и увидел облом: панелька с именем пользователя не открывалась, комментарии не отправлялись… ничего не работало. Ничего не работало пока я не заглянул в исходник страницы и не увидел замечательную вещь:
![image](https://habrastorage.org/getpro/habr/post_images/bb7/2e1/181/bb72e118177d79e0d9e669be9f2fa6db.png)
Внимательный человек сразу бы добавил к началу никнейма при регистрации "-->" и получил полностью рабочий вебсайт:
![image](https://habrastorage.org/getpro/habr/post_images/b3e/9c2/763/b3e9c276374f16add50fa89bd4efb6ae.png)
Что в html-ке выглядело как:
![image](https://habrastorage.org/getpro/habr/post_images/d12/1d7/787/d121d7787d8ec11fee42a9d800701eed.png)
Дальше я прошелся по всевозможным спешл страницам и пособирал скриншоты для администрации и этой статьи.
XSS в выводе профиля в комментариях:
![image](https://habrastorage.org/getpro/habr/post_images/33a/dd8/1e5/33add81e57bd8d9f17d140779b2d4169.png)
Аналогичные XSS на еще паре проектах:![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/194/1cb/673/1941cb673e5eb183705e6ea242ba3432.png)
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/254/ae3/0de/254ae30de66cd5d04d9b0dd52c2ab681.png)
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/6c4/68d/509/6c468d50967b9bbe614cd7f2bb797e4d.png)
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/215/e25/f97/215e25f97841c7b4eb41502004fd5703.png)
![image](https://habrastorage.org/getpro/habr/post_images/194/1cb/673/1941cb673e5eb183705e6ea242ba3432.png)
![image](https://habrastorage.org/getpro/habr/post_images/254/ae3/0de/254ae30de66cd5d04d9b0dd52c2ab681.png)
![image](https://habrastorage.org/getpro/habr/post_images/6c4/68d/509/6c468d50967b9bbe614cd7f2bb797e4d.png)
![image](https://habrastorage.org/getpro/habr/post_images/215/e25/f97/215e25f97841c7b4eb41502004fd5703.png)
Итоги
В итоге было найдено более 10 активных XSS (разных типов правда среди них от силы было около трех) и одна пассивная недоXSS, за которые мне на почту свалилось 100500 подарочных инвайтов! Возможно, я пропустил непроиндексированные страницы, либо просто не заметил нефильтрованный вывод данных еще в каких-то местах этих промо, но на данный момент все оперативно исправлено администрацией, за что ей большое спасибо!