“HTTP Parameter Contamination”

“HTTP Parameter Contamination”

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


Ivan Markovic 
ivan.markovic@netsec.rs

Network Security Solutions, Serbia 2011

http://netsec.rs/

Введение в 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]);
    }

Практические примеры

  1. Обойти правило 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"]

  2. Обойти правило 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 блокирует подобные типы атак.

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

Благодарности

Устали от того, что Интернет знает о вас все?

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