Вопрос или проблема
Это содержимое моего RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
# Установите правила в режим обнаружения (они будут записывать, но не блокировать)
SecRuleUpdateActionById 941100 "pass,log"
SecRuleUpdateActionById 941110 "pass,log"
SecRuleUpdateActionById 941160 "pass,log"
SecRuleUpdateActionById 941390 "pass,log"
Когда я пытаюсь отправить запрос с полезной нагрузкой XSS (упомянутые выше правила должны обнаруживать XSS) на мой сервер nginx, я все еще получаю код состояния 403, хотя я явно указал ModSecurity пропустить запрос, если совпадет любое из вышеупомянутых правил.
Вывод журнала аудита
ModSecurity: Предупреждение. Обнаружен XSS с помощью libinjection. [файл "/usr/local/coreruleset-4.4.0/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [строка "82"] [id "941100"] [rev ""] [msg "Обнаружена атака XSS через libinjection"] [data "Совпадающие данные: найдены XSS данные в ARGS:username: <script>alert('XSS')</script>"] [severity "2"] [ver "OWASP_CRS/4.4.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "xss-perf-disable"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"] [hostname "10.38.135.193"] [uri "/"] [unique_id "172775143962.900184"] [ref "v292,29t:utf8toUnicode,t:urlDecodeUni,t:htmlEntityDecode,t:jsDecode,t:cssDecode,t:removeNulls"]
ModSecurity: Предупреждение. Совпадение "Оператор `Rx' с параметром `(?i)<script[^>]*>[\s\S]*?' против переменной `ARGS:username' (Значение: `<script>alert('XSS')</script>' ) [файл "/usr/local/coreruleset-4.4.0/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [строка "108"] [id "941110"] [rev ""] [msg "Фильтр XSS - Категория 1: Вектор тега Script"] [data "Совпадающие данные: <script> найдены в ARGS:username: <script>alert('XSS')</script>"] [severity "2"] [ver "OWASP_CRS/4.4.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "xss-perf-disable"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"] [hostname "10.38.135.193"] [uri "/"] [unique_id "172775143962.900184"] [ref "o0,8v292,29t:utf8toUnicode,t:urlDecodeUni,t:htmlEntityDecode,t:jsDecode,t:cssDecode,t:removeNulls"]
ModSecurity: Предупреждение. Совпадение "Оператор `Rx' с параметром `(?i)<[^0-9<>A-Z_a-z]*(?:[^\s\x0b\"'<>]*:)?[^0-9<>A-Z_a-z]*[^0-9A-Z_a-z]*?(?:s[^0-9A-Z_a-z]*?(?:c[^0-9A-Z_a-z]*?r[^0-9A-Z_a-z]*?i[^0-9A-Z_a-z]*?p[^0-9A-Z_a-z]*?t|t[^0-9A-Z_a-z]*?y[^0-9A-Z_a-z]*?l[^0-9A (4341 символов опущено)' против переменной `ARGS:username' (Значение: `<script>alert('XSS')</script>' ) [файл "/usr/local/coreruleset-4.4.0/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [строка "200"] [id "941160"] [rev ""] [msg "NoScript XSS InjectionChecker: HTML Injection"] [data "Совпадающие данные: <script найдены в ARGS:username: <script>alert('XSS')</script>"] [severity "2"] [ver "OWASP_CRS/4.4.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "xss-perf-disable"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"] [hostname "10.38.135.193"] [uri "/"] [unique_id "172775143962.900184"] [ref "o0,7v292,29t:utf8toUnicode,t:urlDecodeUni,t:htmlEntityDecode,t:jsDecode,t:cssDecode,t:removeNulls"]
ModSecurity: Предупреждение. Совпадение "Оператор `Rx' с параметром `(?i)\b(?:eval|set(?:timeout|interval)|new[\s\x0b]+Function|a(?:lert|tob)|btoa|prompt|confirm)[\s\x0b]*\(' против переменной `ARGS:username' (Значение: `<script>alert('XSS')</script>' ) [файл "/usr/local/coreruleset-4.4.0/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [строка "713"] [id "941390"] [rev ""] [msg "Обнаружен метод Javascript"] [data "Совпадающие данные: alert( найден в ARGS:username: <script>alert('XSS')</script>"] [severity "2"] [ver "OWASP_CRS/4.4.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "attack-xss"] [tag "xss-perf-disable"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"] [hostname "10.38.135.193"] [uri "/"] [unique_id "172775143962.900184"] [ref "o8,6v292,29t:htmlEntityDecode,t:jsDecode"]
ModSecurity: Доступ запрещен с кодом 403 (фаза 2). Совпадение "Оператор `Ge' с параметром `5' против переменной `TX:BLOCKING_INBOUND_ANOMALY_SCORE' (Значение: `20' ) [файл "/usr/local/coreruleset-4.4.0/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [строка "222"] [id "949110"] [rev ""] [msg "Превышен балл аномалии входящего трафика (Общий балл: 20)"] [data ""] [severity "0"] [ver "OWASP_CRS/4.4.0"] [maturity "0"] [accuracy "0"] [tag "anomaly-evaluation"] [tag "OWASP_CRS"] [hostname "10.38.135.193"] [uri "/"] [unique_id "172775143962.900184"] [ref ""]
Это путь к моей папке с правилами
/usr/local/coreruleset-4.4.0/rules
Вот как я загружаю правила в файл main.conf
Include /etc/nginx/modsec/modsecurity.conf
Include /usr/local/coreruleset-4.4.0/crs-setup.conf
Include /usr/local/coreruleset-4.4.0/rules/*.conf
Ответ или решение
Для настройки конкретных правил в режиме обнаружения в наборе правил OWASP Core, необходимо правильно обновить действия соответствующих правил и правильно учитывать общую архитектуру правил. Из представленного вами вопроса видно, что вы правильно используете команду SecRuleUpdateActionById
для установки режимов обнаружения:
SecRuleUpdateActionById 941100 "pass,log"
SecRuleUpdateActionById 941110 "pass,log"
SecRuleUpdateActionById 941160 "pass,log"
SecRuleUpdateActionById 941390 "pass,log"
Однако, как вы отметили, несмотря на это, ваше приложение продолжает возвращать код состояния 403 (доступ запрещен), что указывает на то, что запрос блокируется другими правилами.
Основные шаги по решению проблемы:
-
Проверка правил блокировки:
Обратите внимание на вывод журналов:Matched "Operator `Ge' with parameter `5' against variable `TX:BLOCKING_INBOUND_ANOMALY_SCORE' (Value: `20' ) [file "/usr/local/coreruleset-4.4.0/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "222"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 20"].
Это сообщение указывает, что сумма оценок аномалии превышает пределы, и запрос блокируется. Данный механизм может срабатывать на других активированных правилах, которые не прописаны в вашем конфигурационном файле исключений.
-
Настройка порогового значения:
Если вы хотите тестировать правила в режиме обнаружения и избежать блокировок от точной оценки аномалии, вы можете снизить значение порога, при котором запрос блокируется. Например, в файлеmodsecurity.conf
или вcrs-setup.conf
, обновите значениеSecPcreMatchLimit
илиSecPcreMatchLimitRecursion
, чтобы избежать оценок аномалии, превышающих 5. Это можно сделать следующим образом:SecAction "id:90000,phase:1,t:none,pass,nolog,setvar:tx.anomaly_score_threshold=10"
-
Тестирование на низком уровне:
Убедитесь, что у вас загружены все необходимые файлы и зависимости для правильной работы правил OWASP CRS. Если вы изменяете правила, убедитесь, что на сервере отсутствуют кэшированные версии правил ModSecurity. Перезапустите ваш веб-сервер для применения изменений. -
Проверка совместимости:
Убедитесь, что ваша версия ModSecurity совместима с используемой вами версией OWASP CRS. Иногда обновления в одной из этих систем могут привести к изменениям в поведении. -
Логирование:
Включите режим отладки для более детальной информации о том, какие правила запускаются и почему запросы блокируются.
Пример конфигурации:
Ваш основной файл конфигурации (modsecurity.conf
) может выглядеть примерно так:
Include /etc/nginx/modsec/modsecurity.conf
Include /usr/local/coreruleset-4.4.0/crs-setup.conf
Include /usr/local/coreruleset-4.4.0/rules/*.conf
SecAction "id:90000,phase:1,t:none,pass,nolog,setvar:tx.anomaly_score_threshold=10"
Заключение
Эти шаги должны помочь вам настроить конкретные правила OWASP CRS в режиме обнаружения, избегая блокировок со стороны других правил. Если проблема сохраняется, внимательно изучите журналы и рассмотрите возможность поэтапного включения правил, чтобы определить, какое именно правило вызывает блокировку.