いくつかの Web サービスを実行しています。
OWASPコアルールセットを備えたModSecurity for Apache Webサーバーを使用しています。
キリル文字とギリシャ文字があるため、ギリシャ語とロシア語のリクエストには問題があります。
OWASP CRS のルールには、次のようなパターンがあります。
"(^[\"' ´’‘;]+|[\"'
''';]+$)"
ModSecurity ログには、Unicode 文字である必要がある UTF-8 コード単位があります。すべての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|before|and)\s*?[^\w\s])|( ?:[^\w\s:]\s*?\d\W+[^\w\s]\s*?[\"'`´''].)|(?:\Winformation_schema|テーブル名\W ))" "phase:2,capture,t:none,t:urlDecodeUni,block,msg:'従来の SQL インジェクション プローブ 1/2 を検出',id:'981242',tag:'OWASP_CRS/WEB_ATTACK/SQL_INJECTION',logdata :'一致したデータ: %{TX.0} %{MATCHED_VAR_NAME} 内に見つかりました: %{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 文字も、Web ブラウザによって % および UTF-8 でエンコードされた URL であることがわかっています。