我有一个带有核心规则集的 modsecurity。我有 3 个参数的 POST 请求:Par1 = “base64-encoded XML”& Par2 = “url”&Par3 = “hash”。
我想将 CRS 规则修改为仅对Par1 进行 base64Decode 并“按原样”使用 Par2 和 Par3。
我尝试使用SecRuleUpdateActionById
指令,但它需要为 CRS 中的每条规则编写指令。
SecDefaultAction
指令也不起作用,因为所有 CRS 规则都有覆盖默认操作的“t:none”。我也找到了multiMatch
行动,但我认为它会在 base64-string 上造成很多误报。
是否有某种方法可以在不重写此规则的情况下更新多个规则的操作?
我找到了解决方案。我决定获取参数 Par1 的值,对其进行 base64 解码并记录在“TX”变量中。在事务完成之前,此变量将可用。有两种方法可以做到这一点。
1.1。使用 lua:
创建
extract_param.lua
具有相似内容的文件:在加载 CRS之前添加
SecRuleScript
指令:1.2. 使用标准的“setvar”功能。这个方法比较简单,我用过。但后来我找到了它(在这里),并决定也介绍一下 lua。
在加载 CRS之前添加以下规则:
2.加载CRS后添加一堆
SecRuleUpdateTargetByTag
指令:更新多个 CRS 规则的操作并不容易,因为您给出的原因没有列出每个规则 ID。
可以使用SecRuleUpdateTargetByTag更新与一组规则匹配的变量,但不能更新操作,因为没有 SecRuleUpdateActionByTag (只有一个SecRuleUpdateActionById),但老实说,即使您只想转换 1 个变量给你带来麻烦。我同意多重匹配在这里可能不是正确的答案,即使你可以这样做。
最终我会推荐的是:
保持规则不变,基本上忽略 CRS 的 base64 par1 变量(请注意,如果 base64 编码产生误报,您可能需要更新某些规则以忽略某些规则的此参数)。
确定 par1 XML 变量的攻击向量,并为此编写(或从 CRS 复制)较小的规则子集,并使用 base64Decode 转换。即使在 base64 解码时,我想 XML 仍然会产生很多误报,所以你可能不想在它们上运行完整的 CRS。
祝你好运!