我想要一个 ModSecurity 规则,如果它包含特定的字符串,它会阻止对任何 url 或任何 Body 请求 Post/Get 的访问。
例如我想阻止这个字符串:“km0ae9gr6m”
我已经制定了这条规则但它似乎不起作用。
SecRule ARGS "km0ae9gr6m" "log,deny,msg:'Access Denied'"
答案1
您使用的是哪个版本的 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'"
答案2
我唯一缺少的是处理阶段,必须在此阶段制定此规则才能使其发挥作用。所以实际规则就在这里。
SecRule REQUEST_URI|ARGS|REQUEST_BODY "km0ae9gr6m" "phase:4,log,deny,msg:'Access Denied'"
通过此规则,您可以轻松阻止您不希望任何用户看到的任何类型的响应。Modsecurity 将在它传出到服务器的过程中检测到它并将其阻止。
答案3
以上答案是正确的,使用 phase:1。您还可以使用“@contains”部分字符串匹配运算符来阻止将不需要的字符串作为较长字符串的一部分的请求。例如,我没有 word press,因此当我收到 wp-login、wp-admin 等请求时,我可以使用一条规则阻止它们:SecRule REQUEST_URI“@contains wp-”“id:101,phase:1,deny,status:409,msg:'Denied'”
附注:来自 msg: 的消息似乎只出现在日志中,用户看到的消息我已在 apache 配置 ErrorDocument 409 “严格禁止访问” 中添加