Как я не взломал «Хабрахабр» или 10+ активных XSS

    image
    Увидев как все ринулись искать XSS на прекрасно-синем Хабрахабре решил попытать свое счастье. POST-овые self-xss, бесполезные во многих контекстах и векторах, начиная с фильтрации в самых популярных браузеров (chrome/safari/ie etc) и заканчивая сложностью их же применения и эксплуатации было решено оставить остальным первопроходцам и отправиться на поиски чего-то более стоящего.

    Попытка номер раз


    Сначала было решено проверить авторизацию и регистрацию. Ту «чудную» XSS, найденную в этом посте я пропустил, видимо опоздав на несколько дней (а что было бы если бы мысль поискать пришла немного раньше?). Я не любитель заумных приспособлений для поиска и тестирования XSS и предпочитаю очень удобный функционал, встроенный в Chrome, позволяющий скопировать все заголовки в curl и воспользоваться ими через консоль.

    image

    Поиграв с параметрами и ничего не найдя, я по привычке проверил как работает 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/&quot;&gt;&lt;h1&gt;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/&quot;&gt;&lt;h1&gt;test?/</a>
    </body>
    </html>
    


    Вторую же проблему мне так и не удалось решить. Код упорно не успевал выполняться, кроме как на IE <8 или через тот-же курл.
    Что я только не пытался с горя, например убрать meta-refresh:

    var mr = document.getElementById("meta-refresh");
    mr.parentNode.removeChild(mr);
    


    Но, к сожалению, нулевое время рефреша не оставило мне никаких шансов и я отправился на дальнейшие поиски, так как подобная недоуязвимость меня не устраивала.

    Попытка номер 2


    После первого фейла было решено не сдаваться и попробовать свои силы в других частях сайта. Воспользовавшись волшебным и неустаревающим гуглом было найдено несколько старых и новых страниц платных промо различных компаний. Самые последние промо страницы всем атакам сопротивлялись очень серьезно, выводимые данные эскейпили, в некоторых местах даже по два раза. Вспомнив про различные конкурсы, где Хабр позволяет обычным смертным зарегистрироваться, я зашел на habrahabr.ru/special/miss, попробовал в регистрации использовать никнейм со спец символами:

    image

    Подтвердив регистрацию я увидел долгожданный алерт:

    image

    На нем останавливаться было нельзя, ведь он выводится после авторизации, в блоке который видит сам пользователь. Можно было конечно авторизовать пользователя через CSRF (она как раз была в форме авторизации), а затем перенаправить его уже на нашу XSS, но это не наши методы.

    Не найдя ни в куках, ни где-то еще своего айдишника, стал перебирать максимальный id профиля и нашел его:

    image

    Пожалуй на этом можно было остановиться и репортить администрации, активная XSS есть, никакие браузерные фильтры ей не страшны… но… но хотелось еще!

    Google Power


    habrahabr active xss dork:
    site:.habrahabr.ru/special inurl:register


    Гугл выдал около 10+ результатов, из которых большинство были, некоторые вообще еле-еле работали, были частично прикрыты, как например habrahabr.ru/special/panasonic/3d.
    Попробовал зарегистрироваться и увидел облом: панелька с именем пользователя не открывалась, комментарии не отправлялись… ничего не работало. Ничего не работало пока я не заглянул в исходник страницы и не увидел замечательную вещь:

    image

    Внимательный человек сразу бы добавил к началу никнейма при регистрации "-->" и получил полностью рабочий вебсайт:

    image

    Что в html-ке выглядело как:

    image

    Дальше я прошелся по всевозможным спешл страницам и пособирал скриншоты для администрации и этой статьи.
    XSS в выводе профиля в комментариях:

    image

    Аналогичные XSS на еще паре проектах:
    image

    image

    image

    image


    Итоги


    В итоге было найдено более 10 активных XSS (разных типов правда среди них от силы было около трех) и одна пассивная недоXSS, за которые мне на почту свалилось 100500 подарочных инвайтов! Возможно, я пропустил непроиндексированные страницы, либо просто не заметил нефильтрованный вывод данных еще в каких-то местах этих промо, но на данный момент все оперативно исправлено администрацией, за что ей большое спасибо!
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 14
    • +33
      Название однозначно лучше, чем "Как я взломал Хабрахабр"
      • +3
        А помните, когда DIY открылся и поехали флешки с деревянным корпусом? :) Там тему закрыл вот этот пост habrahabr.ru/post/85766/
        Очень надеюсь, что этот пост тоже закроет эту тему.
        • +1
          Вы же понимаете что этот пост чуть менее чем полностью саркастичен и был написан под влиянием 3-4 последних постов про в постовых формах :))
          • +2
            Конечно :) Пост про флешку тоже простебал все те безумные посты. И после такого стеба, обычно, прекращается идиотизм с флешками и взламыванием локалхоста :)
            PS. Вы все правильно сделали ;)
      • +1
        Получил 10 инвайтов от администрации?
        • 0
          В конце же написано :)
          • 0
            Прочитал всё, кроме итогов, ха-ха. И верно — 100500 инвайтов! Молодец, Стас! =)
        • +2
          вот это я понимаю хакнул =)
          • 0
            meta refresh не вижу? можно было бы попробывать его срезать тем же xss auditor если передать как гет параметр
            • +1
              ага, а пользователю перед подсовыванием тоже просить резать?)) я искал чем реально можно воспользоваться
              • 0
                XSS auditor в хроме удаляет из ответа те куски которые ты сам посылаешь ему. Не особо известная техника. Ею удобно срезать анти кликджекинг защиты
            • +1
              Кто ищет — тот всегда найдет.
              • 0
                Не подскажите как вы отключили xss auditor? с помощью --disable-xss-auditor?
                • 0
                  Это активные XSS, фильтры не умеют их резать, иначе фильтровался бы любой JS который написан разработчиками. Суть как в том что я и искал те, которые не отфильтруются, писал в самом первом абзаце :) Тот же XSS Auditor просматривает только различные браузерные заголовки + GPC.

                  Пример:

                  1. Пасивная XSS, фильтруется Аудитором

                  index.php?1=<script>alert(123);</script>
                  <?php
                  echo $_GET[1];
                  ?>
                  


                  2. Активная XSS ничем не отличается от обычного js-а, код уже изначально встроен в тело страницы, он не передается ни в каких параметрах, поэтому никак не может быть отфильтрован.
                  <?php
                  #где-то тут мы, например из базы, но не GPC (get,post,cookies) параметром получили $a 
                  #и в ней уже <script>alert(123);</script>
                  ... 
                  echo $a;
                  ?>
                  


                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.