IPB

Здравствуйте, гость ( Вход | Регистрация )

 
ОтветитьСоздать новую тему
> Защита Web-сервисов с использованием mod_security
JoNy202
сообщение Aug 14 2005, 23:22
Сообщение #1


PAUK.NET.RU TEAM
Иконка группы

Группа: Admin
Сообщений: 1,672
Регистрация: 11.7.2005
Из: Чебоксары
Пользователь №: 1



Защита Web-сервисов с использованием mod_security

Автор Shreeraj Shah

09 июня 2005

Web-сервисы все чаще становятся неотъемлемой частью Web-приложений нового поколения. И они также уязвимы к атакам. Природа таких атак точно такая же, как и для обычных Web-приложений, однако принцип действий разный. Эти атаки могут привести к утечке информации; далее, они способствуют удаленному выполнению команд. Используя WSDL, хакер может определить точку доступа и доступные интерфейсы Web-сервисов. Интерфейсы эти принимают данные с использованием SOAP по HTTP/HTTPS и без хорошей защиты на уровне исходного кода могут быть взломаны. mod_security работает как Web-модуль сервера Apache, идеальный для защиты Web-сервисов против атак, которые также включают специально обработанные POST запросы, содержащие SOAP конверты.
Проблемный Домен

Для атаки Web-сервисов существует четыре основных направления:

* Инъекция в буфер с непостоянным размером
* Инъекция метасимвола
* SQL инъекция
* SOAP раскрытие дефектного кода

Обычно конфигурации межсетевых экранов беспрепятственно пропускают входящий HTTP/HTTPS трафик. Каждая из вышеуказанных атак, проще говоря, представляет собой посылку специально обработанного трафика, выглядящего как обычный трафик, поэтому он и проходит через межсетевой экран. В этой статье будут описаны пути и средства разделения легального и злоумышленного HTTP/HTTPS трафика, и, в дальнейшем, блокировки злоумышленного. Выполнение этих действий поможет резко снизить вероятность успешного проведения атаки через 80/443 порты.
Каково же решение?

Решений на самом деле очень много, начиная с установки дополнительных проверок на вводимые данные. Один из способов – провести проверку содержимого каждого входящего запроса и сравнить его с заранее определенными правилами. Это предотвратит проникновение злоумышленных SOAP запросов в Web-службы на уровне исходного кода. Mod_security может использоваться для защиты против всех типов нападений в том случае, когда вы правильно развернули и настроили его для Web-служб. В этой статье будет подробно рассказано - как настраивать mod_security для защиты Web-служб.

После установки Web-служб необходимо провести грамотную защиту от различных направлений атак. Каждое направление атак требует своего подхода со стороны защиты. В качестве примера рассмотрим фиктивный случай с банком.

Blue Bank (www.bluebank.example.com) только что принял Web-сервисы с использованием mod_security. Эти службы предоставляют банковые сервисы через Интернет для финансовых партнеров и клиентов (баланс счета, денежные переводы, исправление личных данных). На рисунке 1 показана архитектура развертки Web служб Blue Bank’a.

Прикрепленный файл  ris_1.gif ( 29.34 килобайт ) Кол-во скачиваний: 5


Рисунок 1. Система Web-служб Blue Bank’a

Существует много способов развертывания Web-служб. В нашем случае Web-служба запускается на Tomcat/Axis и подключается к Web-серверу Apache. Приложения банковских Web-сервисов написаны на Java (с расширением файла .jws).

Важные части настроек Apache и Axis включают в себя Apache httpd.conf, который загружает Tomcat:

Код
LoadModule jk2_module modules/mod_jk2.so
JkSet config.file /usr/local/apache2/conf/workers2.properties


Файл Axis - web.xml, который поддерживает AxisServlet для Web сервисов в обработке:

Код
<servlet-mapping>                                            
   <servlet-name>AxisServlet</servlet-name>                
   <url-pattern>*.jws</url-pattern>                        
</servlet-mapping>


С того момента, как выше указанные настройки вступили в силу, вы можете ставить любые Web-службы на свой сервер. Если посмотреть ответ сервера на запрос банера, то можно увидеть следующее:

Код
<code>Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4</code>


Этот баннер указывает на то, что Web-сервер крутится на Apache/2.0.50 (Unix) с запущенным модулем mod_jk2/2.0.4. Axis запускается как часть Web-приложения Tomcat и готов для поднятия Web-сервисов. Для обеспечения безопасности на уровне Web- сервисов, Blue Bank загрузил модуль mod_security, предоставляющий возможности программной фильтрации. Следующая строка в httpd.conf загружает модуль безопасности:

Код
<code>LoadModule security_module    modules/mod_security.so</code>


С установленным mod_security Blue Bank может добавить правила фильтрации в httpd.conf:

Код
<IfModule mod_security.c>
    # Turn the filtering engine On or Off
    SecFilterEngine On
    SecFilterDefaultAction "deny,log,status:500"
    SecFilterScanPOST On

    . . .
    # Other rules
    . . .
</IfModule>


Этого вполне достаточно, чтобы позволить системным администраторам и разработчикам использовать mod_security для обнаружения входящих злонамеренных HTTP/HTTPS запросов.

Рассмотрим пример Web-сервиса просмотра баланса www.bluebank.example.com/axis/getBalance.jws WSDL-ответ этого Web сервиса будет приходить из www.bluebank.example.com/axis/getBalance.jws?wsdl
Метод/Интерфейс вывода баланса счета из данных, полученных от WSDL

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

Код
<wsdl:operation name="getInput">
<wsdlsoap:operation soapAction=""/>
  <wsdl:input name="getInputRequest">
    <wsdlsoap:body encodingStyle=http://schemas.xmlsoap.org/soap/encoding/
            namespace="http://DefaultNamespace"
            use="encoded"/>
  </wsdl:input>
  <wsdl:output name="getInputResponse">
    <wsdlsoap:body encodingStyle=http://schemas.xmlsoap.org/soap/encoding/
            namespace="http://www.bluebank.example.com/axis/getBalance.jws"
            use="encoded"/>
  </wsdl:output>

<wsdl:message name="getInputResponse">
   <wsdl:part name="getInputReturn" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="getInputRequest">
   <wsdl:part name="id" type="xsd:string"/>
</wsdl:message>


Как показано выше, передача id конкретному методу приведет к возврату строки в выходных данных. Когда вы посылаете id банкового счета как входные данные Web-сервису, вы получаете информацию о балансе счета.

Вызов Web-сервиса через HTTP

Клиенты или партнеры Blue Bank, запрашивающие информацию о состоянии счета через Интернет могут выбрать информацию реквизита, послав правильно собранный конверт Web-сервисам банка. На рисунке 2 показан HTTP запрос на информацию о балансе счета с id 12123, посланный Web-сервису.

Прикрепленный файл  ris_2.gif ( 37.43 килобайт ) Кол-во скачиваний: 0


Рисунок 2. Вызов Web сервиса через HTTP

Существует несколько способов создания SOAP клиентов, которые будут генерировать SOAP запросы правильного формата. Ниже представлен пример SOAP клиента с использованием SOAP::Lite на Perl. Следующий простой код генерирует SOAP запрос:

Код
#!perl -w
use SOAP::Lite;

print SOAP::Lite
 -> service('http://www.bluebank.example.com/axis/getBalance.jws?wsdl')
 -> getInput('12123');

Однако существует вероятность перехвата HTTP-запроса с помощью снифера, например ethereal. HTTP/SOAP запрос, посланный на www.bluebank.example.com с id 12123 сгенерирует что-то вроде этого:

POST /axis/getBalance.jws HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 576
Expect: 100-continue
Host: www.bluebank.example.com

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.bluebank.example.com/axis/getBalance.jws" xmlns:types="
http://www.bluebank.example.com/axis/getBalance.jws/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <soap:Body
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
               <q1:getInput xmlns:q1="http://DefaultNamespace">
                       <id xsi:type="xsd:string">12123</id>
               </q1:getInput>
       </soap:Body>
</soap:Envelope>

...

HTTP/1.1 200 OK
Date: Mon, 03 Jan 2005 19:24:10 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Set-Cookie: JSESSIONID=69C6540CC427A8B064C0795ADDFC20EA; Path=/axis
Content-Type: text/xml;charset=utf-8
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <soapenv:Body>
               <ns1:getInputResponse
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                       xmlns:ns1="http://DefaultNamespace">
                       <ns1:getInputReturn
xsi:type="xsd:string">$2500</ns1:getInputReturn>
               </ns1:getInputResponse>
       </soapenv:Body>
</soapenv:Envelope>


Встраиваем ресурсы Web-сервисов в mod_security

Web сервис Blue Bank’а использует URL www.bluebank.example.com/axis/getBalance.jws. Необходимо создать набор правил для этого ресурса. Blue Bank встроил этот ресурс в httpd.conf:

Код
<IfModule mod_security.c>
     SecFilterEngine On
     SecFilterDefaultAction "deny,log,status:500"
     # Other rules
# ------- Rules for web services --------------------------
     <Location /axis/getBalance.jws>
       SecFilterInheritance Off
       SecFilterDefaultAction "deny,log,status:500"
       SecFilterScanPOST On
       SecFilterCheckURLEncoding On
       SecFilterCheckUnicodeEncoding On
     </Location>
#---------------------------------------------------------------
</IfModule>


Следующий блок директивы относится к критерию фильтрации для /axis/getBalance.jws. Здесь добавляется требуемая метка-заполнитель для защиты Web-сервиса. Метки-заполнители находятся в блоке <Location>.

Код
# ------- Rules for web services --------------------------
<Location /axis/getBalance.jws>
       SecFilterInheritance Off
       SecFilterDefaultAction "deny,log,status:500"
       SecFilterScanPOST On
       SecFilterCheckURLEncoding On
       SecFilterCheckUnicodeEncoding On
</Location>
#---------------------------------------------------------------


Здесь находятся две очень важные директивы:

SecFilterInheritance Off

Эта директива отключает другие правила и дает пустое пространство для нового набора правил, разрешающих вводить только путь.

SecFilterScanPOST On

Для вызова процедур Web сервисов используется метод POST. Следовательно, следующая директива, которую следует задействовать – SecFilterScanPost – для включения POST фильтрации.

Выполнив эти действия, Blue Bank установил защиту в форме mod_security. Кроме того, mod_security знает что нужно охранять – id, который посылают клиенты Web-сервису в SOAP конверте.
Защищаемся от Других Направлений Атак

Первым делом для защиты ото всех входящих злоумышленных запросов, Blue Bank’у нужно перехватить значение id, чтобы предостеречь клиента от ввода неверного значения. SOAP запрос использует XML тэг для передачи информации id во внутренний код Web сервиса. Тэг выглядит примерно следующим образом:

Код
<q1:getInput xmlns:q1="http://DefaultNamespace">
    <id xsi:type="xsd:string">12123</id>
</q1:getInput>


Чтобы отфильтровать запрос, mod_security должен как-то прочитать значение, ассоциированное с тэгом; в нашем случае это 12123. В mod_security имеется несколько возможностей для перехвата значения, переданного с POST запросом. Один из методов – это использование заготовленного фильтра:

Код
<Location /axis/getBalance.jws>
   SecFilterInheritance Off            
   SecFilterDefaultAction "deny,log,status:500"
   SecFilterScanPOST On
   SecFilterCheckURLEncoding On
   SecFilterCheckUnicodeEncoding On  
   SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>" chain
</Location>


Выделенная линия перехватывает запрос, сделанный на id. POST_PAYLOAD перехватывает блок данных POST и пытается сравнить его с правильной маской (<\s*id[^>]*>). Эта маска регулярного выражения подтверждает, что существует тэг для id. Только после этого процесс пойдет дальше по оставшимся проверкам (из-за цепной директивы). Другими словами, если тэг id существует, mod_security переходит к следующей проверке.

Если в POST запросе содержится id, то сервер сможет обработать информацию. Однако злоумышленник может модифицировать определенное значение, чтобы провести инъекцию. Существует четыре основных методов атак.
Вид атаки 1: Инъекция в буфер с непостоянным размером

Одной из основных опасностей при передаче большого буфера в переменную является то, что большой буфер может вызвать сбой в работе приложения и/или выполнить произвольный код во время работы. Правило, представленное ниже защищает переменную id от данного типа атаки:

Код
<Location /axis/getBalance.jws>
       SecFilterInheritance Off
       
       SecFilterDefaultAction "deny,log,status:500"
       SecFilterScanPOST On
       SecFilterCheckURLEncoding On
       SecFilterCheckUnicodeEncoding On
   
       SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>" chain
       SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>.{6,}</\s*id\s*>"
   "deny,status:500"
</Location>


Эта директива позволяет принимать в буфер только первые пять символов. Используется маска ввода <\s*id[^>]*>.{6,}</\s*id\s*>. Чтобы убедиться в том, что описанный выше блок директив работает, Blue Bank может послать два запроса, один – соответствующий установленной длине; другой – превышающий её.

Код
POST /axis/getBalance.jws HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 576
Expect: 100-continue
Host: www.bluebank.example.com

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.bluebank.example.com/axis/getBalance.jws" xmlns:types="
http://www.bluebank.example.com/axis/getBalance.jws/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <soap:Body
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
               <q1:getInput xmlns:q1="http://DefaultNamespace">
                       <id xsi:type="xsd:string">12123</id>
               </q1:getInput>
       </soap:Body>
</soap:Envelope>

...

HTTP/1.1 200 OK
Date: Mon, 03 Jan 2005 19:24:10 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Set-Cookie: JSESSIONID=69C6540CC427A8B064C0795ADDFC20EA; Path=/axis
Content-Type: text/xml;charset=utf-8
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <soapenv:Body>
               <ns1:getInputResponse
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                       xmlns:ns1="http://DefaultNamespace">
                       <ns1:getInputReturn
xsi:type="xsd:string">$2500</ns1:getInputReturn>
               </ns1:getInputResponse>
       </soapenv:Body>
</soapenv:Envelope>


В случае, приведенном выше, буфер из пяти символов был пропущен и сервер прислал ответ со значением $2500. Ниже показан запрос и ответ сервера на id 121234 (шесть символов):

Код
POST /axis/getBlalance.jws HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 577
Expect: 100-continue
Host: www.bluebank.example.com

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.bluebank.example.com/axis/getBalance.jws" xmlns:types="
http://www.bluebank.example.com/axis/getBalance.jws/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <soap:Body
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
               <q1:getInput xmlns:q1="http://DefaultNamespace">
                       <id xsi:type="xsd:string">121234</id>
               </q1:getInput>
       </soap:Body>
</soap:Envelope>

...

HTTP/1.1 500 Internal Server Error
Date: Mon, 03 Jan 2005 22:00:33 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Content-Length: 657
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html xmlns:v="urn:schemas-microsoft-com:vml"
        xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns="http://www.w3.org/TR/REC-html40"><head>
  <title>500 Internal Server Error</title>
 </head><body>
 <h1>Internal Server Error</h1>
 <p>The server encountered an internal error or misconfiguration and was
 unable to complete your request.</p>
 <p>Please contact the server administrator, you@example.com and inform
 them of the time the error occurred, and anything you might have done that
 may have caused the error.</p>
 <p>More information about this error may be available in the server
error
 log.</p>
 <hr />
 <address>Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d
mod_jk2/2.0.4
 Server  at 192.168.7.50 Port 80</address>
</body></html>


Модуль mod_security отклонил этот запрос. Статус 500 говорит о том, что ответ получен. Таким образом, запрос никогда не затронет уровня Web-сервисов. Blue Bank’у удалось поострить грамотную защиту от переполнения буфера – часто встречающейся и игнорируемой уязвимости.
Вид Атаки 2: Инъекция Мета Символа

Другая угроза состоит в использовании мета символов (%,’,”). Эти символы могут стать причиной атаки методом SQL инъекции, приводящей к утечке информации. Следующая стратегия обеспечит устойчивость к таким атакам.

Код
<Location /axis/getBalance.jws>
  SecFilterInheritance Off
     
  SecFilterDefaultAction "deny,log,status:500"
  SecFilterScanPOST On
  SecFilterCheckURLEncoding On
  SecFilterCheckUnicodeEncoding On
   
  SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>" chain
  SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>.{6,}</\s*id\s*>"
    "deny,status:500"
  SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>.*[^a-zA-Z0-9][^<]*</\s*id\s*>"
    "deny,status:500"    
</Location>


Маска выражения <\s*id[^>]*>.*[^a-zA-Z0-9][^<]*</\s*id\s*> отклоняет HTTP запрос, если переменная POST_PAYLOAD содержит символы, не являющимися строковыми. Это очень важная возможность в модуле mod_security.

Ниже показан запрос и ответ сервера на id 12’12:

Код
POST /axis/getBalance.jws HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 576
Expect: 100-continue
Host: www.bluebank.example.com

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.bluebank.example.com/axis/getBalance.jws" xmlns:types="
http://www.bluebank.example.com/axis/getBalance.jws/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <soap:Body
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
               <q1:getInput xmlns:q1="http://DefaultNamespace">
                       <id xsi:type="xsd:string">12'12</id>
               </q1:getInput>
       </soap:Body>
</soap:Envelope>

...

500 Internal Server Error
HTTP/1.1 500 Internal Server Error
Date: Mon, 03 Jan 2005 22:00:33 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Content-Length: 657
Connection: close
Content-Type: text/html; charset=iso-8859-1


Эта атака тоже не удалась, а mod_security перехватил её.
Вид Атаки 3: SQL инъекция

В переменные можно вставлять и SQL операторы. Возможно и объединение нескольких SQL операторов. Если ваше приложение не очищает такие входные данные, то злоумышленники могут добавить SQL операторы к уже существующим, часто с плачевными последствиями. Blue Bank блокировал атаки типа SQL-инъекция, добавив следующие директивы:

Код
<Location /axis/getBalance.jws>
  SecFilterInheritance Off
  SecFilterDefaultAction "deny,log,status:500"
  SecFilterScanPOST On
  SecFilterCheckURLEncoding On
  SecFilterCheckUnicodeEncoding On

  SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>" chain
  SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>.{6,}</\s*id\s*>"
    "deny,status:500"
  SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>.*[^a-zA-Z0-9][^<]*</\s*id\s*>"
    "deny,status:500"
  SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>.*select.+from[^<]*</\s*id\s*>"
    "deny,status:500"
</Location>


Выделенные жирным строки проверяют, содержатся ли в запросе слова "select * from . . .", а если находит их, то возвращает статус 500, как в предыдущем примере. Аналогично вы можете добавить SQL операторы, которые следует блокировать, обновлять и т.п.
Вид Атаки 4: SOAP Раскрытие Дефектного Кода

Один из основных источников информации в Web-сервисах – это дефектный код. Вызванная на сервере ошибка может создать дефектный код. Ниже представлен запрос злоумышленника и ответ сервера в результате подстановки символа «а» вместо целого числа в переменную id:

Код
POST /axis/getBalance.jws HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 569
Expect: 100-continue
Host: www.bluebank.example.com

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.bluebank.example.com/axis/getBalance.jws" xmlns:types="
http://www.bluebank.example.com/axis/getBalance.jws/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
               <q1:getInput xmlns:q1="http://DefaultNamespace">
                       <id xsi:type="xsd:string">a</id>
               </q1:getInput>
       </soap:Body>
</soap:Envelope>

...

500 Internal Server Error
HTTP/1.1 500 Internal Server Error
Date: Tue, 04 Jan 2005 16:22:14 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Set-Cookie: JSESSIONID=1CAF4CD0ED0F38FB40ECBC7BDAB56C75; Path=/axis
Content-Type: text/xml;charset=utf-8
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
  <soapenv:Fault>
       <faultcode>soapenv:Server.userException</faultcode>
       <faultstring>java.lang.NumberFormatException:
   For input string:"a"</faultstring>
  <detail/>
  </soapenv:Fault>
 </soapenv:Body>
</soapenv:Envelope>


Как показано в ответе сервера, дефектный код может раскрыть критическую внутреннюю информацию. Это достаточно веский довод для создания соответствующих фильтров:

Код
<Location /axis/getBalance.jws>
  SecFilterInheritance Off
       
  SecFilterDefaultAction "deny,log,status:500"
  SecFilterScanPOST On
  SecFilterCheckURLEncoding On
  SecFilterCheckUnicodeEncoding On
   
  SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>" chain
  SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>.{6,}</\s*id\s*>"
    "deny,status:500"
  SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>.*[^a-zA-Z0-9][^<]*</\s*id\s*>"
    "deny,status:500"
   
  SecFilterScanOutput On
  SecFilterSelective OUTPUT "faultcode" "deny,status:500"
</Location>
SecFilterScanOutput On


Эта директива сканирует выходной блок данных и принимает определенные фильтры.

Код
<code>SecFilterSelective OUTPUT "faultcode" "deny,status:500"</code>


Директива блокирует исходящий трафик, содержащий дефектные коды. Если атакующий посылает сформированный запрос с символом «а» в поле целых чисел, он получит ответ, похожий на этот:

Код
HTTP/1.1 500 Internal Server Error
Date: Mon, 03 Jan 2005 22:00:33 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Content-Length: 657
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
  <title>500 Internal Server Error</title>
 </head><body>
 <h1>Internal Server Error</h1>
 <p>The server encountered an internal error or misconfiguration and was
 unable to complete your request.</p>
 <p>Please contact the server administrator,  you@example.com and inform
 them of the time the error occurred, and anything you might have done that
 may have caused the error.</p>
 <p>More information about this error may be available in the server
error
 log.</p>
 <hr />
 <address>Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d
mod_jk2/2.0.4
 Server  at 192.168.7.50 Port 80</address>
</body></html>


Заключение

mod_security выглядит как еще один продукт в области безопасности, однако имеет хорошее превосходство над другими уже доступными утилитами. Кроме обнаружения вторжений и системы защиты на уровне HTTP, mod_security также имеет возможности фильтрования POST_PAYLOAD.

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

Shreeraj Shah основатель и руководитель Net-Square.

Источник: www.securitylab.ru


--------------------
Вернуться к началу страницы
 
+Цитировать сообщение

ОтветитьСоздать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 28th April 2024 - 08:33