modsecurity 创建规则禁用 GET 请求

modsecurity create rule disable GET request

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

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

我从未在 mod 安全范围内制定规则,并且不确定这是否适用于异常检测 mode.

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

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

你想要这样的东西:

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但我承认确实需要一些练习才能习惯!

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

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

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

我会使用白名单方法来阻止 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"