Страницы

среда, 29 июня 2011 г.

Positive Research повысил эффективность Web Application Firewall

23 июня компания Trustwave, разработчик Web Application Firewall ModSecurity организовала открытое тестирование эффективности защиты веб-приложений. В рамках SQL Injection Challenge было предложено легально обойти механизмы ModSecurity, блокирующие атаки типа SQL Injection.

Инициатива «ModSecurity SQL Injection Challenge» привлекла внимание множества исследователей. Участие в тестировании приняли и эксперты инновационного подразделения компании Positive Technologies – исследовательского центра Positive Research.

Тестирование состояло из двух этапов. В рамках первого этапа участники должны были использовать уязвимость SQL Injection для получения данных из СУБД тестовых сайтов. На втором этапе задание усложнялось тем, что при выполнении тех же самых действий участникам было необходимо обойти правила фильтрации ModSecurity и не вызвать срабатывание межсетевого экрана.

Вопросы эффективности средств защиты привлекают внимание экспертов исследовательского центра не в первый раз. Так, еще в 2009 году ведущий эксперт Positive Research Дмитрий Евтеев предложил универсальный способ обхода фильтрации ModSecurity (http://ptresearch.blogspot.com/2009/11/another-fine-method-to-exploit-sql.html). Его замечания были приняты во внимание при разработке новой версии ModSecurity.

В результате проведённого экспертами Positive Research анализа были успешно выполнены все задания и обнаружены векторы обхода WAF ModSecurity с последними правилами фильтрации. Результаты исследования были переданы разработчикам для повышения эффективности межсетевого экрана.

Подробности
Суть «ModSecurity SQL Injection Challenge»: участникам получить как можно больше фана, организаторам улучшить правила WAF ModSecurity. Мероприятие подразумевало под собой 2 уровня – Level 1 : Speed Hacking (завершен) и Level 2: Filter Evasion (будет открыт всегда). Для того, чтобы удачно пройти уровень, необходимо было, проэксплуатировав один из веб сайтов, защищенных WAF ModSecurity, предоставить информацию о структуре БД и получить некоторые данные из таблиц. В роли уязвимых веб-сайтов выступали тестовые стенды сканеров безопасности Acunetix, HP, IBM, Cenzic.

Для удачного прохождения первого уровня достаточно было лишь предоставить вышеперечисленную информацию организаторам конкурса, описав, как именно данные были получены. В данном случае разрешалось «попасть» на ModSecurity. В этом и заключался Speed Hack. Соответственно к вечеру 24 июня, не было уже и надежд на то, что останется хоть что-то не пройденным на уровне 1. Но, как оказалось, участники, смогли пройти уровень 1 только для тех веб-сайтов, которые функционировали на связке Apache+PHP+MySQL. Остальные же 2 (IIS+ASP+MsAccess) стояли не поверженными до вечера 24 июня. Участникам PTResearch не составило труда проэксплуатировать найденные sql инъекции для веб-сайтов, использующих MsAccess. Спустя некоторое время организаторами был подтвержден наш статус как победителей в первом уровне мероприятия и имена двух участников PTResearch Team появились на веб-сайте ModSecurity, после чего уровень 1 был закрыт по причине того что все уже сломали. По словам организаторов, он обработал порядка 500 решений участников, и никто так и не смог верно проэксплуатировать уязвимость SQL injection в скопе с БД MsAccess. Сказывается ее непопуллярность =)

Приступив к решению задачи уровня 2 – эксплуатация уязвимости sql injection с обходом WAF ModSecurity с правилами up-to-date, было принято решение продолжить линию прохождения первого уровня – эксплуатация уязвимости на тестовом веб-сайте IBM (IIS+ASP+MsAccess).

Обход WAF был осуществлен с помощью знаний операторов MsAccess и особенности связки IIS+ASP, которая позволяет провести атаку HTTP Parameter Pollution.

Прохождение было построено на эксплуатации уязвимости sql injection в скрипте тестового сайта transaction.asp. Уязвимость заключается в том, что входные параметры, передаваемые пользователем, не проверяются в самом серверном сценарии, что позволяет осуществить sql инъекцию.

Ниже представлены запросы, которые не «детектятся» ModSecurity и позволяют получить необходимую информацию для прохождения уровня из БД уязвимого веб-сайта.

Для того чтобы получить имя базы данных, достаточно было передать специальный sql запрос, который обращается к к данным из четко указанной пользователем БД. Для поиска существующих БД был использован error based метод + брутфорс, при запросе в котором указано имя не существующей БД. Веб-приложение отвечало ошибкой MsAccess, говорившей о том, что БД не существует.

Пример запроса:
POST: http://modsecurity.org/bank/transaction.asp
Content:
__VIEWSTATE=[skipped]&after=1 and (select 1&after=1 from a.c)&before=2—1
Для того чтобы получить название таблиц текущей БД, был использован метод идентичный методу получения информации об именах существующих БД, за исключением того, что в запросе не было четко указано какую именно БД следует использовать.

Пример запроса:
POST: http://modsecurity.org/bank/transaction.asp
Content:
__VIEWSTATE=[skipped]&after=1 and (select 1&after=1 from users1)&before=2—1
Информация об именах колонок также могла быть получена используя брутфорс, но был использован метод error based и структура “group by + having 1”. Для обхода ModSecurity также была применена атака HTTP Parameter Pollution.

Пример запроса:
POST: http://modsecurity.org/bank/transaction.asp
Content:
__VIEWSTATE=[skipped]&after=&before=1231 group by 1&before=transid having 1

С задачей получения данных из самой БД пришлось немного покопаться =) Фильтр ModSecurity обнаруживал вызов почти всех полезных функций. Но решение также было найдено.
Для начала была построена конструкция, позволяющая выявлять наличие той или иной информации в БД. Запрос выглядел следующим образом:
POST: http://modsecurity.org/bank/transaction.asp
Content:
__VIEWSTATE=[skipped]&after=1 AND (select username from users where username='admin')&before=d

Естественно, такая конструкция детектилась WAF. Для того чтобы избежать детекта, необходимо разделить запрос (select username from users where username=’user’) на несколько переменных.
Например, __VIEWSTATE=[skipped]&after=1 AND (select mid(last(username)&after=1&after=1) from users where username='admin') &before=d. Вариант рабочий, но его ловит WAF, а именно сочетание символов “mid(“ и ему подобные вызовы. Прошерстя мануалы MsAccess была найдена функция DCount, которая, в совокупности с WAF, позволила завершить эксплуатацию уязвимости в обход WAF.

Пример запроса:
POST: http://modsecurity.org/bank/transaction.asp
Content:
__VIEWSTATE=[skipped]&after=1 AND (select DCount(last(username)&after=1&after=1) from users where username='ad1min')&before=d
Значения из БД в таком случае могут быть получены методом перебора.

Комментариев нет:

Отправить комментарий