6 XSS на Хабрахабр и методы защиты с их последствиями

    image

    Как-то мне стало интересно, сколько же стоят корпоративные блоги на Хабрахабре. Я зашел на эту страницу и перешел по ссылке заказать. Автоматом, вместо ожидаемых данных, ввел вектор для тестирования XSS и получил выполнение JS у себя в браузере. Но это не всё так интересно, как методы защиты на Хабре от последствий XSS.

    Защита. HTTP Only


    Выполнив XSS в двух полях на шаге 2 и в четырех на шаге 3 стало интересно, что можно с этим сделать. Наиболее стандартный вектор атаки при возможности провести XSS — это «слить» сессию авторизации и подставить себе. Обратившись к кукам я увидел, что для PHPSSESID используется флаг HTTP Only, что запрещает обратиться к данной куке через JS. Т.е. даже внедрив злобный JS код мы не можем «слить» сессию пользователя и подставить к себе (чтобы быть авторизованным под пользователем, классический вектор атаки). Есть методы обхода этой защиты, на некоторых версиях апача (а тут nginx, так что отпадает) и через использование плагинов в браузере, но все вектора ломает следующий пункт.

    hint: Чтобы phpsessid имел флаг HTTP Only нужно выставить в php.ini следующее значение: session.cookie_httponly = true

    Защита. Anti-CSRF protection


    Так как мы имеем дело с XSS через POST, то в таких случаях используется эксплуатирование XSS через CSRF. Атакующий создает у себя на сайте идентичную форму, как и на уязвимом ресурсе, с уже заполненными данными (помещая в уязвимые поля вектор для XSS) и помещает ее в скрытый фрейм на своем же сайте. Когда атакуемый юзер откроет сайт с этим фреймом и формой — он автоматически отправит данные на Хабр и выполнит в своем браузере злобный JS. Но, есть отличие — поле HTTP Referer будет содержать домен сайта атакующего.

    В статье На пути к созданию безопасного веб-ресурса. Часть 1 — серверное ПО я рассматривал следующее правило в nginx (которое можно реализовать прямо на уровне веб-приложения) как грязный хак:

    # ANTI CSRF HACK
        valid_referers blocked example.com www.example.com;
        if ($invalid_referer) {
        set $possible_csrf 1;
    }
        if ($request_method = POST) {
        set $possible_csrf "${possible_csrf}2";
    }
        if ($possible_csrf = 12) {
        return 403;
    }
    


    И вот он, яркий пример — Хабрахабр, использует это правило. Т.е. мы не можем отправить POST запрос на сервер с другого сайта — получим 403. В итоге, мы можем исполнить JS код только у себя в браузере.

    hint: защита от CSRF спасает от последствий XSS через POST, что сводит уязвимость на нет.

    Атака. Cookie injection


    Но всё же, может еще есть лазейки? Продолжив изучать, как работает форма, наткнулся, что данные, заполненные в форме заявки, временно сохраняются в какой-то кэш на сервере (может, memcache). Этот кэш связан не с пользовательской сессией (PHPSESSID), а с другой — habrsession_id. Т.е. сгенерив уже форму с XSS вектором и подставив нашу куку habrsession_id другому юзеру мы, теоретически, можем провести атаку. Но мы не можем (в стандартных условиях) установить значение cookie на другом домене. Но есть способ — Cookie injection.

    Заключается он в анализе JS кода приложения и вызовов установки значения document.cookie. Если найдется DOM XSS или такие условия, которые позволят внедрить своё значение Cookie (например, какая-то тестовая кука которая выставляет себе значение titile'а текущего окна (мы можем открыть окно через window.open со своим title, встречаются случаи в реальных системах), атакующий может записать свое значение habrsession_id атакуемому и выполнить JS. На данный момент все XSS исправлены. Если что-то найдете — сообщайте службе поддержки, очень оперативно отвечают.

    hint: в статье В поисках лазеек: гид по DOM Based XSS описаны моменты, откуда ждать подвоха с DOM XSS.

    P.S. И хинт не по теме топика: Пока писал топик, не сохранял его и случайно нажал ф5. В итоге, на одном из моментов, потерял весь текст статьи (когда уже её почти дописал, кнопка «восстановить» не помогла). Мгновенно сделал дамп процесса через обычный диспетчер задач, открыл его через HxD, нашел по ключевым словам своей текст статьи (русский текст был в json) и подставил сюда. Львиную долю статьи восстановил.
    Метки:
    Digital Security 113,19
    Безопасность как искусство
    Поделиться публикацией
    Комментарии 50
    • +2
      На правах оффтопа: Недописанные топики на хабре автосохраняются. Появляется зеленая плашка вверху «У вас есть автосохранение от… Восстановить? „
      • +1
        Да, я использовал её, но почему-то вернул изначальную статью, еще без моего текста.
        • +1
          Может потому, что вы над ним издевались? :)
      • +1
        Что такое HxD?
      • +2
        (извиняюсь, голова уже не соображает)
        • +11
          На моей памяти последнего кто так выложил дыры забанили
          • +3
            Живет пост, вроде нормально ) habrahabr.ru/post/176481/
            Да я и спросил, прежде чем опубликовать. Хоть они и не особо были «за», но явного противоречия не было. Да и я считаю, что статью опубликовать надо, так как Хабр показал правильный пример, который может пригодиться многим.
            • +2
              да вот нет, тот пост про который я имел ввиду был удален, автор забанен
              вообще я ЗА таких постов, это что ли показатель, даже не знаю как объяснить, вообще правильные посты
              P.S. вы молодец :)
              • +1
                Ну я предполагаю что бан был из-за того, что сначала был пост а не предупреждение по почте? если все грамотно, сначала почта потом пост то думаю все будет ок
            • +9
              Если пользователь у нас спрашивает о публикации, то никто его не забанит.
              • +3
                OFFTOP PS Твой ник видел как-то давно на хакерских форумах лет 4-5 назад, не ты случаем =)?
                • +3
                  Да, он — один из тех скромных хакеров, сам не признАется, но Гугл всё помнит.
                  • +8
                    Круто, это ж надо умудриться — и сам спалился и другого спалил
                    • +2
                      Там не было ничего такого я вас уверяю =)
                  • +1
                    Isis из DaMaGeLaB, ЭТО ТЫ?! :)
                • +2
                  Опасный ты человек
                  • +21
                    Автоматом, вместо ожидаемых данных, ввел вектор для тестирования XSS

                    И правда, суров.
                    • +1
                      привычка вторая натура
                      • +3
                        <scri… ой простите, здравствуйте
                      • 0
                        Если честно, уже привык так делать. Из интереса, что ли.
                    • 0
                      Интересный метод восстановления утерянной статьи. Хотя хромоводам все равно придется непросто :)
                      • 0
                        У меня в Хроме для этой цели стоит расширение Lazarus: Form Recovery
                      • 0
                        Почему? Я хром дампил. Сделал все за пару минут :)
                        • +1
                          Ничего Дампить не надо было. В хроме есть Дев. Тулс, а Хабр сохраняет весь текст в локал-сторадж.



                          Ваш кэп )
                          • 0
                            Ну, он же и забирает в восстановление формы с Local Storage? Там было пусто, когда нажал «восстановить».
                            В любом случае — спасибо, не знал :)
                            • 0
                              Тут у них такой юзабилити-баг: если последнее действие перед закрытием формы было случайное удаление набранного текста, то запомнится последнее состояние после удаления текста. Лучше, если бы скрипт отслеживал резкое уменьшение объёма и сохранял варианты. До этого эволюция ещё не дошла.
                            • –1
                              Еще один хакер

                              А вот с комментарием этот трюк не сработал. Не увидел я текста коммента в локал стораже после F5
                              • 0
                                Зачем сразу обзываться 8)
                                Однако Вы правы, в локал-сторадже я увидел только блого-записи, но не комменты :(
                        • –2
                          Хинт зачетный
                          Но вообще меня такие люди пугают
                          Кругом хакеры
                          • +3
                            Настоящие хакеры скромно молчат о том, во что обошлись Хабру все эти заплатки защиты.
                          • 0
                            а что если реферер пустой? ;)
                            • 0
                              При сабмите формы?
                              Я пробовал обойти через habrahabr.ru.evil.com (думал, мб регуляркой ошиблись?) — не прошло. Пустой / не задавать вообще — получим тот же результат.
                              • 0
                                Так стоит ли (безопасно ли) на сайте при проверке реферера пропускать все запросы где реферер пустой? Т.е. считать такие запросы легитимными.

                                Просто многие программы которые пользователи себе устанавливают и некоторые корпоративные прокси рубят рефереры в запросах пользователей и если проверять реферер на чёткое соответствие, то такие пользователи не смогут пользоваться сайтом вообще.
                                • 0
                                  Стоит реализовывать нормальную защиту токенами.
                                  Ну, на примере Хабра видим — что все ок, блокируют все не хаброрефереры, включая пустые. Значит жалоб не было.
                                  P.S. Как-то я пытался найти хоть 1 проксю в компаниях, которая режет рефереры — не нашел.
                                  • 0
                                    Про защиту токенами я тоже знаю, но не уверен что самый лучший вариант.
                                    В моём случае — просто генерирую на сессию токен и подставляю его во все формы в скрытое поле.
                                    При посте формы сверяю токен в сессии и из формы, не совпало — в сад. Суть защиты что посторонний человек не знает чужого токена. Так?
                                    • 0
                                      Да, все верно. Гугл тоже в некоторых местах генерит один токен на всю сессию.
                                      • +2
                                        >Про защиту токенами я тоже знаю, но не уверен что самый лучший вариант.

                                        как раз самый лучший. Реферер не показывает что запрос легитимен, он лишь показывает автора. Знание токена выражает подлинность запроса куда лучше.
                                        во флеше и прочих плагинах всегда находили баги. совершенно не защита
                              • 0
                                Мэн, ты крут! Вырвал таки креатиф из цепких лап дампа памяти!
                                Но вот этот последний пассаж как-то испортил впечатление =(
                                Много лучше было бы не припиской самоутвердиться, а статьёй оформить — много полезнее для читателей хабра, сообщества, кармы здесь и вообще =)
                              • +1
                                Хабр на PHP что ли написан? О_о
                                  • 0
                                    А почему бы и нет?
                                    • 0
                                      Хотя бы поэтому: habrahabr.ru/post/142140/

                                      Прежде чем минусовать, пожалуйста, пройдите по ссылке и хотя бы просто пролистайте статью до конца, чтобы оценить количество пунктов.
                                      • +1
                                        PHP как демократия — очень плох, но лучше пока не придумали. Какой-нибудь питончик может и лучше, по тем правилам которые вы сами для себя придумали, но реальная жизнь круче тем, что оценивает все факторы сразу, а не только те которые подходят под вашу точку зрения.
                                        Смысла холиварить в каждом посте нет, если ПХП действительно так плох, как вам кажется, он умрет сам, без лишних потуг со стороны хейтеров.
                                        • –2
                                          Я считаю, что PHP — это как дешевое пиво. Паршивое, зато в каждом ларьке продается задешево.

                                          Разделяю мнение, что Python и Ruby проигрывают PHP в популярности только в более высоком пороге вхождения: для работы с ними требуются какие-никакие навыки POSIX, в то время как с PHP достаточно уметь отредактировать файл в Блокноте и залить его на говнохостинг по FTP или даже через вэб-интерфейс.

                                          К слову, популярность Python и Ruby на Западе гораздо выше, чем в России — думаю, именно благодаря более высокому уровню компьютерной грамотности. На Западе вэб-разработчик, не умеющий работать в консоли — нонсенс, а у нас — часто встречаемое явление

                                          Ну а насчет «лучше PHP ничего не придумали», это вы, конечно, сгоряча. Да и логика про «демократию» — странная. Если в стране большинство ездят на Жигулях, это по-вашему значит, что лучше Жигулей ничего не придумали? :/
                                        • +2
                                          Вы не поняли, я совершенно не люблю пхп, можно даже сказать что меня начинает тошнить, когда мне приходится что-то на нем писать. Но тем не менее, в умелых руках даже на нем можно делать достойные вещи. А с учетом того, что он, по сути, является стандартом в области веб-разработок, я не вижу ничего удивительного в том, что хабр на нем написан. И да, я вас не минусовал.
                                    • 0
                                      все вектора ломает

                                      на каждый вектор найдется…

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

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