Executamos alguns serviços da web.
Usamos o servidor web ModSecurity for Apache com o conjunto principal de regras OWASP.
Temos problemas com solicitações gregas e russas, por causa de letras cirílicas e gregas.
Nas regras do OWASP CRS existem padrões como
"(^ [\" ' ´’‘;]+|[\"'
´' ‘;] + $)"
No log do ModSecurity, há unidades de código UTF-8, onde devem existir caracteres unicode. Todas as letras ascii são mostradas como caracteres como deveriam ser.
Exemplo:
[Matched Data: \x85 2 \xce\xb7\xce\xbb\xce\xb9\xce\xbf\xcf\x85\xcf\x80\xce found within 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]
[Pattern match "(?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\\]*?(?:[\ ..."]
Agora sabemos que foi acionado por um pedido em grego: σουνιου ηλιουπολη (uma rua em Athen) Isso não é problema nosso. Nós podemos descobrir isso.
O problema é que x80 é parte do personagem '(e2 80 99) e x80 também faz parte de uma carta grega, por isso recebemos um falso positivo.
A regra atual que foi acionada:
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:'Matched Data: %{TX.0} found within %{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}'"
Para uma solução alternativa, ajustamos alguns padrões como [\ "' ´’‘] to (\"|'|
| \ xc2 \ xb4 | \ xe2 \ x80 \ x99 | \ xe2 \ x80 \ x98) para que ele corresponda ao real combinações de unidades de código UTF-8 que criam um caractere.Podemos fazer isso para todas as 55 Regras de Injeção SQL do Conjunto de Regras Principais, mas essa é uma tarefa que consome muito tempo.
Nós nos perguntamos se existe apenas uma configuração incorreta com a decodificação do Apache ou do ModSecurity. Sabemos que todos os caracteres não-ascii e ascii também são codificados com% e UTF-8 pelos navegadores da Web. .