Принцип домино или XSS на крупных сайтах рунета

    На странице регистрации нового аккаунта Mail.ru не фильтровались поля 'Имя' и 'Фамилия', в следствии чего туда можно было вставлять скрипты и регистрировать пользователя чьим именем был скрипт (до 80-ти символов). На самом Mail.ru эта уязвимость никак не отражалась, а проявляла себя на тех сайтах, что использовали авторизацию через Mail.ru, и на тех сайтах, что использовали авторизацию сайтов, использовавших авторизацию через Mail.ru :)
    Вот так было до исправления уязвимости:
    image

    Так после:
    image

    А так во время (для комфортного просмотра ставить 1080p):



    Такие дела.
    Вроде бы на момент написания этого поста Mail.ru уже поправили этот баг.

    Мой предыдущий пост, посвящённый XSS

    UPD: Получил письмо от суппорта. Уязвимость закрыли, поблагодарили.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

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

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

      +5
      << для комфортного просмотра ставить 1080p
      Мне кажется, с моими 1366*768 это будет не очень комфортно.

      << На странице регистрации нового аккаунта Mail.ru не фильтровались поля 'Имя' и 'Фамилия'
      Жесть, крупный же портал, а на таком подскользнулись.

      Как долго они исправляли уязвимость?
        +3
        Насколько я помню, я написал им вчера ночью, переписывался сегодня и где-то часа 2-3 назад они исправили.
          –5
          Поздравляю, вы познакомили сотрудников мэйл.ру с регулярными выражениями!
          +3
          Забавная штука в том, что для сайта Mail.ru такое имя пользователя не несло никаких последствий.
            +7
            А если не секрет, как давно Вы обнаружили данную уязвимость? :)
            • НЛО прилетело и опубликовало эту надпись здесь
              0
              Спасибо, теперь буду знать.
              +28
              А при чем здесь mail.ru? они наоборот дают пользователю максимум — даже такие «экзотические» имена без последствий для других пользователей. Это же бага livejournal, то что они не фильтруют имена.
              А вообще самая правильная (но самая трудоемкая) стратегия сохранения пользовательских данных — as is. И квотировать их на выводе.
                –9
                а как же sql-инъекции?
                  +1
                  Для того, чтобы сохранить данные as is нужно сделать экранирование для SQL и в базе данные будут храниться в том виде, в котором их ввёл пользователь.
                  +2
                  Почему самая трудоемкая? Только SQL экранирование при записи в базу, и html или json при выводе в html или json. Не нужно придумывать фильтр, который будет экранировать и sql, и html, и json, да ещё так, чтобы хоть что-то от вводимой информации осталось.
                    0
                    Потому что проще один раз зафильтровать при вводе, чем искать все места, где нужно фильтровать при выводе.
                    Один разработчик написал интерфейс получения данных из базы. Он данные не фильтрует, потому как мало ли где они будут нужны. Другой разработчик написал универсальный html контейнер, который выводит данные и думает, что все пришедшие к нему данные уже отфильтрованы. теоритически надо писать фильтр прослойку между ними, но третий разработчик видит два компонента и соединяет, потому что один получает данные, а другой выводит. И таких мест может быть очень много. Вот поэтому и появляется соблазн писать в базу уже фильтрованные значения
                    • НЛО прилетело и опубликовало эту надпись здесь
                        +1
                        гигабайты — не смогут конечно, nginx отвалится по post size limit`у
                        а вообще размеры не плохо бы задавать прямо в базе: varchar даст вставить только сколько нужно. Типы данных, они для этого и нужны :)
                        • НЛО прилетело и опубликовало эту надпись здесь
                            +1
                            А как вставить 1024 раза по мегу? Если, например, у юзера есть имя (предположем varchar 50)
                            те 1024 раза можно создать юзера, но для этого надо уже использовать бота и с другой стороны баррикад буду средства противостояния ботам.
                            Потом при проектировании бд нужно провести анализ того, что будет в ней хранится, как сделать так, чтоб даже если в бд будут миллионы записей, она бы нормально работала.
                            Вообще, саме лучшее решение — активное использование мозга.
                        0
                        > зафильтровать при вводе

                        но ведь это уже не

                        > самая правильная (но самая трудоемкая) стратегия сохранения пользовательских данных — as is
                          +1
                          Да, я написал, что проще всего зафильтровать, и это самая первая мысль, которая может придти в голову при борьбе с XSS. И написал, почему она может придти в голову, но при кажущейся простоте и изящности — она неправильная. Юзеру плевать на наши проблемы фильтраций XSS
                  0
                  Мне представилась возможность посмотреть это видео ещё до устранения уязвимости.
                  Действительно epic win :)
                    +28
                    Получается, что XSS был не у mail.ru, а был (и есть) у сайтов, которые доверяют внешним входным данным (в данном случае, логину от mail.ru) и выводят его в сыром виде. Я правильно понял?
                      +22
                      Да, всё так и есть.
                        +1
                        То есть я и сейчас могу создать свой openid провайдер, который будет намеренно эксплуатировать ту же уязвимость, которую ненамеренно эксплуатировал mail.ru? А lj в курсе?
                      –8
                      мне кажется, со стороны mail.ru было бы логичнее фильтровать введенные данные, а не те, которые выводят.
                        0
                        А чего вы его минусуете?
                        Т.е. не всем пользователям mail.ru можно использовать свой аккаунт для авторизации?
                        Если уж добавляете такой API, то будьте добры — следите за ним.
                          –4
                          Ааа, чёрт. Извините, не подумал, когда писал, что речь о банальном XSS идёт.
                        0
                        Только не «логину от mail.ru», а имени и фамилии пользователя.
                        –7
                        У меня иногда складывается впечатление, что программисты mail.ru совершенно незнакомы с XSS-атаками. С момента запуска, их находят пачками на их сервисах…
                          +9
                          так это XSS из сайта не касалось, касалось всех остальных, только =)
                            –6
                            Ну, во-первых, mail.ru при регистрации неотфильтровало, введенные данные
                            А, во-вторых, могу ошибаться, но фильтры не стояли в API, из-за чего и срабатывает xss

                            Так что это еще хуже: ладно бы это только их касалось, а так это подстава для сторонних владельцев сайтов, которые используют API mail.ru
                              +8
                              Сторонние владельцы сайтов решили, что mail.ru должен экранировать свой вывод, хотя такая функция нигде в документации не упоминается? Fail Сторонние владельцы сайтов доверяют внешним данным? Epic Fail Может ещё авторы telnet должны им экранирование обеспечить?

                              Я вот даже тому, что сам в БД или файл записал не доверяю
                          +1
                          «Прозвище лучшего друга — Neo. „
                          5 баллов.
                            +7
                            Мне больше понравился адрес в Яндексе:
                              0
                              У них был какой-то вёб интерфейс. Потом сделали новый на ajax и назвали neo. Вторую версию назвали neo2.
                              Вы еще не видели, как у них (в Я.почте) корневой объект для namespace-ов называется ;-)
                          • НЛО прилетело и опубликовало эту надпись здесь
                            0
                            Было бы здорово в такой статье разместить и методы защиты от подобных атак.
                              +4
                              плагин к браузеру NoScript
                                0
                                это с точки зрения пользователя, а с точки зрения разработчика — фильтровать вводимые данные и данные из вне
                                  –1
                                  Зачем фильтровать вводимые данные? Фильтровать нужно вывод и для, например, html одни фильтры, а для json — другие.
                              +7
                              Вы прям ТС имели ключ ко всем дверям.
                                0
                                Джим Мориарти?
                                +12
                                Морфеус, перелогинтесь
                                  +6
                                  Ох, как можно было накуралесить с этой XSS, особенно с Яндексом, да в особо грамотных руках.

                                  В данное баге все виноваты. Не проверяют входные данные на всех используемых системах. Получается, что при авторизации с дружественной системы разработчики положились на сознательность сторонних сервисов, что они все уже проверили при регистрации пользователя.
                                    0
                                    API mail.ru отдает не HTML, а текстовые данные в JSON. Кодировать данные из плейнтекста в HTML, если они выводятся в HTML, это не прихоть, это необходимость. Помимо угловых скобочек бывают еще и амперсанды и кавычки. А сознательность и доверие тут, в общем-то, непричем.
                                    +18
                                    Ой, сколько вы денег потеряли…
                                    –1
                                    Не очень в этом всём разбираюсь, так что вот такой вопрос (не только к автору поста):
                                    Как опасна была такая XSS с точки зрения «exploitable»? Насколько я понял, скрипт мог запуститься, только если жертва зарегистрируется в определенном сервисе, используя заранее зарегистрированный злоумышленником аккаунт в mail.ru. То есть данная XSS должна была быть приправлена нехилой соц-инженерией?

                                    P.S. (Теперь к автору). Надеюсь, что фильтрация ввода у них не только на уровне JS идет?
                                      0
                                      Не знаю, спросите у них сами.
                                        +7
                                        можно было выполнить любые действия от пользователя, который смотрит на это имя\фамилию. То есть писать комменты, голосовать, утянуть кукки пользователя в конце концов.
                                          +8
                                          Вы плохо смотрели видео. Там автор оставил от имени этого пользователя коммент в ЖЖ другого человека, и при просмотре кем угодно этого ЖЖ выполнялся скрипт автора.
                                            +1
                                            Можно наугад. Допустим массово запускаем акцию, ждём 1 процента из тех, что попадутся, далее что то с этим делаем.
                                            В любом случае (как и в случае с классическим XSS) надо завести пользователя сервиса на свою страницу. Так что разницы особой нет.
                                              +3
                                              Разница есть, тут можно завести пользователя на одну из тысяч чужих хорошо посещаемых страниц.
                                              0
                                              Спасибо всем отписавшимся. Теперь понял: очень серьезная уязвимость. Видимо, для высокой безопасности сайтов с критичными данными и возможностями (регистрационная почта, банки) нужно использовать отдельную копию браузера (которая будет использоваться только для таких сайтов). От JS отказываться не хочется.
                                                +1
                                                Уязвимость действительно серьёзная, но вот в крайности впадать не стоит. И если у тебя захотят увести мыло, то вряд ли тебе какой-то «другой» браузер поможет…
                                                  0
                                                  Тут дело в том, что активную XSS в интернет-кошелек протолкнуть будет трудно. А пассивную XSS — проще (как уже показано в предыдущем топике о Яндекс.Деньгах того же автора). Таким образом, использование отдельного браузера для строго определенного типа сайтов сможет уберечь от пассивных XSS, так как зараженный сайт и уязвимый сайт будут работать в разных браузерах (и, соответственно, cookie уязвимого сайта не будут доступны для зараженного). Есть, конечно, и такой вариант: пока открыта и еще не закрыта сессия на сайт с критичными данными, не открывать и не держать открытым никакие другие сайты. Однако это не так безопасно, так как у многих людей в браузере навешаны JS-расширения, которым тоже не следует слишком доверять :)
                                              –2
                                              Ох, дядя, какой же ты добрый… Я как представлю сколько можно было с таким сделать, так слюни текут
                                                +13
                                                Да ладно, вот если б я по тихому сообщил об уязвимости, не делал никаких постов, не записывал никаких видео — вот это был бы поступок настоящего альтруиста. ;)
                                                  –11
                                                  Если бы еще Вам заплатили за спасение интернета 15k$ — можно было-бы вообще не где не писать.

                                                  P. S. Когда писал сообщение заметил странность, это баг такой на хабре? Google Chrome
                                                  Видео бага: screencast.com/t/hVbjnOfmb

                                                  Не могу в Q&A писать, топик создать тоже. Карма маленькая.
                                                    0
                                                    Данный «баг» достаточно подробно описан:
                                                    habrahabr.ru/info/help/qa/ — последний абзац
                                                    habrahabr.ru/info/help/karma/
                                                      +2
                                                      Баг не состоял в том, что я не могу создать QA или почему у меня плохая карма и я топики не могу создавать.

                                                      Баг в том, что после нажатия на написать при опр-условиях — продолжает идти анимация и блокирует у меня кнопку. Про карму и QA я написал чтобы объяснить написание комментария именно в данном топике.
                                                        0
                                                        Значит прошу прощения, не правильно Вас понял…
                                                          +1
                                                          Да меня многие наверно не так поняли. Если можете — сообщите кому надо. Видео есть выше.
                                                +2
                                                the matrix has you too лучше все-таки было с двумя o написать :)
                                                  +2
                                                  да, в видео хорошо видны мои колебания по этому поводу :D
                                                  +2
                                                  Ну вот. С видео Ваши статьи стали более наглядными. Думаю, и по голосованию преимущество этой статьи над прошлой будет заметно. Так держать!
                                                    +1
                                                    Если б по первому посту видео делал, там бы интереснее было: там фильтрация символов стояла, там кодирование в URL, там куки на снифер отсылались :)
                                                      0
                                                      В таких видео свои куки будет довольно сложно закрывать. Так что тут палка о двух концах. Я долго видео редактирую перед заливкой на Хабр, закрываю палево всякое. Это занимает львиную долю времени. Где-то 60-70%
                                                    0
                                                    А OMG разве не закрылся? Или это был финальный вброс аналитика?
                                                      0
                                                      Саппорт Mail.Ru уязвимость закрыл? Надо бы проверить… Вдруг можно их фильтры пройти, закодировав код
                                                        0
                                                        Отпишитесь, дабы другие не полезли проверять ;)
                                                        +2
                                                        С каждой минутой просмотра челюсть моя опускалась все ниже…
                                                        По эпичности это сравнимо со сливом исходников из за неправильного экспорта svn, только в масштабах рунета.

                                                        Обидно что ТС вряд ли будет вознагражден материально, особенно учитывая возможные последствия от эксплуатации этой уязвимости…
                                                        PS: Соблазн использовать уязвимость был? :)
                                                          –1
                                                          да, кстати: материальное вознаграждение автора изрядно подняло бы карму mail.ru
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                            0
                                                            Ну допустим XSS червяк в случае с хранимой xss на некой блогоплотформе.
                                                            Схема работы — автор червя запускает его в своем блоге, все, кто открыли его блог, автоматически запостили в свой блог тот же самый код.
                                                            Червь распостраняется по всей платформе, парализуя работу, либо перенаправляя пользователей на другой сайт(как вариант с эксплоитами), и в дополнение похищая персональные данные из профилей (фио, емейл, телефон) и отправляет на сторонний сайт.
                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                0
                                                                Рано или поздно это случится =) Правда, надо чтобы сайты поддерживали ваш сайт — openID-провайдер. Если его нет в основном списке, надо ковырять, смотреть, как именно оно работает и кто кому какие данные передаёт
                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                  0
                                                                  надеюсь вопрос риторический.
                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                      0
                                                                      Золотое правило — никогда не доверять данным, пришедшим от пользователя/внешних источников.
                                                                      Мейл.ру не фильтрует данные пользователя — проёб
                                                                      Сервисы доверяют данным Мейл.ру — проёб
                                                                        0
                                                                        > Мейл.ру не фильтрует данные пользователя — проёб

                                                                        Mail.Ru не доверяет и фильтрует данные от пользователя, но только на выходе, тем самым данной XSS в его зоне отвественности (почта и остальные сервисы) нет.

                                                                        Если данные фильтровать на входе, то каким образом это делать? Строго определить минимальный набор символов для каждого внешнего поля? Естественно, это усложнит поиск бага. Но в настоящее время количество таких полей огромно, а большинство программистов задумывается о безопасности не в самую первую очередь: им важнее вложиться в сроки и бюджет. Вот тут и возникает узкое место, где легко допустить ошибку по причине спешки или из-за незнания всех тонкостей.

                                                                        > Сервисы доверяют данным Мейл.ру — проёб

                                                                        Именно: из этого можно вынести только один урок, что ненадежными являются не только пользовательские
                                                                        данные, но и от внешних сервисов. ЖЖ рассматривало имя пользователя от mail.ru как безопасное.
                                                                +1
                                                                Через XSS можно получить доступ к аккаунту пользователя незаметно. А в случае использования техники xss tunnell можно сделать прокси из браузера жертвы и ходить от имени его браузера на сайт в контексте того сайта, где произошла атака:

                                                                Tunnelling HTTP Traffic Through XSS Channels: XSS Tunnelling is the tunnelling of HTTP traffic through an XSS Channel to use virtually any application that supports HTTP proxies. This paper explains the idea and the real world implementation.


                                                                Демонстрация:

                                                                www.youtube.com/watch?v=OZghFrJ4P-g
                                                                +4
                                                                Еще раз поясню. Никакой подобной уязвимости в mail.ru не было и нет. Уязвимость — в других сайтах, которые *неправильно* подключили авторизацию через mail.ru. Я не вижу ни одной причины, почему никнейм пользователя не может например содержать слова script, document и cookie. Может, этот никнейм отражает уникальные черты характера пользователя.

                                                                Более того, я считаю, в целях улучшения образовательного уровня сторонних разработчиков mail.ru не должен был запрещать использование тегов в имени. Пусть разработчики сами исправляют то, что накривокодили.

                                                                Справедливости ради, ручное экранирование всех выводимых строк — дело муторное, легко сделать ошибку, лучше делать это на уровне шаблонизатора, как в django или на уровне объектов-строк, как в лебедевском Parser, или еще как-то, но автоматически.

                                                                Те, кто не хочет использовать «умный» шаблонизатор или маркеры типов строк, а тупо лепит [? php echo $userName ?] или использует mysql_query («INSERT INTO table {$_POST['username']}») вместо плейсхолдеров в запросах — ребята, вы сами себе злобные буратины, с таким подходом у вас всегда будет куча уязвимостей. Иногда мне кажется, что разработчикам PHP надо было встроить htmlspecialchars прямо в оператор echo (а в mysqli и PDO — нормальную поддержку нормальных плейсхолдеров).

                                                                  +2
                                                                  «Я не вижу ни одной причины, почему никнейм пользователя не может например содержать слова script, document и cookie»
                                                                  +1
                                                                  Под такой саундтрек как в видео, можно снимать вид из окна и будут смотреть и слушать :)
                                                                    –2
                                                                    Довольно позорно для mail.ru, плюс закрыли баг не очень удачно (запрет тегов). В версии которую разворачивают для тестеров всегда должен быть по умолчанию пользователь/аккаунт/итд вида
                                                                    <button>Hello</button> (интересно как это отоброзит парсер).
                                                                      0
                                                                      Невнимательно прочитал: в mail.ru все работало хорошо.
                                                                      +1
                                                                      Браво уникально честному Человеку-Димке!

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

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