Различия в обработке одной и той же информации на разных платформах могут привести к потенциальной логической ошибке или уязвимости в системе безопасности.
Network Security Solutions, Serbia 2011
Термин «многозвенная архитектура» в разработке программного обеспечения означает клиент-серверную архитектуру, в которой представление данных, работа приложения и управление данными являются логически разделенными процессами. Архитектура многозвенных приложений предоставляет для разработчиков возможность создания гибких приложений многократного использования. После разделения приложения на звенья разработчикам нужно только изменить или добавить определенный уровень. Различия в обработке одной и той же информации на разных платформах могут привести к потенциальной логической ошибке или уязвимости в системе безопасности.
Давайте рассмотрим звенья Веб-сервиса:
Добавление более гибких уровней может потенциально открыть «двери» для множества новых направлений атак. Быстрая разработка приложений и стремительное развитие технологий делает применение разработок системы безопасности почти невозможным. Через некоторое время все ошибки исправляются.
Но что делать с уязвимостью, существующей много лет в самом популярном протоколе 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 во время более глубокого изучения поведения компонентов Веб-серверов, Веб-приложений и браузеров, за счет засорения параметров запроса с использованием зарезервированных или непредвиденных символов.
Некоторые факты:
Различные Веб-серверы ведут себя по-разному в зависимости от одновременной передачи множества параметров:
Технология/ 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
%>
Это направление атаки может быть использовано против межсетевых экранов веб-приложений, приложения, комбинирующего данные из QUERY_STRING и GET переменных, или приложения, использующего специальные символы для каких-либо дальнейших операций.
для переменных $_SERVER[‘argv’] в Apache/PHP нам нужно установить значение “register_ argc_ argv” на On.
$varArrTemp = array(); // max 2 params
if(count($_GET) < 2) {
foreach($_SERVER[‘argv’] as $k=> $v) {
$varArrTemp[] = $v
}
if(strpos(“_”,$_SERVER[‘query_string’]) === false) {
system(key($_GET));
}
if(strpos(“some_evil_command”,$_GET[‘a’]) === false AND count($_GET) = 1) {
system(($_SERVER[‘argv’][0]);
}
Запрещено: 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"]
Запрещено: 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 блокирует подобные типы атак.
Мы продолжим с глубоким исследованием, рассматривающим эту проблему. Вы можете связаться с нами, если у вас есть интересный комментарий, замечание или идея.