ModSecurity 规则在请求正文中查找 JSON 值

问题描述 投票:0回答:1

我正在尝试创建一个 ModSecurity 规则(我实际上使用的是 Coraza,但它应该是同一件事)来拒绝请求(如果它在 POST 请求正文中包含 JSON 值)。这是我所拥有的:

SecRule REQUEST_BODY "@contains \"foo\":\"bar\"" "id:1001,phase:2,deny,log"

以下请求不被拒绝:

curl -v -H "Content-Type: application/json" -X POST -d '{"foo":"bar"}' http://localhost

即使下面的规则也不起作用:

SecRule REQUEST_BODY "@contains foo" "id:1001,phase:2,deny,log"

我在日志中看到这个:

2023/10/31 17:28:18 [DEBUG] Evaluating operator: NO MATCH tx_id="WtmgMAOcaYrcfgawZRd" rule_id=1001 operator_function="@contains" operator_data="foo" arg=""
mod-security
1个回答
0
投票

此处为 OWASP ModSecurity 核心规则集开发值班人员和 Coraza 维护人员。 假设您使用 coraza.conf-recommended 配置运行 Coranza,对您的结果产生影响的基本规则是

200001
:

SecRule REQUEST_HEADERS:Content-Type "^application/json" \ "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"

作为

application/json
请求的内容类型,将触发此规则,并且将处理您的请求的正文处理器将设置为 JSON 处理器。引用有关 REQUEST_BODY 变量的 Modsec
Coraza
文档:

保存原始请求正文。该变量仅在以下情况下可用 使用了 URLENCODED 请求正文处理器,这将由 当 application/x-www-form-urlencoded 内容类型为默认值时 检测到,或者是否使用了 URLENCODED 请求正文解析器 被迫。

因此,在这种情况下,

REQUEST_BODY
变量不会被填充。发生的情况是,主体请求由读取 JSON 内容的特定主体处理器进行处理,并将其拆分为 args(特别是 args_post)。

与请求发送的

{"foo":"bar"}
匹配的示例规则

curl -v -H "Content-Type: application/json" -X POST -d '{"foo":"bar"}' http://localhost

如下:

SecRule ARGS:json.foo "@contains bar" "id:1001,phase:2,deny,log"

这里我们正在寻找一个特定的 json ARG(甚至 ARGS_POST 也可以),以

foo
作为键,并且值必须包含
bar

话虽这么说,除了之前引用的文档参考之外,我同意弄清楚不同的身体处理器如何工作并不直观。我正在做笔记,以便向 Coraza 文档提供有关此主题的一些关注!

© www.soinside.com 2019 - 2024. All rights reserved.