» Статьи » Информационные технологии » Криптография и шифрование » Защита 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.

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




Shreeraj Shah http://www.onlamp.com/pub/au/2219

Отзывы (через аккаунты в социальных сетях Вконтакте, Facebook или Google+):

Оставить отзыв с помощью аккаунта ВКонтакте:

Оставить отзыв с помощью аккаунта FaceBook:

Оставить отзыв с помощью аккаунта Google+: