Эта статья о мирном атомеXSS. Заставим зло работать на добро!
Простейший пример всё объяснит:
Вы разрабатываете веб-сервис, который поставляет данные другим сайтам (погода, данные по торгам в реальном времени, чат и т.п). Вам нужно организовать кроссайтовую передачу данных(данные погоды, торгов, текст чата) на стороне клиента.
Сводная таблица по всем методам
Создается тэг iframe, вешаются эвенты, изменяется src – все, поехал запрос.
Данные приходят в тело документа iframe.
Извлекаются данные из contentWindow.
Внутри ифрэйма лежит скрипт, который себя исполняет.
Или пересылаются данные через window.postMessage() (HTML5) родительскому окну реализация и пример (в статье пишет, что поддерживает только Opera 9(в 9.61 у меня не работало), Firefox 3(работает), Safari (в 4 pre dev работает)) (Спасибо xonix)
Аналогично с iframe. Создается тэг script, вешаются эвенты, изменяется src – все, поехал запрос.
Данные приходят в тело script.
Скрипт сам себя выполняет. Либо идет извлечение данных из его тела (только Opera — дополнил den1234554321).
Описание www.inattack.ru/article/572.html
Пример eyeonsecurity.org/advisories/flash-demo/demo1.html если подождать выдаёт алерты
Спасибо @Nuty
Описание и реализация:
habrahabr.ru/blogs/javascript/41669
www.sitepen.com/blog/2008/07/22/windowname-transport
Создается тэг linl rel=«stylesheet», вешается эвент. В атрибут src записываем somefile.css? параметры. Теперь ждем через таймаут, когда придет код…
Код приходит в таком формате:
или
Затем через DOM достаем все, что после about:blank.
Реализация: www.tralfamadore.com/2008/08/xsstc-cross-site-scripting-through-css.html
Создается тэг 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
А зачем?
Простейший пример всё объяснит:
Вы разрабатываете веб-сервис, который поставляет данные другим сайтам (погода, данные по торгам в реальном времени, чат и т.п). Вам нужно организовать кроссайтовую передачу данных(данные погоды, торгов, текст чата) на стороне клиента.
Методы организации XSS
- Через тэг iframe
- Через тэг script
- Через flash<->javascript
- Через window.name + iframe + form
- Через CSS хак
- Через canvas + img
- Через прокси
Сводная таблица по всем методам
Метод |
onLoad Event |
onError Event |
GET |
POST |
Недостатки |
---|---|---|---|---|---|
iframe |
есть |
есть |
да |
нет |
Много элементов, появляется история. |
script |
есть |
нет |
да |
нет |
Создается скрипт |
flash <-> javascript |
? |
? |
да |
? |
Лишняя флэшка |
window.name + iframe + form |
есть |
есть |
да |
да |
Появляется история. Ограничения в некоторых реализациях по объему передаваемых данных. |
css хак |
нет |
есть |
да |
нет |
Лишний тэг. |
canvas + img |
есть |
есть |
да |
нет |
Лишний тэг, тормоза с декодированием. Если пользователь отрубил картинки, то ничего не придет. Плюс: упакованность данных. |
прокси |
есть |
есть |
да |
да |
Необходимо устанавливать серверный скрипт. |
Вкратце о реализации каждого метода
Через тэг iframe
Создается тэг iframe, вешаются эвенты, изменяется src – все, поехал запрос.
Данные приходят в тело документа iframe.
Внутри ифрэйма лежит скрипт, который себя исполняет.
Или пересылаются данные через 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