Apache ModSecurity:按值列出白名单参数

Apache ModSecurity:按值列出白名单参数,apache,mod-security,Apache,Mod Security,我正在尝试为名称未知但与值匹配的参数设置ModSecurity白名单。例如,我想将任何时间戳参数列为白名单(例如,timestamp=2016-01-01 00:00:00)。目前,这会触发规则981173(受限SQL字符异常检测警报-超出特殊字符总数) 下面的操作将起作用,但如果至少有一个参数匹配,则将跳过对所有参数的检查,因此它不会捕获中的badvalue参数https://www.example.com/?timestamp=2016-01-01+00:00:00&badvalue=201

我正在尝试为名称未知但与值匹配的参数设置ModSecurity白名单。例如,我想将任何时间戳参数列为白名单(例如,
timestamp=2016-01-01 00:00:00
)。目前,这会触发规则
981173(受限SQL字符异常检测警报-超出特殊字符总数)

下面的操作将起作用,但如果至少有一个参数匹配,则将跳过对所有参数的检查,因此它不会捕获
中的
badvalue
参数https://www.example.com/?timestamp=2016-01-01+00:00:00&badvalue=2016-01-01+00:00:00

SecRule ARGS "@rx ^2[0-9]{3}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$" \
    "id:'99001', phase:1, nolog, pass, t:none, \
    ctl:ruleRemoveTargetByTag=OWASP_CRS/WEB_ATTACK/SQL_INJECTION;ARGS"
如果我对参数名称进行硬编码,则以下操作有效

SecRule ARGS:timestamp "@rx ^2[0-9]{3}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$" \
    "id:'99001', phase:1, nolog, pass, t:none, \
    ctl:ruleRemoveTargetByTag=OWASP_CRS/WEB_ATTACK/SQL_INJECTION;ARGS:timestamp"
我试过以下方法,但都不管用

SecRule ARGS "@rx ^2[0-9]{3}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$" \
    "id:'99001', phase:1, nolog, pass, t:none, \
    ctl:ruleRemoveTargetByTag=OWASP_CRS/WEB_ATTACK/SQL_INJECTION;/%{MATCHED_VAR_NAME}/"

SecRule ARGS "@rx ^2[0-9]{3}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$" \
    "id:'99001', phase:1, nolog, pass, t:none, \
    ctl:ruleRemoveTargetByTag=OWASP_CRS/WEB_ATTACK/SQL_INJECTION;MATCHED_VAR_NAME"

这在ModSecurity中是可能的吗?对于这个用例,有没有方法使用
匹配的\u VAR\u NAME
?我不希望为每个可能包含时间戳的参数名称添加规则。

不幸的是,目前无法在ctl操作参数中使用宏扩展

作为证据考虑以下例子:

SecRule ARGS "@contains bob" "id:1,t:none,pass,ctl:ruleRemoveTargetById=2;ARGS:x"
SecRule ARGS "@contains hello" "id:2,deny,status:403"
提供以下请求时:''在评估第二条规则时,我们将在调试日志中看到以下内容

[04/Aug/2016:00:44:07--0400][localhost/sid#55e47aa583e0][rid#55e47ad7cb10][/][4]配方:调用规则55e47ab14638;[文件“/etc/httpd/modsecurity.d/includeowap.conf”][line“12”][id“2”]。 [04/Aug/2016:00:44:07--0400][localhost/sid#55e47aa583e0][rid#55e47ad7cb10][/][5]规则55e47ab14638:SecRule“ARGS”“@包含hello”“阶段:2,日志,审核日志,id:2,拒绝,状态:403” [04/Aug/2016:00:44:07--0400][localhost/sid#55e47aa583e0][rid#55e47ad7cb10][/][4]转换在0 usec中完成。 [04/Aug/2016:00:44:07--0400][localhost/sid#55e47aa583e0][rid#55e47ad7cb10][/][9]获取目标异常:找到规则id 2的异常目标列表[ARGS:x] [04/Aug/2016:00:44:07--0400][localhost/sid#55e47aa583e0][rid#55e47ad7cb10][/][9]获取目标异常:将不处理目标参数:x。 [04/Aug/2016:00:44:07--0400][localhost/sid#55e47aa583e0][rid#55e47ad7cb10][/][4]针对ARGS:x跳过带参数“hello”的执行运算符“contains”。 [04/Aug/2016:00:44:07--0400][localhost/sid#55e47aa583e0][rid#55e47ad7cb10][/][4]规则返回0

但是,当我们在ctl操作中进行宏扩展时(如下所示),提供相同的请求(“”):

我们的调试日志将显示如下:

SecRule ARGS "@contains bob" "id:1,t:none,pass,ctl:ruleRemoveTargetById=2;%{MATCHED_VAR_NAME}"
SecRule ARGS "@contains hello" "id:2,deny,status:403"
[04/Aug/2016:00:44:41--0400][localhost/sid#559f82a0b3e0][rid#559f82d2fb50][/][5]规则559f82ac76e8:SecRule“ARGS”“@包含hello”“阶段:2,日志,审核日志,id:2,拒绝,状态:403” [04/Aug/2016:00:44:41--0400][localhost/sid#559f82a0b3e0][rid#559f82d2fb50][/][4]转换在0 usec中完成。 [04/Aug/2016:00:44:41--0400][localhost/sid#559f82a0b3e0][rid#559f82d2fb50][/][9]获取目标异常:找到规则id 2的异常目标列表[%{MATCHED_VAR_NAME}] [04/Aug/2016:00:44:41--0400][localhost/sid#559f82a0b3e0][rid#559f82d2fb50][/][4]针对ARGS:x执行运算符“contains”和参数“hello”。 [04/Aug/2016:00:44:41--0400][localhost/sid#559f82a0b3e0][rid#559f82d2fb50][/][9]目标值:“bobhello” [04/Aug/2016:00:44:41--0400][localhost/sid#559f82a0b3e0][rid#559f82d2fb50][/][4]操作员在2次usec中完成。 [04/Aug/2016:00:44:41--0400][localhost/sid#559f82a0b3e0][rid#559f82d2fb50][/][4]规则返回1


我想不出一种不增加额外开销就能实现这一目标的方法。在这一点上,最好的解决方案可能是手动将每个有问题的论点列入白名单。

谢谢。最后我把每一个论点都加了起来。