08.07.2005

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

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

Автор 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.

Рисунок 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-сервису.

Рисунок 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.

comments powered by Disqus