我们运行一些网络服务。
我们将 ModSecurity for Apache 网络服务器与 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]
[模式匹配 "(?i:(?:[\"'
\\xc2\\xb4\\xe2\\x80\\x99\\xe2\\x80\\x98]\\\\s*?(x?or|div|like|between|and)\\\\s*?[\\"'
\xc2\xb4\xe2\x80\x99\xe2\x80\x98]?\\d)|(?:\\\\x(?:23 |27|3d))|(?:^.?[\"'\\xc2\\xb4\\xe2\\x80\\x99\\xe2\\x80\\x98]$)|(?:(?:^[\\"'
\xc2\xb4\xe2\x80\x99\xe2\x80\x98\\\\]*?(?:[\\ ..." ]
现在我们知道它是由希腊语中的一个请求触发的:σουνιου ηλιουπολη(雅典的一条街道)这不是我们的问题。我们可以弄清楚。
问题是 x80 是字符 ' (e2 80 99) 的一部分,而 x80 也是希腊字母的一部分,这就是我们得到误报的原因。
触发的实际规则:
SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|!REQUEST_COOKIES:/_pk_ref/|REQUEST_COOKIES_NAMES|ARGS_NAMES|ARGS|XML:/* "(?i:(?:[\"'
´’‘]\s*?(x?or|div|like|between|and)\s*?[\"'
´'']?\d)|(? :\\x(?:23|27|3d))|(?:^.?[\"'´’‘]$)|(?:(?:^[\"'
'''\\] ?(?:[\d\"'´’‘]+|[^\"'
''']+[\"'´’‘]))+\s*?(?:n?and|x?x?or|div|like|between|and|not|\|\||\&\&)\s*?[\w\"'
'''][+&!@(),.-])|(?:[^\w\s]\w+\s ?[|-]\s*?[\"'´’‘]\s*?\w)|(?:@\w+\s+(and|x?or|div|like|between|and)\s*?[\"'
´''\d]+)|(?:@[\w-]+\s(and|x?or|div|like|between|and)\s*?[^\w\s])|( ?:[^\w\s:]\s*?\d\W+[^\w\s]\s*?[\"'`´''].)|(?:\Winformation_schema|table_name\W ))" "phase:2,capture,t:none,t:urlDecodeUni,block,msg:'Detects classic SQL injection probings 1/2',id:'981242',tag:'OWASP_CRS/WEB_ATTACK/SQL_INJECTION',logdata :'匹配数据: %{TX.0} 在 %{MATCHED_VAR_NAME} 中找到: %{MATCHED_VAR}',severity:'2',setvar:'tx.msg=%{rule.id}-%{rule.msg} ',setvar:tx.sql_injection_score=+1,setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},setvar:'tx.%{tx.msg}-OWASP_CRS/WEB_ATTACK/SQLI-%{matched_var_name}=%{ tx.0}'"
作为一种解决方法,我们调整了一些模式,例如[\"' ´’‘] to (\"|'|
|\xc2\xb4|\xe2\x80\x99|\xe2\x80\x98),使其与构建字符的 UTF-8 代码单元的实际组合相匹配。我们可以对核心规则集中的所有 55 个 SQL 注入规则执行此操作,但这是一项耗时的任务。
我们想知道是否只是 Apache 或 ModSecurity 的解码配置错误。我们知道所有非 ascii 和一些 ascii 字符也是由网络浏览器使用 % 和 UTF-8 编码的 URL。