我正在尝试创建一个 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=""
此处为 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 文档提供有关此主题的一些关注!