Pull to refresh

Мирный XSS

Reading time 3 min
Views 9K
Эта статья о мирном атоме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
Tags:
Hubs:
+76
Comments 23
Comments Comments 23

Articles