Всем известны два типа XSS:
- Пассивные XSS (reflected или Type 1 XSS) – переданные данные отражаются в HTML-коде страницы только для конкретного пользователя
- Активные XSS (persistent или Type 2 XSS) – постоянные XSS; злонамеренные данные хранятся на сервере – все пользователи сайта могут быть подвержены данной атаке
Однако далеко не всем известен еще один тип XSS, а именно межсайтовый скриптинг через DOM (DOM-based или Type 0 (3) XSS). Объектная модель документа (DOM) является формой отображения иерархии HTML (а также XML) для JavaScript. XSS-атаки через DOM возможны благодаря недостаточной обработке на уровне JavaScript таких объектов DOM, как document.URL, document.location, document.referrer и некоторых других. Принципиальным отличием данного типа XSS является тот факт, что данные вообще не встраиваются в HTML-код. Несомненно, это вызывает определенные трудности для систем IDS в плане выяления фактов атак и эффективной фильтрации входящих данных, так как уязвимость заключена не на стороне серверных скриптов, а прямо в JavaScript-коде. Рассмотрим пример такого уязвимого кода.
var pos=document.URL.indexOf("foo=")+4; document.write(document.URL.substring(pos,document.URL.length));
Данный JavaScript-код, предполагая единственный параметр foo, находящийся в составе URL страницы, выведет его значение. Никакой проверки здесь нет, поэтому данный код подвержен XSS через DOM:
http://somesite/index.html?foo=<script>alert(document.cookie)</script>
http://somesite/index.html#foo=<script>alert(document.cookie)</script>
В итоге, в HTML-код страницы запишется наш алерт.
Итак, характерными признаками уязвимого кода является:
- Недостаточная обработка данных, поступающих из Referer или URL страницы
- Запись этих данных с помощью методов и свойств document.write(), document.writeln(), document.body.innerHTML, document.attachEvent() и других, а также прямое выполнение этих данных с помощью eval().
Ссылки:
Leave a Reply