Damn Small XSS Scanner (DSXS)

Маленький сканер на питоне, написанный в 100 строчек кода.

ПРОСТО О ПОИСКЕ XSS

Начнём с азбуки. Cross-site scripting (XSS) — это тип атак, при которых в вывод вебприложения инжектируется некоторый JS-код. Браузер клиента получает этот код и без тени сомнения его выполняет. Чаще всего XSS-атака используется для кражи аутентификационных кукисов. Уязвимость возникает из-за отсутствия фильтрации, когда данные, введенные пользователям, используются для формирования HTTP-ответа. Самый банальный пример — форма для поиска. Если ответ сервера содержит запрос пользователя в «чистом» виде, то приложение с большой вероятностью будет уязвимо к XSS-атакам. Поиск XSS на специальной тестовой площадке для легальных тренировок zero.webappsecurity.com

 

Обнаружение XSS-уязвимостей условно можно разбить на два этапа. Первый этап — определение того, использовали ли веб-приложение для формирования ответа введенные пользователем данные. На этом этапе атакующий пробует вручную ввести произвольные значения в HTML-форму или параметры GET/POST-запроса. В случае если введенные символы содержатся в ответе (то есть их можно найти в исходнике страницы), атакующий может переходить ко второму шагу. Здесь уже надо изучить контекст, в котором используются данные пользователя, и зависимости от этого выбрать правильный XSS-пейлоад. Нагрузка должна быть такой, чтобы веб-приложение сформировало семантически корректный ответ с внедренным зловредным кодом. Очень важно, в каком контексте используются введенные пользователем данные. Например, если бы внедренное значение находилось в ответе сервера внутри HTML-тегов <script>..</script> (что представить довольно сложно), то атакующий мог бы сразу написать зловредный JavaScript-код. Но если, к примеру, введенные пользователем данные оказываются внутри HTML-тега <a href=»…»>, то необходимо сначала закрыть тег символами «>» и только потом писать боевой JS-код, обрамленный в <script>…</script>.

О DSXS

Понятно, что автоматизировать поиск XSSуязвимостей несложно. Но что сделал Мирослав? Он написал утилиту на Python, которая умеет проверять GETи POST-параметры на наличие XSS-уязвимостей, и при этом уложился всего в сто строчек кода. Damn Small XSS Scanner (DSXS) автоматически выполняет поиск тех значений, которые включаются в вывод веб-приложения, и анализирует их контекст. Для каждого контекста есть свой набор символов, которые не должны фильтроваться и кодироваться, чтобы атакующий смог проэксплуатировать уязвимость. Например, в уже упомянутом случае, когда введенные пользователем данные внедряются в тег <a href=»…»>, необходимо, чтобы символы « и > отражались в выводе веб-приложения в исходном виде.

DSXS автоматически выполняет выбор нагрузки для восьми разных случаев, охватывая тем самым большинство всех возможных кейсов. Помимо контекста, DSXS отображает информацию о том, фильтруются ли символы. Если некоторые символы «не проходят», сканер дает об этом знать. В этом случае атакующий может «повредить» контекст (разметка страницы необязательно должна быть валидной, чтобы внедренный скрипт выполнялся), несмотря на то что располагает ограниченным набором символов. Удивительно, но в сто строчек кода автор умудрился уместить и дополнительные параметры. Сканер, помимо всего прочего, способен работать через прокси и использовать случайные значения User-Agent, Referer и Cookie в HTTP-заголовках. Код проекта открыт и доступен на GitHub https://github.com/stamparm/DSXS.

python dsxs.py -h
Damn Small XSS Scanner (DSXS) < 100 LoC (Lines of Code) #v0.2d
by: Miroslav Stampar (@stamparm)

Usage: dsxs.py [options]

Options:
--version show program's version number and exit
-h, --help show this help message and exit
-u URL, --url=URL Target URL (e.g. "http://www.target.com/page.htm?id=1")
--data=DATA POST data (e.g. "query=test")
--cookie=COOKIE HTTP Cookie header value
--user-agent=UA HTTP User-Agent header value
--referer=REFERER HTTP Referer header value
--proxy=PROXY HTTP proxy address (e.g. "http://127.0.0.1:8080")

$ python dsxs.py -u "http://testphp.vulnweb.com/search.php?test=query" --data="s
earchFor=foobar"
Damn Small XSS Scanner (DSXS) < 100 LoC (Lines of Code) #v0.2d
by: Miroslav Stampar (@stamparm)

* scanning GET parameter 'test'
* scanning POST parameter 'searchFor'
(i) POST parameter 'searchFor' appears to be XSS vulnerable (">.xss.<", outside
of tags, no filtering)

scan results: possible vulnerabilities found

$ python dsxs.py -u "http://public-firing-range.appspot.com/address/location.has
h/replace"
Damn Small XSS Scanner (DSXS) < 100 LoC (Lines of Code) #v0.2d
by: Miroslav Stampar (@stamparm)

(i) page itself appears to be XSS vulnerable (DOM)
(o) ...<script>
var payload = window.location.hash.substr(1);location.replace(payload);

</script>...
(x) no usable GET/POST parameters found

scan results: possible vulnerabilities found

Зависимости

Python version 2.6.x or 2.7.х