CSRF уязвимости на примере ХабраХабра

    Уязвимости уже нет — её исправили задолго до появления этого топика.

    Очень часто многие веб-разработчики забывают о существовании этого метода взлома, а некоторые даже не знают о нём.

    К сожалению, подобные уязвимости встречаются даже в таких крупных системах, как ХабраХабр.




    С чего всё начиналось


    Всё началось с того, что мою карму быстро слили до -16 единиц из-за вполне нормального, как я считаю, комментария. Мне стало обидно, ведь я регистрировался на этом ресурсе чтобы писать интересные всем топики, а теперь я не могу этого сделать.



    Я листал ленту, просматривая топики, и думал о том, как же хорошо их авторам, которые быстро набирают рейтинг и светятся в лучах славы. Без всякой надежды я ткнул в стрелочку, чтобы поставить плюсик топику. Как не трудно догадаться, я получил ошибку типа «Вашей кармы не достаточно для голосования».

    Ищем уязвимости


    Я сразу обратил внимание на то, что страница не обновляется а, значит, используется AJAX.

    Тут же вспомнилось про малоизвестные CSRF, или как их ещё называют XSRF уязвимости.

    Я стал FireBug'ом смотреть куда и как отправляются запросы. В первую очередь смутило то, что передавались только оценка (за или против), тип записи (топик) и id. Никаких дополнительных полей типа hash или token не передавалось.

    Не всё так просто


    Возможно, нетерпеливый читатель уже решил, что я нашёл элементарную, очевидную каждому дыру? Как бы ни так! Все мои попытки подделать запрос приводили к одному и тому же:



    Вначале я решил, что где-то ошибся. Но нет, я слал запрос на нужный адрес и передавал нужным образом все параметры. Но когда это делал скрипт ХабраХабра, то получал статус ответа 200, а я 404.

    Я стал внимательно проверять HTTP заголовки, и тут бросилось в глаза это:



    Что это за такой странный заголовок, которого не оказалось в моём запросе?

    Немного погуглив я узнал, что этот заголовок по-умолчанию передаётся при AJAX'е, а при запросе из формы, самой собой, не передаётся.

    Сделать AJAX запрос я не мог, т.к. Хабр находится на другом домене и меня бы просто не пустил туда браузер. И тут я вспомнил про заброшенный мною давным давно FlashPlayer. Быстро погуглив я вскрикнул ура!

    Да, товарищи, этот так многими не любимый аддон к браузеру может слать любые запросы на любой домен если… Если есть в корне этого домена правильный файл crossdomain.xml.

    Вы верите в судьбу? Я — нет. Но я был просто шокирован, когда нашёл в корне ХабраХабра этот заветный файл, который разрешал слать ему запросы на 80-ый порт с любого домена!

    Пишем эксплоит


    Я выбрал ActionScript версии 2 во-первых, потому что его лучше знал, а во-вторых, потому что можно захватить с собой на корабль и пользователей старого FlashPlayer (начиная с версии 7).

    var req:LoadVars = new LoadVars();
    req.addRequestHeader("X-Requested-With","XMLHttpRequest");
    req.addRequestHeader("Referer","http://habrahabr.ru/"); // на всякий случай
    req.decode("ti=666&tt=2&v=1"); // вместо 666 id вашего топика
    req.send("http://habrahabr.ru/json/vote/",  "_blank", "POST"); 
    


    Что делать с эксплоитом?


    Всё, теперь дело за малым. Если у вас есть свой сайт, то не думая заливаем код туда и ставим в iframe.

    Если у вас нет сайта, то думая договариваемся за Profit с владельцем крупного приложения ВКонтакте и заливаем код к нему. Охват 50% пользователей гарантирован.

    Всё, теперь любой пользователь, если он не голосовал за ваш топик ранее, ставит вам + сам того не зная.

    Кроме того голосовать можно не только за топики, но и за комментарии, вопросы и КАРМУ!

    На память


    Ломать сайты — очень не хорошо. За это могут сделать ата-та-та по заднему месту.

    В случае с данной уязвимостью я быстро написал письмо в службу поддержки и уязвимость закрыли (исправив crossdomain.xml).
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 67

      +1
      в представленном скрине кармы голосов 60, а на данный момент у вас 8 голосов. Как?
        +37
        Воспользовался обнулением кармы.
          –5
          Кстати можно было еще как вариант впихнуть img в профиль а картинку залить на свой сервер с правильным .htaacess и туда заинклудить ваш запрос при помощи php.
            +8
            Я бы не получил Cookie.
        +15
        Охват 50% пользователей гарантирован.

        А оставшиеся 50% вы набираете за такие топики абсолютно честным способом) Спасибо!
          +36
          Я не воспользовался этой уязвимостью. Да, дурак.
            +11
            Это я понял, и мне кажется, что вы поступили правильно.
              +9
              Нет, не дурак.
                +10
                Тогда бы НЛО вас не простило. А так вы стали героем)
              0
              На самом деле для кросс-доменных запросов очень удобно использовать расширения в Google Chrome, так как там они разрешены.
                +6
                Я буду просить об этом жертву? Поставьте, мол, такое то расширение, а то я не могу вас атаковать!
                  0
                  Достаточно написать удобное расширение для пользователей хабра, которое, заодно, будет и автору карму поднимать.
                    +1
                    В таком случае всё становится очень просто и не интересно. Я за спортивный взлом!
                      +2
                      расширения для chrome легко разбираются и рано или поздно, а скорее рано его бы вычислили.
                    0
                    ой, немного не в тему получился комментарий, не до конца врубился в начале )
                    Но все равно кому то пригодится )
                    –1
                    При голосовании всяко передаются кукисы с идентификатором сессии, заголовок X-Requested-With можно передать и в форме, и еще вы забыли сказать, что те пользователи, от имени которых идет скрытное голосование, должны быть авторизованы на хабре.
                      0
                      Кукисы передаются. Люблю Flash!
                        –1
                        Я не понял, почему у вас 404 ошибка получалась. Видимо, просто не все POST параметры передавали. Тут нет никакой разницы Ajax это запрос или нет.
                          0
                          404 потому что разработчики Хабра с юмором. На многие страницы, если у вас нет к ним доступа, даётся эта ошибка.
                            +7
                            При прочтении вашего комментария, из-за «404» в начале, подсознательно показалось, что его amarao написал :)
                            +2
                            Кстати разница есть. Как раз об этом и была статья — вы пропустили главное :-)
                        0
                        kafeman, беги за инвайтом
                          +6
                          Мне deniskin за сообщение об уязвимости уже дал один ещё несколько дней назад.
                          0
                          А разве нельзя curl-ом послать нужные хэдэры? Или через JSONP.
                            +2
                            Нет, т.к. нужны Cookie пользователя.
                              0
                              Я тоже сначала подумал в этом же духе. Но как то забылось, что атака то ведется через браузер жертвы. Поэтому получить куки с него мы не можем. И сформировать нужный заголовки тоже. Точнее не могли если бы не флеш.
                              0
                              А на referer проверки тож не идёт? Зря помом, зря. А то, как тут говорили, можно подделать с помощью всяких аддонов. referer конечно тоже подделать можно, но всё ж…
                                0
                                Я не знаю, но лишним не будет. Я только точно знаю, что проверяется X-Requested-With.
                                +8
                                Теперь это пост любви к django.middleware.csrf.CsrfViewMiddleware
                                  –37
                                  Мне интересно, чем думают люди, которые так легко, одним движением руки, разрешают кроссдоменные запросы с любого сервера? Что у них в голове? или это орудует то самое новое поколение кодеров, которое привыкло бездумно копипастить файлы и куски кода из интернета? Впрочем, я никогда и не считал флешеров настоящими программистами, мышкой квадратики перетаскивать-то много ума не надо.

                                    +12
                                    На самом деле разработчики Хабра мне показались людьми хорошими. А разрешение они это дали, будете смеяться, для рекламы :-). (И ещё для habrastorage).
                                    А многие Flash-программисты пишут всё в коде, без «квадратиков». Точно знаю, что так пишут программисты ВКонтакте.
                                      0
                                      прочитав статью — первым делом захотел проверить именно habrastorage. посмотрел crossdomain, cookie, whois — все в порядке… потом увидел этот комментарий)) спасибо за пост!
                                      +1
                                      вы слышали о таком понятии, как API на сайтах?
                                      уязвимость закрывать надо было, а не кросс-домен перекрывать. сам по себе последний безопасен.
                                        –19
                                        При чем тут уязвимость? Что вы за бред пишете? Если вы размещаете на своем сайте crossdomain.xml с allow-access-from = "*", вы открываете всем хакерам доступ к своему сайту. Это не уязвимость, так как это поведение документировано Adobe. Это халатность и безответственность скорее.
                                          +25
                                          > Если вы размещаете на своем сайте crossdomain.xml с allow-access-from = "*", вы открываете всем хакерам доступ к своему сайту

                                          ЛОЛШТО? :)
                                      –3
                                      Есть еще firebug и dragonfly
                                        –1
                                        разработчики хабра надеятся на отсутствие XSS? почему нельзя было встроить защиту от CSRF, а не перекрывать кроссдомен? если они потом захотят API сделать, да забудут про происшествие, и опять включат кросс-домен?
                                          –2
                                          и кстати, я правильно понимаю, что все LiveStreet более старших версий уязвимы?
                                            +5
                                            Хабр не на LiveStreet-е. А сам LiveStreet использует token-ы очень давно (если не с момента создания вообще).
                                              +4
                                              Дожились… Оказывается habrahabr подняли на Livestreet :)
                                                +1
                                                Ну это известное заблуждение многих хаброжителей. Вплоть до того, что в каком-то из топиков в каментах было заявление о то, что нет народ, хабра крутиться не на LiveStreet-е.
                                            0
                                            API у ХабраХабра, кстати, есть. Документация.
                                              0
                                              там только GET-действия
                                            +7
                                            Забавно, заготовка этой же статьи про csrf на Хабре лежит локально)
                                            А если бы копали дальше — нашли бы кое что с SQL, там уже интереснее :) все времени докопать нет.
                                            • UFO just landed and posted this here
                                                –10
                                                Насколько я понимаю — нужно было всего-лишь послать правильный запрос? Тогда это также можно сделать модифицировав трафик с помощью HTTP дебаггера Fiddler2, или-же используя например IEWatch для ручного построения нужного запроса.
                                                  +4
                                                  авторизационная cookie нужна еще, чтобы проголосовать от имени человека
                                                    –8
                                                    Ну а при чем здесь авторизация? И в первом и во втором случае вы авторизуетесь как обычно — через броузер. Вот дальше нужно послать специальный запрос, содержащий кроме куки, еще и X-Requested-With? Я правильно понимаю?
                                                    Если правильно — то добавить этот хедер можно с помощью Fiddler2 перехватив и модифицировав трафик вашего броузера. Также этот запрос можно построить с помощью билдера запросов в броузере (если таковой имеется в броузере).
                                                      +2
                                                      И да и нет. Вы правильно поняли, что нужно составить правильный запрос, но не правильно поняли кто его должен послать. Посылать его должна жертва, а нашедший уязвимость. В этом и состояла вся задача, решить которую удалось с помощью Flash.
                                                        +2
                                                        Читайте внимательно: Уязвимость в том, что другой пользователь Хабра, открыв популярное приложение на vkontakte, автоматом проголосовал злоумышленнику в Карму…
                                                        • UFO just landed and posted this here
                                                            +1
                                                            Я тут где-то на Хабре видел топик о кейлогере во Flash. Так что когда обратно заходить будете, он вас и поймает :-)
                                                            Уж лучше проголосовать за топик, чем дать полный доступ к аккаунту.
                                                      +2
                                                      … запрос нужно выполнять с браузера жертвы… (авторизованного и не голосовавшего хабраюзера) — вот что пропущено вами и всеми подобными комментаторами
                                                        0
                                                        не голосовавшего хабраюзера
                                                        Это есть в топике
                                                          0
                                                          а это ответ не Вам :) это на коммент r_ii с http-дебаггерами
                                                      –10
                                                      Все слишком сложно. Вы не пробовали консоль хрома? Прекрасно работает на любом домене
                                                        +2
                                                        Запрос будет только с вашими куками.
                                                        –3
                                                        Возможно, нетерпеливый читатель уже решил, что я нашёл элементарную, очевидную каждому дыру? Как бы ни так! Все мои попытки подделать запрос приводили к одному и тому же:

                                                        Брр, мож я чего не понял. Запрос, заголовки XML request, кроссдомены… А разве дырка не тупо в том что на серверной стороне не сверяется сессия пользователя? И никакие ид юзера передавать в скрипт не нужно, хост должен узнать пользователя и так — если тот «законопослушный» и дал верный SID.
                                                          +1
                                                          Проблема не в сессии, она и так проверяется.
                                                            0
                                                            Не проверяется сам ли пользователь нажал на стрелочку или кто-то это сделал без его ведома.
                                                              0
                                                              Точнее проверяется, но не точно. Я смог обойти эту защиту. Уязвимость исправили и сейчас уже так не сделать.
                                                            +2
                                                            Неплохо так автору подняли карму ))
                                                              0
                                                              Она и в жизни теми же способами поднимается :)
                                                              0
                                                              > Если у вас нет сайта, то думая договариваемся за Profit с владельцем крупного приложения ВКонтакте и заливаем код к нему. Охват 50% пользователей гарантирован.

                                                              50% пользователей этого приложения будут залогинены на хабре?
                                                                +1
                                                                Ага, 50% сидят на ферме
                                                                0
                                                                Я надеюсь получить мои куки с хабра и послать их куда-то никакое флеш приложение не может?
                                                                  0
                                                                  Получить — нет, послать — только на страницу в домене habrahabr.ru

                                                                Only users with full accounts can post comments. Log in, please.