ModSecurity OWASP核心规则集-unicode误报

ModSecurity OWASP核心规则集-unicode误报,unicode,encoding,owasp,mod-security,mod-security2,Unicode,Encoding,Owasp,Mod Security,Mod Security2,我们运行一些web服务 我们将Apache Web服务器的ModSecurity与OWASP核心规则集一起使用 我们在希腊文和俄文请求方面遇到问题,因为西里尔文和希腊文字母 在OWASP CRS的规则中,有如下模式 “(^[\”'''';]+\'''''';]+$)” 在ModSecurity日志中有UTF-8代码单元,其中应为unicode字符。所有ascii字母均按原样显示为字符 例如: [匹配的数据:\x85 2 \xce\xb7\xce\xbb\xce\xb9\xce\xbf\xcf\x

我们运行一些web服务

我们将Apache Web服务器的ModSecurity与OWASP核心规则集一起使用

我们在希腊文和俄文请求方面遇到问题,因为西里尔文和希腊文字母

在OWASP CRS的规则中,有如下模式

“(^[\”
'''';]+\'
''''';]+$)”

在ModSecurity日志中有UTF-8代码单元,其中应为unicode字符。所有ascii字母均按原样显示为字符

例如:

[匹配的数据:\x85 2 \xce\xb7\xce\xbb\xce\xb9\xce\xbf\xcf\x85\xcf\x80\xce 在ARGS中找到:q:163 45 \xcf\x83\xce\xbf\xcf\x85\xce\xbd\xce\xb9\xce\xbf\xcf\x85 2. \xce\xb7\xce\xbb\xce\xb9\xce\xbf\xcf\x85\xcf\x80\xce\xbf\xce\xbb\xce\xb7]

[模式匹配] (3)我:::(?我:::::::(?::,,““<代码><代码>\\2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X2\\X8.0\\X8.0\\X2\\X8.0\\X8.0\\X8\\X8\\X8\\X8\\X8.0\\X8.0\\X8\\X8.0\\X8...0\\X8.0\\X8.0\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98.?:^[\\”\xc2\xb4\xe2\x80\x99\xe2\x80\x98\\\\]*?(?:[\\ ……“]

现在我们知道它是由希腊语的一个请求触发的: (雅典的一条街道) 这不是我们的问题,我们可以解决

问题在于x80是字符(e2 80 99)的一部分 x80也是希腊字母的一部分,这就是我们得到假阳性的原因。

触发的实际规则:

秘规 请求COOKIES!请求COOKIES:/uuuUTM/|!请求COOKIES:/pk_ref/|请求COOKIES名称|参数名称|参数| XML:/* (i)我:((?)我:((?)我::((?:““<代码>>”””””)我::((?)我::(?)我:(((?:”)我::((?::““““<代码>>”””””)我::()我::((x)或(x)或(或(124)或(124)之间,以及之间的分割)像像像之间的之间,以及之间的之间的之间的之间的)之间的其他之间的其他之间的其他之间的之间的,以及之间的其他之间的其他之间的其他之间的其他之间的其他之间的其他之间的其他之间的其他之间的其他之间的其他之间的其他之间的其他之间的其他之间的其他之间的)之间的其他之间的其他之间的?????*******。。。。。。。。。。。。。。((((((((“**)之间的)之间的之间的124; x?x?或| div | like |介于|和| not | | | | | | | | | | | | | | | | | | | | | | | | | | | | 124\(2)以下几:(和)x?或(1244)迪夫·迪夫(像)在之间之间以及之间之间之间的|以及之间之间的)和之间的)之间的)之间的,以及(2)之间的)之间的)之间的,以及(2)之间的)之间的)之间的)之间的)之间的)之间的)之间的,以及(2)s)s*(2)s*(3)s*(3)s*(3)s*(3)s*(3)s*(3)s*(3)s*(3)s*(3 3 3 3)s*(3 3 3.[[[““““““““““““,””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””u模式|表_名称\w))” “阶段:2,捕获,t:none,t:urldecodeconi,block,msg:”检测经典SQL 注射探头 1/2',id:'981242',标记:'OWASP\u CRS/WEB\u攻击/SQL\u注入',日志数据:'Matched' 数据:%{TX.0}在%{MATCHED_VAR_NAME}内找到: %{MATCHED_VAR}',严重性:'2',setvar:'tx.msg=%{rule.id}-%{rule.msg}',setvar:tx.sql_injection_score=+1,setvar:tx.normality_score=+%{tx.critical_normality_score},setvar:'tx.%{tx tx tx tx.msg}-OWASP_CRS/WEB_ATTACK/SQLI-%{MATCHED_VAR_name}={tx 0}'

为了解决这一问题,我们将一些模式(如[\“'
'''''''''')调整为(\“\'.'.'.
.\xc2\xb4.\xe2\x80\x99.\xe2\x80\x98)
,使其与构建字符的UTF-8代码单元的实际组合相匹配。我们可以对核心规则集的所有55条SQL注入规则都这样做,但这是一项耗费大量时间的任务


我们怀疑Apache或ModSecurity的解码是否存在错误配置。我们知道所有非ascii字符和一些ascii字符都是WebBrowser使用%和UTF-8编码的URL。

我不认为这是解码问题,这在我看来是意料之中的,你的(令人烦恼的冗长)如果知道您要保护的应用程序将其所有URL输入都视为UTF-8,则修复是可以的。(例如,对于使用Windows-1252的应用程序,它将不再“正确”,因为它将再次让
通过。)

或者,您可以完全删除智能引号过滤,前提是您不试图保护一个已知存在SQL注入问题以及Unicode处理不佳的应用程序。智能引号在其中,因为如果应用程序扁平化,则使用平台函数将非ASCII字符映射到ASC二、 像Windows的错误映射一样,它们可能会被转换为单引号,从而避免前面试图删除这些引号的WAF过滤器。(在我看来,这条规则似乎没有包括其他一些会被压平为引号的字符,如U+02B9、U+02BC、U+02C8、U+2032和U+FF07,因此在任何情况下,它可能都不是无懈可击的。)

TBH,这是MDA安全CRS规则的标准,特别是对于在路径部分使用任意字符串的站点,您会得到大量的假阳性,并且部署工具的大部分是配置它们以避免最坏的损坏。

IMO:WAF在原则上存在根本性缺陷(因为无法定义哪些输入可能构成攻击,哪些输入可能构成有效请求),并且默认的CRS比大多数都有缺陷。它们作为一种战术措施非常有用,可以阻止针对软件的已知攻击,而您无法在源代码处立即修复这些攻击,但作为通用输入筛选器,它们通常会导致比修复的问题更多的问题。

OWASP CRS邮件列表()对这类事情来说是很好的。如果他们能帮你找到答案,就把答案贴在这里。