2017-05-30 19 views
0

I次のルールがあります。ModSecurityは:動作していないremoveWhitespace

SecRule REQUEST_HEADERS:Client-IP "@ipMatchFromFile test.txt" 
"id:210487,t:none,t:urlDecodeUni,t:removeWhitespace,drop,msg:'IP-test'" 

をしかし、私はそれを実行すると、私は応答を取得:

T (0) urlDecodeUni: "111.22.33.44 " // note the space before the " 
T (0) removeWhitespace: "111.22.33.44" // perfect! The space has been removed 
Transformation completed in 4 usec. 
Executing operator "ipMatchFromFile" with param "test.txt" against REQUEST_HEADERS:Client-IP. 
Target value: "111.22.33.44" // target value has no space, hooray! 
IPmatchFromFile: Total tree entries: 8, ipv4 8 ipv6 0 
IPmatch: bad IPv4 specification "111.22.33.44 ". // why, oh why, is the space back! 
Operator completed in 4 usec. 
Operator error: IPmatch: bad IPv4 specification "111.22.33.44 ". // that space again! 
Rule returned -1. 
Rule processing failed. 
Rule failed, not chained -> mode NEXT_RULE. 

オーバーフローの伝説をスタックしてください。どのように修正できるかを私に見せてください:-)

+0

ありますか?変換は、ファイルエントリがファイル内のエントリと比較されるのではなく、要求内の引数に対してのみ行われます。 –

+0

test.txtに空白はなく、Client-IPはX-Forwarded-Forに相当します。何か上流にはスペースを追加します。これはtest.txtと比較する前に削除する必要があります。 – Marcus

答えて

1

これはうまくいくはずなので、バグのようです。正直なところ、変換が必要なIPアドレスを最初に照合しようとしたとは言えません。

実際にはIPアドレスではないので、@ ipFatchFromFileではなく@pmFromFileを使用するように切り替えることができます。 the documentationあなたは正しくここに境界線を使用する必要があることを明示的に警告していることに注意してください:この演算子は、マッチングの境界をチェックしません

ので、 偽陽性は、いくつかの例において可能です。たとえば、IPアドレスの一致に で@pmを使用する場合、1.2.3.4というフレーズは、複数のIPアドレスと一致する可能性があります( 1.2.3.40または1.2.3.41と一致します)。 偽陽性を避けるために、あなた自身の境界をフレーズで使うことができます。たとえば、 の代わりに/1.2.3.4/を使用します。1.2.3.4。次に、ルール内で、必要に応じて境界を追加します。あなたは例の完全な例があります:

# Prepare custom REMOTE_ADDR variable 
SecAction "phase:1,id:168,nolog,pass,setvar:tx.REMOTE_ADDR=/%{REMOTE_ADDR}/" 

# Check if REMOTE_ADDR is blacklisted 
SecRule TX:REMOTE_ADDR "@pmFromFile blacklist.txt" "phase:1,id:169,deny,msg:'Blacklisted IP address'" 

ファイルblacklist.txtは含まれていてもよい:test.txtのファイルで、リスト内のスペースが

# ip-blacklist.txt contents: 
# NOTE: All IPs must be prefixed/suffixed with "/" as the rules 
# will add in this character as a boundary to ensure 
# the entire IP is matched. 
# SecAction "phase:1,id:170,pass,nolog,setvar:tx.remote_addr='/%{REMOTE_ADDR}/'" 
/1.2.3.4/ 
/5.6.7.8/ 
+1

良いアプローチ。明日の朝に試してみてください。ありがとうBazzaDP! – Marcus

+0

ありがとう! SecRule TX:REMOTE_ADDR "@pmFromFile blacklist.txt" "フェーズ:1、id:169、t:removeWhitespace、deny、msg: 'ブラックリストに登録されたIPアドレス'" – Marcus

関連する問題