Внимательный читатель вспомнит, что с полгода назад у нас уже был похожий PoC. Тогда Мирослав Штампар решил доказать, что функционал для поиска SQL-инъекций, которым располагает большинство коммерческих сканеров безопасности, можно воссоздать в небольшом скрипте, уложившись в сто строчек кода. Автор знает, о чем говорит, — он сам является автором sqlmap, которая по праву считается одним из лучших инструментов для поиска и эксплуатации SQLi и распространяется бесплатно. Основная идея сегодняшнего PoC состоит в том, что и для поиска XSS-уязвимостей не надо городить огород. Сто строчек кода — и сканер готов. Так появился Damn Small XSS Scanner (DSXS).
WARNING
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.ПРОСТО О ПОИСКЕ 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>.
Хакер #156. Взлом XML Encryption
О 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.