1

我想创建一个 mod security2x 规则,它将阻止对特定 URL 的 GET 请求。

例如,我想在标头中使用 GET 阻止 URL:'www.test.com'

我从未在 modsecurity 中制定规则,并且不确定这是否适用于异常检测模式。

这将是 GET 请求的示例:GET/secure/bla/test/etc/

这是我到目前为止所拥有的:SecRule ARGS "www.test.com" phase:2,log,deny,id:'1234',msg:'403 Access Denied'

4

2 回答 2

2

你想要这样的东西:

SecRule REQUEST_URI "@streq /secure/bla/test/etc/" \
     "phase:1,id:1234,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
    SecRule REQUEST_METHOD "@streq get" "t:none,t:lowercase"

您需要将两个规则链接在一起,因为您要检查两个条件(路径是 /secure/bla/test/etc/ 方法是 GET)。

如果您想添加第三条规则来检查主机(例如,如果您有多个虚拟主机并且此 URL 对其中一些主机的 GET 请求有效),那么您可以:

SecRule REQUEST_URI "@streq /secure/bla/test/etc/" \
     "phase:1,id:1234,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
    SecRule REQUEST_METHOD "@streq get" "t:none,t:lowercase,chain"
         SecRule SERVER_NAME "@streq www.example.com"

或者,您可以使用 REQUEST_URI_RAW ,其中包括协议和主机名以及请求的资源:

SecRule REQUEST_URI_RAW "^https?://www.test.com/secure/bla/test/etc/" \
     "phase:1,id:1234,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
    SecRule REQUEST_METHOD "@streq get" "t:none,t:lowercase" 

你会注意到我还添加了很多转换函数(t:位)来帮助避免人们试图绕过这个规则(例如使用类似 的路径/secure/bla/TEST/../test/etc/)。

所有这些都包含在参考手册中:https ://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual但确实需要一些练习才能习惯我承认!

异常检测模式简单意味着可能针对有效请求触发的规则不会立即阻止,而是分配一个分数,如果该请求的所有规则的总分高于某个阈值,则它会阻止,如果不是,它不会。这允许仍然包含“嘈杂”规则但被忽略,除非许多嘈杂规则都为请求触发,或者如果触发了一个重要规则。

正如我在上面所做的那样,没有什么可以阻止您使用“拒绝”选项明确阻止 - 即使在异常检测模式下也是如此。这条规则似乎相当安全,不会因为合法请求而意外触发(一旦你测试它有效!)所以我会像上面所做的那样直接阻止。另一种方法是denyblock,setvar:tx.anomaly_score=+%{tx.critical_anomaly_score}which 在稍后检查分数时会产生相同的效果,但在我看来不必要地使规则的可读性复杂化,因为它总是会阻塞。

这篇博客文章更详细地介绍了异常评分与传统评分:http: //blog.modsecurity.org/2010/11/advanced-topic-of-the-week-traditional-vs-anomaly-scoring-detection-modes .html

于 2016-10-11T18:09:51.887 回答
0

我会使用白名单方法来阻止 GET 请求,例如 login.php 和 change_password.php 不需要任何 GET 请求。

    SecRule REQUEST_URI|ARGS_NAMES|REQUEST_FILENAME "/secure/bla/test/etc/" "phase:2,t:none,deny,chain"
    SecRule REQUEST_FILENAME "@pm login.php change_password.php"
于 2021-06-20T00:55:32.023 回答