Мы запускаем некоторые веб-сервисы.

Мы используем ModSecurity для веб-сервера Apache с набором основных правил OWASP.

У нас проблемы с запросами на греческом и русском языках из-за кириллицы и греческих букв.

В правилах OWASP CRS есть такие шаблоны, как

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

В журнале ModSecurity есть единицы кода 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]

[Шаблон соответствия "(?я:(?: [\ "' \\xc2\\xb4\\xe2\\x80\\x99\\xe2\\x80\\x98]\\\\s*?(x?or|div|like|between|and)\\\\s*?[\\"' \xc2 \xb4 \xe2 \x80 \x99 \xe2 \x80 \x98]?\\ г)|)|((:: \\\\ х (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:/* "(?я:(?: [\"' ´’‘]\s*?(x?or|div|like|between|and)\s*?[\"' ´' ']?\D)|)|((:\\х (23 | | 27 3d?):?.?^ [\"' ´’‘]$)|(?:(?:^[\"' ´ '' \\] ?(?: [\D \"' ´’‘]+|[^\"' ´ ' ']+[\"' ´’‘]))+\s*?(?:n?and|x?x?or|div|like|between|and|not|\|\||\&\&)\s*?[\w\"' ´' '] [+&!@ (), .-])|(?: [^ \w \s] \w+\s?[| -]\С *?[\"' ´’‘]\s*?\w)|(?:@\w+\s+(and|x?or|div|like|between|and)\s*?[\"' ´' '\d]+)|(?: @ [\W -]+\s (и | x?или | DIV | как | между | и)\с * [?^ \Ш \s])|(: [^ \ш \s:] \с *?\Д \W+[^ \ш \с] \S *?[\" '' '' '].)|(?:\Winformation_schema | table_name \W))"" phase: 2, capture, t: none, t: urlDecodeUni, block, msg: 'Обнаруживает классические проверки SQL-инъекций 1/2', id: '981242', тег : '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.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 также являются URL-адресами, закодированными с помощью% и UTF-8 веб-браузерами.

0