Мы запускаем некоторые веб-сервисы.
Мы используем 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 веб-браузерами.