ModSecurity OWASP Çekirdek Kural Seti - unicode yanlış pozitif


0

Bazı web servislerini işletiyoruz.

ModSecurity için Apache web sunucusu için OWASP çekirdek kuralı setini kullanıyoruz.

Kiril ve yunan harfleri nedeniyle Yunanca ve rusça taleplerde sorunumuz var.

OWASP CRS kurallarında aşağıdaki gibi kalıplar vardır.

"(^ [\" ´’‘;]+|[\"''´';;] + $) "

ModSecurity Günlüğü'nde Unicode karakterleri olması gereken UTF-8 kod birimleri vardır. Tüm ascii harfleri olması gerektiği gibi karakter olarak gösterilir.

Örnek:

[Eşleşen Veriler: \ x85 2 \ xce \ xb7 \ xce \ xbb \ xce \ xb9 \ xce \ xbf \ xbf \ xcf \ x85 \ xcf \ x80 \ xce \ xce \ xbf \ xcf \ x85 \ xcf \ x80 \ xce ARGS içinde bulundu: q: 163 45 \ xcf \ x83 \ xbf \ xcf \ x85 \ xce \ xbd \ xce \ xb9 \ xce \ xbf \ xcf \ x85 2 \ xce \ xb7 \ xce \ xbb \ xcf \ xb9 \ xce \ xbf \ xcf \ x85 \ xcf \ x80 \ xce \ xbf \ xcf \ x85 \ xcf \ x80 \ xce \ xbf \ xcf \ x85 \ xcf \ x80 \ xbb \ çıkışlardaki \ XB7]

[Desen eşleşmesi "(? İ: (?: [\" ' \\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 \\\\] *? (?: [\\ ..." ]

Şimdi bunun Yunanca'da bir istek tarafından tetiklendiğini biliyoruz: σουνιου ηλιουπολη (Athen'da bir sokak) Bu bizim sorunumuz değil. Bunu çözebiliriz.

Sorun şu ki, x80 karakterin bir parçası '(e2 80 99) ve x80 de Yunanca bir mektubun parçası, bu yüzden yanlış bir pozitif aldık.

Tetiklenen gerçek kural:

SecRule REQUEST_COOKIES |! REQUEST_COOKIES: / __ utm / |! REQUEST_COOKIES: / _ pk_ref / | REQUEST_COOKIES_NAMES | ARGS_NAMES | ARGS | XML: / * "(? İ: (: [\" ' ´’‘]\s*?(x?or|div|like|between|and)\s*?[\"'´' '']] (? : \\ 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 (ve | x ya da | div | gibi | arasında | ve) \ s * [^ \ \ w s]) | (? : [^ \ \ w s:] \ * \ d s \ W + [^ \ \ w s] \ s * [\ " '' '' ']) | (:?.? \ Winformation_schema | tablo_adı \ W )) "" faz: 2, yakalama, t: yok, t: urlDecodeUni, blok, msg: 'Klasik SQL enjeksiyon işlemlerini 1/2' olarak algılar ', id:' 981242 ', etiket:' OWASP_CRS / WEB_ATTACK / SQL_INJECTION ', logdata : 'Eşleşen Veri:% {MAT.0ED_VAR_NAME}% {içerisinde bulunan% {TX.0}:% {MATCHED_VAR}', önem derecesi: '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} '"

Geçici bir çözüm için, [\ "' ´’‘] to (\"|'|| \ xc2 \ xb4 | \ xe2 \ x80 \ x99 | \ xe2 \ x80 \ x98) gibi bazı desenleri ayarladık, böylece karakter oluşturan UTF-8 kod birimlerinin gerçek kombinasyonlarına uyacak . Temel Kural Kümesinin 55 SQL Enjeksiyon Kuralları için bunu yapabilir, ancak bu çok zaman alan bir iştir.

Apache'nin veya ModSecurity'in kodunu çözme ile ilgili yanlış bir yapılandırma olup olmadığını merak ediyoruz. Tüm ascii olmayanların ve bazı ascii karakterlerinin web tarayıcıları tarafından% ve UTF-8 ile kodlanmış URL olduğunu biliyoruz.


Modülün UTF-8 geçerli olmayan bir şeyi reddetmesini sağlayabilir misiniz? Bu şekilde 0x80artık tek başına gerçekleşmeyecek (UTF-8 geçerliliği bunu sağlayacak).
Grawity,

UTF-8 kodlaması geçerli. e2 80 99 iyi. Burada sorunu anlamadın.
Marco Wagner,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.