Мирный XSS

    Эта статья о мирном атомеXSS. Заставим зло работать на добро!

    А зачем?


    Простейший пример всё объяснит:
    Вы разрабатываете веб-сервис, который поставляет данные другим сайтам (погода, данные по торгам в реальном времени, чат и т.п). Вам нужно организовать кроссайтовую передачу данных(данные погоды, торгов, текст чата) на стороне клиента.

    Методы организации XSS

    1. Через тэг iframe
    2. Через тэг script
    3. Через flash<->javascript
    4. Через window.name + iframe + form
    5. Через CSS хак
    6. Через canvas + img
    7. Через прокси

    Сводная таблица по всем методам
    Метод
    onLoad Event
    onError Event
    GET
    POST
    Недостатки
    iframe
    есть
    есть
    да
    нет
    Много элементов, появляется история.
    script
    есть
    нет
    да
    нет
    Создается скрипт
    flash <-> javascript
    ?
    ?
    да
    ?
    Лишняя флэшка
    window.name + iframe + form
    есть
    есть
    да
    да
    Появляется история. Ограничения в некоторых реализациях по объему передаваемых данных.
    css хак
    нет
    есть
    да
    нет
    Лишний тэг.
    canvas + img
    есть
    есть
    да
    нет
    Лишний тэг, тормоза с декодированием. Если пользователь отрубил картинки, то ничего не придет. Плюс: упакованность данных.
    прокси
    есть
    есть
    да
    да
    Необходимо устанавливать серверный скрипт.

    Вкратце о реализации каждого метода



    Через тэг iframe

    Создается тэг iframe, вешаются эвенты, изменяется src – все, поехал запрос.
    Данные приходят в тело документа iframe.
    Извлекаются данные из contentWindow.
    Внутри ифрэйма лежит скрипт, который себя исполняет.
    Или пересылаются данные через window.postMessage() (HTML5) родительскому окну реализация и пример (в статье пишет, что поддерживает только Opera 9(в 9.61 у меня не работало), Firefox 3(работает), Safari (в 4 pre dev работает)) (Спасибо xonix)

    Через тэг script

    Аналогично с iframe. Создается тэг script, вешаются эвенты, изменяется src – все, поехал запрос.
    Данные приходят в тело script.
    Скрипт сам себя выполняет. Либо идет извлечение данных из его тела (только Opera — дополнил den1234554321).

    Flash <-> javascript

    Описание www.inattack.ru/article/572.html
    Пример eyeonsecurity.org/advisories/flash-demo/demo1.html если подождать выдаёт алерты
    Спасибо @Nuty

    window.name + iframe + form

    Описание и реализация:
    habrahabr.ru/blogs/javascript/41669
    www.sitepen.com/blog/2008/07/22/windowname-transport

    CSS хак

    Создается тэг linl rel=«stylesheet», вешается эвент. В атрибут src записываем somefile.css? параметры. Теперь ждем через таймаут, когда придет код…
    Код приходит в таком формате:
    #id {
        background-image: url('about:blank#Hello%20World');
    }

    или
    #id {
        background-image: url('about:blank?Hello%20World');
    }

    Затем через DOM достаем все, что после about:blank.
    Реализация: www.tralfamadore.com/2008/08/xsstc-cross-site-scripting-through-css.html

    Через canvas + img

    Создается тэг img, вешаются эвенты. В атрибут src записываем somefile.php? параметры. Ждем по эвенту когда придет содержимое.
    Приходит png-8 картинка, заталкиваем её в canvas и через getImageData() получаем её содержимое, дальше осталось декодировать.
    Данный метод имеет больше минусов, чем плюсов: необходимо, чтобы пользователь включил картинки. Затратный процесс кодирования/декодирования.
    Плюсы: уменьшение объема (Prototype.js сжали с 124Кб до 30Кб).
    Реализация декодирования: blog.nihilogic.dk/2008/05/compression-using-canvas-and-png.html

    Через прокси

    Заливаем на сервер прокси скрипт и обычным XHRом отправляем через скрипт данные на другой домен (PHP fsockopen в помощь).

    PS Надеюсь скоро все браузеры будут соблюдать рекомендации W3C по XSS XHR, чтобы мы с вам не делали все трансанально… =)
    Первый на очереди Firefox 3.1
    Второй Internet Explorer 8 (через какой-то свой XDomainRequest) дополнил bolk
    Поделиться публикацией
    Комментарии 23
      0
      Спасибо автору за статью :)
        +1
        ещё можно попробовать через «third party cookies»

        в мозилле также работает передача через plain-text и xslt
          0
          Решил проверить насчет чужих кукисов.
          Зашел в фаерфоксе на хабр, сбросил весь кэш. Просмотрщик кусисов сообщает, что были установлены куки с body.imho.ru (NGUserID), видимо через баннер.
          Проверка javascript:alert(document.cookie) обнаружила только местные.
        +3
        К каждому методу бы наглядную реализацию — было б супер!
          –4
          Вообще было бы неплохо еще во вступлении написать что такое XSS. Ценность статьи бы резко повысилась.
            0
            Если не ошибаюсь, IE8 имеет реализацию XSS XHR.
            +1
            >Создается тэг iframe, вешаются эвенты, изменяется src – все, поехал запрос.
            >Данные приходят в тело документа iframe.
            >Извлекаются данные из contentWindow.

            Если src на другой домен, то js не достучится до содержимого contentWindow по политике безопастности.

            >Через тэг script

            >идет извлечение данных из его тела.

            как? знаю способ только для оперы.

            >Затем через DOM достаем все, что после about:blank.
            А вот это очень интересно!
              0
              Спасибо за коменты. Уточнил статью на счет извлечение кода javascript.
              Надо покопать исходники фаербага и узнать как достает то, что лежит в ифрэйме (его код — тот же javascript). Правда у него права могуть быть рутовые )
                +1
                Расширения для FF имеют права сравнимые с правами самого FF.
                  0
                  Ну не то чтобы совсем рутовые, но всё же JS скрипты плагинов в FF имеют более высокие права, чем JS скрипты на сайтах.
                  0
                  ну, если в iframe скрипт запускает postMessage то почему бы и загружаемый через тег script код не выполнил бы вызов нужной ф-ции и не послал бы в нее данные. вполне удобный способ и везде работает.
                  +1
                  Про Flash <-> JavaScript
                  Вот описание www.inattack.ru/article/572.html
                  Вот пример eyeonsecurity.org/advisories/flash-demo/demo1.html если подождать выдаёт алерты
                    0
                    ээээх, а я думал тут о хакерстве будет :(
                      +2
                      может напишите продолжение, как от каждого метода защититься?
                      спасибо.
                        0
                        прошу прощения, не вник сразу в статью, перечитал, понял, ещё раз спасибо!
                        +1
                        Почему не упомянули postMessage() API из HTML 5 (кстати, поддерживается в FF 3.0.X)
                        ejohn.org/blog/cross-window-messaging/
                          0
                          Спасибо за дополнение. Классифицировал этот метод, как «Через iframe».
                          Хорошо, когда статья дополняется другими.
                            0
                            К тому же еще и обещают поддержать в IE8, единственное что его реализации слегка рознятся в разных браузерах и их версиях, ибо используют разные версии черновика HTML5 спецификации.
                            0
                            Особо широко используются методы 2 и 7.

                            Использование скриптов называется JSONP и его давно предлагают в своих публичных API Google и Yahoo.

                            Для более безопасной поддержки последних запросов Клокфорд несколько лет назад предложил JSONRequest
                              0
                              не плохой материал, хотя и не ново…
                              кстати, не пойму, почему не используют более понятный термин CSS (Cross Site Scripting), чем непонятное обозначение XSS

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

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