核心规则集有一个modsecurity。 我有3个参数的POST请求:Par1 =“base64编码的XML”&Par2 =“url”&Par3 =“hash”。
我想修改CRS规则base64Decode 仅 Par1和使用Par2&Par3“原样”。
我试图使用SecRuleUpdateActionById
指令,但它需要为CRS中的每个规则编写指令。 SecDefaultAction
指令不起作用,因为所有的CRS规则都有“t:none”来覆盖默认的动作。 我也发现multiMatch
行动,但我认为这将导致base64string大量的误报。
有没有一些方法可以更新多个规则的操作,而不必重写这些规则?
我find了解决scheme。 我决定获取参数Par1的值,base64解码并logging在“TX”variables中。 这个variables在交易完成之前是可用的。 有两种方法可以做到这一点。
1.1。 使用lua:
使用相似的内容创build文件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
在加载CRS 之前添加SecRuleScript
指令:
SecRuleScript path/to/script/extract_param.lua phase:2,log
1.2。 使用标准的“setvar”function。 这个方法比较简单,我使用它。 但我后来发现( 这里 ),并决定告诉卢阿。
在 CRS加载之前添加以下规则:
SecRule ARGS:par1 "^(.*)$" "log, pass, id:22, phase:2, t:base64DecodeExt, setvar:tx.par1=%{MATCHED_VAR}"
2.加载CRS 后添加一堆SecRuleUpdateTargetByTag
指令:
SecRuleUpdateTargetByTag 'OWASP_CRS/WEB_ATTACK/SQL_INJECTION' "!ARGS:par1|TX:par1"
更新多个CRS规则的操作并不容易,因为您给出的原因,没有列出每个规则ID。
可以使用SecRuleUpdateTargetByTag来更新与一组规则匹配的variables,但不包含SecRuleUpdateActionByTag(仅SecRuleUpdateActionById ),但是要说实话,即使有只是想要变换1个variables的事实,引起你的问题。 我同意多比赛可能不是正确的答案,即使你可以这样做。
最终我会推荐的是:
保持规则不变,基本上忽略了CRS的base64 par1variables(注意,如果base64编码创build误报,您可能需要更新某些规则以忽略某些规则的此参数)。
决定什么攻击向量是你的par1的XMLvariables,并写入(或从CRS复制)规则的一个较小的子集,为此,与base64Decode转换。 即使在base64解码的时候,我也会想象XML会产生大量的误报,所以你可能不想在它们上面运行完整的CRS。
祝你好运!