我有一个带有核心规则集的 modsecurity。我有带 3 个参数的 POST 请求:Par1 = “base64 编码的 XML”& Par2 = “url”& Par3 = “hash”。
我想修改 CRS 规则为 base64Decode仅有的Par1 并按原样使用 Par2 和 Par3。
我尝试使用SecRuleUpdateActionById
指令,但它要求为 CRS 中的每个规则编写一个指令。
SecDefaultAction
指令也不起作用,因为所有 CRS 规则都有“t:none”,它会覆盖默认操作。我还发现multiMatch
操作,但我认为这会对 base64 字符串造成很多误报。
有没有办法在不重写多个规则的情况下更新多个规则的操作?
答案1
我找到了一个解决方案。我决定获取参数 Par1 的值,对其进行 base64 解码并记录在“TX”变量。此变量将一直可用,直到交易完成。有两种方法可以做到这一点。
1.1.使用lua:
创建
extract_param.lua
具有类似内容的文件:function main() -- Retrieve par1 local par1 = m.getvar("ARGS.Par1", {"base64DecodeExt"}); if par1 == nil then m.log(3, "no Par1 in request."); return nil; end m.log(3, "Par1 base64-decoded:" ..par1.. "."); m.setvar("TX.Par1",par1); return nil; end
添加
SecRuleScript
指令前CRS 已加载:SecRuleScript path/to/script/extract_param.lua phase:2,log
1.2. 使用标准“setvar”功能。这种方法比较简单,我用过。但我发现它(这里) 并决定也讲述一下 lua。
添加以下规则前CRS 已加载:
SecRule ARGS:par1 "^(.*)$" "log, pass, id:22, phase:2, t:base64DecodeExt, setvar:tx.par1=%{MATCHED_VAR}"
2.添加一组SecRuleUpdateTargetByTag
指令后CRS 已加载:
SecRuleUpdateTargetByTag 'OWASP_CRS/WEB_ATTACK/SQL_INJECTION' "!ARGS:par1|TX:par1"
答案2
更新多个 CRS 规则的操作并不容易,除非列出每个规则 ID 并说明原因。
可以使用以下方法更新与一组规则匹配的变量SecRuleUpdateTargetByTag但由于没有 SecRuleUpdateActionByTag(只有规则更新操作) 但说实话,即使你只想转换 1 个变量,也会给你带来麻烦。我同意,即使你可以这样做,多重匹配可能也不是正确的答案。
最后,我的建议是:
保持规则不变并基本上忽略 CRS 的 base64 par1 变量(请注意,如果 base64 编码产生误报,则可能需要更新某些规则以忽略某些规则的此参数)。
确定 par1 XML 变量的攻击向量,并为此编写(或从 CRS 复制)一个较小的规则子集,并使用 base64Decode 转换。即使经过 base64 解码,我猜 XML 仍然会产生大量误报,因此您可能不想对它们运行完整的 CRS。
祝你好运!