mod_security - text/xml request_body の処理方法

mod_security - text/xml request_body の処理方法

Content-Type: text/xml と内部に XML が含まれる Web リクエストの REQUEST_BODY を処理しようとしています。次のようなリクエストがあるとします。

curl -v -d
"
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
    <value>
      <struct>
        <member>
          <name>SomeName</name>
          <value>SomeValue</value>
        </member>
      </struct>
    </value>
</methodResponse>
"
-H "Content-Type:text/xml" http://gryzli.info/some_url.php 

必要なのは、REQUEST_BODY をプレーンテキスト文字列として「SomeName」または「SomeValue」と照合できるようにすることです。

私はすでに以下のことを試しました:

1. 次のキーワードを使用して、フェーズ 2 で一致を試みます。

SecRule REQUEST_BODY "SomeValue" "phase:2, ....."  - No success

SecRule FULL_REQUEST "SomeValue" "phase:2, ....."  - No success

SecRule ARGS         "SomeValue" "phase:2, ....."  - No success

2. 上記のルールに加えて、次のルールをさまざまな組み合わせで有効にしてみました。

SecRule REQUEST_HEADERS:Content-Type "text/xml" "phase:1,id:100000,t:lowercase,nolog,pass, ctl:requestBodyProcessor=MULTIPART"

または

SecRule REQUEST_HEADERS:Content-Type "text/xml" "phase:1,id:100000,t:lowercase,nolog,pass, ctl:requestBodyProcessor=URLENCODED"

または

SecRule REQUEST_HEADERS:Content-Type "text/xml" "phase:1,id:100000,t:lowercase,nolog,pass, ctl:forceRequestBodyVariable=On"

また -成功せず

本当の質問:

クライアント要求が Content-Type: text/xml の場合、REQUEST_BODY 内の単純なプレーンテキスト文字列を一致させる方法を知っている人はいますか?

また、XML を解析できる XML エンジンは使用しないことを好みます。これを行うとパフォーマンスに大きなペナルティが予想されるためです。

答え1

最後に、XML コンテンツ タイプ内のプレーンテキスト値を一致させるための答えを見つけました。次に例を示します。

SecRequestBodyAccess On

SecRule         REQUEST_HEADERS:Content-Type    "text/xml"              "phase:1, nolog,pass,ctl:requestBodyProcessor=URLENCODED, id:2222"

SecRule         REQUEST_BODY                    "some_bad_string"          "phase:2, t:none, deny,msg:'Matched some_bad_string', status:500,auditlog, id:3333"

これが何をするかです:

  1. 「phase:1」(REQUEST_HEADERSフェーズ)で、Content-Typeが「text/xml:」であるかどうかを確認します。そうであれば、ボディ処理エンジンを「URLエンコード

  2. 「phase:2」(REQUEST_BODYフェーズ)では、プレーンテキスト文字列「不正な文字列」と入力し、ステータス コード 500 でリクエストをブロックします。

関連情報