web-dev-qa-db-ja.com

リクエスト内のModSecurityブロック固有の文字列

特定の文字列が含まれている場合、URLまたはBodyリクエストのPost/GetへのアクセスをブロックするModSecurityルールが必要です。

たとえば、この文字列をブロックしたい: "km0ae9gr6m"

私はこのルールを適切に持っていますが、機能していないようです。

SecRule ARGS "km0ae9gr6m" "log,deny,msg:'Access Denied'"

3
Farhan

私が見逃していたのは、処理フェーズだけでした。このフェーズでは、このルールを機能させる必要があります。実際のルールはこちらです。

SecRule REQUEST_URI|ARGS|REQUEST_BODY "km0ae9gr6m" "phase:4,log,deny,msg:'Access Denied'"

このルールにより、ユーザーに見せたくないあらゆるタイプの応答を簡単にブロックできます。 Modsecurityは、サーバーに向かう途中でそれを検出し、ブロックします。

2
Farhan

どのModSecurityバージョンを使用していますか? ARGS変数には、バージョン1.Xでは_QUERY_STRING_ + _POST_PAYLOAD_のみが含まれます。上記のルールでバージョン2.Xを実行している場合は、以下のリクエストでテストします。

_http://domain.com/a?b=km0ae9gr6m
_

_audit_log_に次のようなものが表示されます。

[modsecurity] [client x.x.x.x] [domain domain.com] [302] [/20120813/20120813-1226/20120813-122624-70QXqH8AAAEA AEucDbkAAAAA] [file "/etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf"] [line "305"] [msg "Access Denied"] Access denied with code 403 (phase 2). Pattern match "km0ae9gr6m" at ARGS:b.

ModSecurity 2.xでは、ARGSは個々の変数に展開されます。だから、これを試してください:

_SecRule REQUEST_URI|ARGS|REQUEST_BODY "km0ae9gr6m" "log,deny,msg:'Access Denied'"
_
8
quanta

上記の答えは正しいです、フェーズを使用してください:1。 「@contains」部分文字列一致演算子を使用して、不要な文字列が長い文字列の一部であるリクエストを停止することもできます。たとえば、Word Pressがないため、wp-login、wp-adminなどのリクエストを受け取ったときに、1つのルールでそれらすべてをブロックできます。SecRuleREQUEST_URI "@contains wp-" "id:101、フェーズ:1、拒否、ステータス:409、メッセージ:「拒否」」

余談ですが、msg:からのメッセージはログにのみ表示されるようです。ユーザーが見るメッセージは、Apache config ErrorDocument 409 "ACCESS STRICTLY FORBIDDEN"に追加されています。

0
Chris