Google Chrome хакеру не помощник

    О том, как Chrome мешает мне искать XSS-уязвимости.
    


    Почему я ищу уязвимости?


    Как и многие из вас, я делаю Code Review и первое, что ищу это конечно уязвимости. Когда уязвимость найдена в коде, хорошо бы проверить есть ли она на самом деле через браузер, потому что бывают «ложные тревоги». Это те случаи, когда данные уже приходят фильтрованными и XSS невозможен. Всегда полезно иметь возможность показать разработчику атаку в действии, потому что это хороший аргумент и помогает быстрее перейти к конструктивному решению проблемы, если есть сомнения, что уязвимость таки существует. Но проверку в браузере я делаю не часто — либо проблема очевидна прямо из кода, либо верят на слово. В общем искать уязвимости — это интересно.

    Начало этой истории


    Друг скинул ссылки на сайт, который ещё год назад имел XSS-уязвимость, о чем я писал владельцам ресурса. Стало интересно проверить снова. Проверил — XSS есть, но вот простейшего подтверждения выполнения JS я получить не смог!..



    Я не ломаю сайты и не занимаюсь аудитом безопасности, поэтому возможно то, что я выяснил давно известно для специалистов, но для меня это было открытием.

    Первые подозрения


    Итак, стал проверять всевозможные варианты внедрения кода — но без результата. По ходу дела выяснил что и как фильтруется, какие есть проверки и прочее, но alert(1); упорно не выполнялся. По ходу дела нашелся ещё и XSRF — приятный бонус!

    Возникло подозрение, что браузер меняет код, который он получил от сервера. Попробовал wget'ом получить HTML-код страницы — таки да, меняет, но странным образом. Сначала я подозревал, что он пытается закрывать теги, чтобы починить поломанную разметку, но оказалось, что дело в другом. Все это время я пользовался Google Chrome и мысль попробовать другой браузер как-то не приходила в голову (а зря!).

    В конце концов простейшая проверка на XSS в FireFox дала положительный результат — супер! Я таки доказал, что уязвимость есть, но не понятно почему ничего не получилось в хроме?!.. Я понимаю, что браузеры могут один и тот же код рендерить по разному, но хром таки выкусывал мой внедренный код, как бы изощренно я это ни делал! Скриншот из хрома, где ссылка на внешний JS-файл заменена на about:blank:



    Таким образом, можно атаковать пользователей ФФ, Оперы, ИЕ, но не Хрома. Это какое-то ущемление пользователей. Проблема не давала мне покоя и причина таки была найдена! Оказалось, что Google Chrome с 7й версии имеет фильтр XSS (Cross Site Scripting Auditor! Именно этот XSS Auditor и не давал мне возможность провести проверку наличия XSS.

    Причина ясна, но проблема не решена. Неужто Chrome стал непреступной крепостью?! Разве нет возможности этот фильтр обойти?! Если это так, что стоит всем рекомендовать использовать Chrome и забыть про XSS. Жизнь становится все проще и лучше!

    Как обойти XSS Auditor в Google Chrome?


    Но ведь не может так быть — верно? Вот и я не поверил.



    Нужно же как-то обойти XSS Auditor в Chrome, чтобы восстановить вселенское равновесие. Я нашел такие способы:
    1. Нужно запустить браузер с ключом --disable-xss-auditor. Отлично подходит для тестирования.
    2. Если вы контролируете 2 параметра, то они вставляются в 2х местах на странице. Разбиваем код на 2 части и используем многострочные комментарии, чтобы закомментировать HTML между этими 2мя точками — подробности в Issue 96616: Security: Google Chrome Anti-XSS filter circumvention
    3. Если есть возможность оставить один тег незакрытым, то бразуер сам попытается его закрыть. Причем сначала отработает XSS Auditor, а затем браузер попытается закрыть теги.
    4. Отправить специальный HTTP-заголовок, который отключает XSS Auditor (Пруф):
      header("X-XSS-Protection: 0");


    Выводы


    Использовать Google Chrome для тестирования XSS без доп. движений не получится — проще взять любой другой браузер.
    А вот защищать себя от XSS вполне получится, но стоит помнить, что гугл использует свой браузер для сбора инфы — так что тут палка о двух концах.

    Что ещё можно почитать?


    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 42
      +9
      Если что-то в chrome может мешать разработчиком, обязательно есть флаг, чтобы это отключить.
        0
        Ага, например, disable-web-security, что очень круто и чего не хватает в других браузерах
          0
          Мне мешает интерактивная HTML5 валидация форм при разработке, как отключить ее флагом я не нашел…
            +2
            открыть в хроме страничку about:flags
            и там есть параметр «Отключить проверку интерактивных форм в формате HTML5»
              +1
              На случай если у себя такой не найдете, у меня в «20.0.1115.1 dev-m» оно есть. В дев-версии оно с самого начала обработки ХТМЛ5 форм.
          +33
          >>гугл использует свой браузер для сбора инфы — так что тут палка о двух концах.
          Я думаю, не такой уж и серьёзный недостаток: фольга нынче дешёвая.
            +2
            фольга нынче дешёвая.

            Да и другие браузеры тоже :)
            +3
            А вот защищать себя от XSS вполне получится, но стоит помнить, что гугл использует свой браузер для сбора инфы — так что тут палка о двух концах.

            Use Chromium, Luke.
              –2
              черт, меня опередили :(
                0
                На хабре постоянно это рекомендуют, но вопрос как поставить этот хромиум? Хром ставиться в два клика. А хромиум — там целая инструкция на сайте как поставить. Прям теория заговора какая-то.
                  0
                  Вам ещё и на линукс надо перейти — в той же убунту он ставится одной командой)
              • НЛО прилетело и опубликовало эту надпись здесь
                  +1
                  В IE фильтр XSS лучше всех пока-что
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Горе-хакеры дальше алерта не пройдут. :]
                  +2
                  А вот защищать себя от XSS вполне получится, но стоит помнить, что гугл использует свой браузер для сбора инфы — так что тут палка о двух концах.

                  По-моему сбор данных Chrmium'a не касается, а XSS Auditor там есть.
                  0
                  Итак, стал проверять всевозможные варианты внедрения кода — но без результата

                  За ссылку спс, будем тестить новые варианты.
                    0
                    В большинстве своем хватает универсального вектора.
                    +4
                    А на самом деле смысл статьи был пропиарить сайт с котами . Какой хитрый трюк однако.)
                      0
                      Да мне просто фотка понравилась, а ссылку я тольео после вашего комментария заметил… Можно, конечно отрезать, но ссылка ведь не кликабельная.
                        0
                        я тоже долго смотрел на него и понял что в нем совместились 2 эмоции. Да шутка про ссылку-то котэчно.
                      +6
                      Google использует интернет для сбора информации. Используй ссылочный FIDOnet, %username%.

                        +1
                        Векторный и гипертекстовый?
                        0
                        а так нельзя было обойти?
                        a = 'http://first' a+='second.co'; a+= 'm' или как он вырезает?
                          0
                          >> Я не ломаю сайты и не занимаюсь аудитом безопасности, поэтому возможно то, что я выяснил давно известно для специалистов, но для меня это было открытием.

                          >> Оказалось, что Google Chrome с 7й версии имеет фильтр XSS (Cross Site Scripting Auditor!

                          Это действительно не новость, не только для аудиторов безопасности, но и для разработчиков. Насколько я знаю, Chrome настораживается, когда в теле ответа встречается ровно то же самое, что и в параметрах из запроса. Из-за этого у девелоперов, которые любят передавать JS код в ответах от сервера и вешать его на события или делать eval такие вещи не работают в Chrome. С учетом того, что текущая версия уже 18, большинство разработчиков, которые такие вещи делали, уже с этим столкнулись. Я сам знаю нескольких.
                            0
                            Согласен, «не новость» для тех, кто держит руку на пульсе, но так как я отслеживаю узкое направление связанное скорее с безопасностью кода, то был просто удивлен, что браузеры взялись за борьбу с XSS — считал, что это должны делать разработчики на уровне кода.
                              +2
                              Защита от XSS в браузерах — это еще не повод забывать о защите на уровне кода.
                              0
                              А в каких случаях необходимо js код получать в ответах от сервера? Просто интересно, действительно ли возникает такая необходимость или это просто привычка девов к говнокоду?
                                0
                                Нет таких случаев, когда без этого можно обойтись. Т.е. бывает удобнее или проще сделать так, но всегда можно сделать по-другому.
                                  +1
                                  Может, все-таки «Нет таких случаев, когда без этого нельзя обойтись»? ))
                                    0
                                    Упс. Спать надо больше, а работать меньше.
                                  0
                                  Просто это удобно, аля RPC
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  +1
                                  Потому что браузер один из инструментов. Нужно выполнить внедренный JS, чтобы подтвердить возможность XSS и легче всего это сделать в браузере. Кстати, а можно ли это сделать из консоли?
                                  А не помощник потому, что мешает мне выполнить мою работу. Да, этот Auditor был добавлен больше 10 релизов назад, но гугление на эту тему дало очень мало результатов и я считаю полезным осветить эту тему. Я потерял много времени пытаясь выяснить причину и хочу помочь другим не повторять мои ошибки.
                                  0
                                  Google Chrome 19 теперь пропускает XSS. Ещё одно подтверждение того, что не стоит полагаться на защиту бразуера, а нужно делать нормальный код.

                                  Кто-нибудь в курсе с чем связано такое изменение? Это случайность или закономерность?

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

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