如何仅针对一个参数修改modsecurity规则操作?

如何仅针对一个参数修改modsecurity规则操作?

我有一个带有核心规则集的 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 个变量,也会给你带来麻烦。我同意,即使你可以这样做,多重匹配可能也不是正确的答案。

最后,我的建议是:

  1. 保持规则不变并基本上忽略 CRS 的 base64 par1 变量(请注意,如果 base64 编码产生误报,则可能需要更新某些规则以忽略某些规则的此参数)。

  2. 确定 par1 XML 变量的攻击向量,并为此编写(或从 CRS 复制)一个较小的规则子集,并使用 base64Decode 转换。即使经过 base64 解码,我猜 XML 仍然会产生大量误报,因此您可能不想对它们运行完整的 CRS。

祝你好运!

相关内容