我们运行一些网络服务。
我们将 ModSecurity 与 OWASP 核心规则集一起用于 Apache 网络服务器。
由于西里尔字母和希腊字母,我们在处理希腊语和俄语的请求时遇到了问题。
在 OWASP CRS 规则中,有如下模式
“(^[\”' ´’‘;]+|[\"'
´'';]+$)”
在 ModSecurity 日志中,UTF-8 代码单元应该是 unicode 字符。所有 ascii 字母都按应有的方式显示为字符。
例子:
[匹配数据:在 ARGS:q 中找到 \x85 2 \xce\xb7\xce\xbb\xce\xb9\xce\xbf\xcf\x85\xcf\x80\xce: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:'检测经典 SQL 注入探测 1/2',id:'981242',tag:'OWASP_CRS/WEB_ATTACK/SQL_INJECTION',logdata:'匹配数据:在 %{MATCHED_VAR_NAME} 中找到 %{TX.0}: %{MATCHED_VAR}',严重性:'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 编码。