2016-08-03 33 views
0

我试图为未知名称的参数设置ModSecurity白名单,但匹配值。例如,我想列出任何时间戳参数(例如timestamp=2016-01-01 00:00:00)。目前,此触发规则为981173 (Restricted SQL Character Anomaly Detection Alert - Total # of special characters exceeded)ModSecurity:值白名单参数

以下内容将生效,但如果至少有一个匹配项将跳过对所有参数的检查,因此它不会捕获https://www.example.com/?timestamp=2016-01-01+00:00:00&badvalue=2016-01-01+00:00:00:00中的badvalue参数。

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可以吗?有没有办法使用MATCHED_VAR_NAME这个用例?我宁愿不必为每个可能包含时间戳记的参数名称添加一条规则。

回答

0

不幸的是,目前不可能在ctl action参数中使用宏扩展。

作为证据考虑下面的例子:

SecRule ARGS "@contains bob" "id:1,t:none,pass,ctl:ruleRemoveTargetById=2;ARGS:x" 
SecRule ARGS "@contains hello" "id:2,deny,status:403" 

当提供以下请求:“http://localhost/?x=bobhello”我们将看到评估第二规则时的调试日志下面

[04/Aug/2016:00:44:07 - 0400] [localhost/sid#55e47aa583e0] [rid#55e47ad7cb10] [/] [4]食谱:调用规则55e47ab14638; [file“/etc/httpd/modsecurity.d/includeOWASP.conf”] [line“12”] [id“2”]。 [04/Aug/2016:00:44:07 - 0400] [localhost/sid#55e47aa583e0] [rid#55e47ad7cb10] [/] [5]规则55e47ab14638:SecRule“ARGS”“@contains hello” 2,log,auditlog,id:2,deny,status: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] fetch_target_exception:找到异常目标列表[ARGS:x]编号2 [04/Aug/2016:00:44:07 - 0400] [localhost/sid#55e47aa583e0] [rid#55e47ad7cb10] [/] [9] fetch_target_exception:目标ARGS:x将不会被处理。[04/Aug/2016:00:44:07 - 0400] [localhost/sid#55e47aa583e0] [rid#55e47ad7cb10] [/] [4]执行操作符“contains”param“hello” 。 [04/8/2016:00:44:07 --0400] [本地主机/ SID#55e47aa583e0] [摆脱#55e47ad7cb10] [/] [4]规则返回0

然而,当我们提供相同的请求( 'http://localhost/?x=bobhello')虽然有我们的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/8/2016:00 :44:41 - 0400] [localhost/sid#559f82a0b3e0] [rid#559f82d2fb50] [/] [5]规则559f82ac76e8:SecRule“ARGS”“@包含hello“”phase: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] fetch_target_exception:找到了例外目标列表[%{MATCHED_VAR_NAME}]规则ID 2 [04/Aug/2016:00:44:41 --0400] [localhost/sid#559f82a0b3e0] [rid#559f82d2fb50] [/] [4]执行运算符“contains”with param“hello”against ARGS :X。 [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次使用完成。 [04/8/2016:00:44:41 --0400] [本地主机/ SID#559f82a0b3e0] [摆脱#559f82d2fb50] [/] [4]规则返回1.

予想不到的在没有过多开销的情况下完成此目标的方法。在这一点上,最好的解决方案可能是手动将每个违规论点列入白名单。

+0

谢谢。我结束了每一个论点的补充。 –