ModSecurity OWASP Core Rule Set - falso positivo unicode

0

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. .

    
por Marco Wagner 16.08.2016 / 14:39

0 respostas