Назад | Перейти на главную страницу

Проверка Modsecurity REQUEST_URI без параметров запроса

В настоящее время я использую предотвращение Modsecurity XSS, но мне трудно понять, как именно я могу ограничить то, что проверяю в REQUEST_URI переменная.

Мой пример:

#
# -=[ XSS Filters - Category 3 ]=-
# XSS vectors making use of Javascripts URIs, e.g., <p style="background:url(javascript:alert(1))">
#
SecRule REQUEST_URI|ARGS "(?i)((?:=|U\s*R\s*L\s*\()\s*[^>]*\s*S\s*C\s*R\s*I\s*P\s*T\s*:|&colon;|[\s\S]allowscriptaccess[\s\S]|[\s\S]src[\s\S]|[\s\S]data:text\/html[\s\S]|[\s\S]xlink:href[\s\S]|[\s\S]base64[\s\S]|[\s\S]xmlns[\s\S]|[\s\S]xhtml[\s\S]|[\s\S]style[\s\S]|<style[^>]*>[\s\S]*?|[\s\S]@import[\s\S]|<applet[^>]*>[\s\S]*?|<meta[^>]*>[\s\S]*?|<object[^>]*>[\s\S]*?)" "id:'973338',phase:2,t:none,rev:'1',ver:'OWASP_CRS/2.2.9',maturity:'1',accuracy:'8',t:urlDecodeUni,t:htmlEntityDecode,t:jsDecode,t:cssDecode,log,capture,tag:'OWASP_CRS/WEB_ATTACK/XSS',tag:'WASCTC/WASC-8',tag:'WASCTC/WASC-22',tag:'OWASP_TOP_10/A2',tag:'OWASP_AppSensor/IE1',tag:'PCI/6.5.1',msg:'XSS Filter - Category 3: Javascript URI Vector',logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',severity:'2',setvar:'tx.msg=%{rule.msg}',setvar:tx.xss_score=+%{tx.critical_anomaly_score},setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},setvar:tx.%{rule.id}-OWASP_CRS/WEB_ATTACK/XSS-%{matched_var_name}=%{tx.0}"

В приведенном выше примере регулярное выражение проверяет наличие определенных тегов и, если они обнаружены, останавливает запросы, регистрирует попытку и затем выдает 403 запрещено.

Все в порядке, но у меня есть конкретный URL-адрес, который выглядит примерно так:

/chart.php?this=haha&style=testStyle

куда &style= заставляет ModSecurity выдать ошибку и остановить запрос.

Точно так же у них есть правило, которое проверяет только style=,

Итак, мой вопрос, как я могу изменить REQUEST_URI в некотором роде (внутри правил ModSecurity), чтобы правило проверяло только все, что до ? (Строка запроса).

Вы можете использовать REQUEST_FILENAME переменная вместо REQUEST_URI.

Рекомендуется не редактировать сами правила OWASP CRS напрямую, а вместо этого добавлять дополнительные правила для их корректировки. Это позволяет обновить CRS и при этом сохранить свои правила. Здесь вы можете сделать это, добавив следующую конфигурацию после загрузки всех файлов правил OWASP CRS, чтобы настроить это правило:

SecRuleUpdateTargetById 973338 REQUEST_FILENAME REQUEST_URI

Однако это уменьшит это правило для всех запросов, когда вы можете захотеть сделать это только для этого одного URL, и в этом случае лучшим методом может быть отключение этого правила только для этого URL, добавив следующее правило перед загрузкой правил OWASP CRS файлы (обратите внимание, что идентификатор должен быть уникальным, поэтому, если у вас уже есть правило 1, выберите уникальный, если здесь):

SecRule REQUEST_FILENAME chart.php "phase:2,nolog,id:1,ctl:ruleRemoveById=973338,pass"

И да, прежде чем вы спросите, раздражает то, что указаны некоторые переопределения после правила и другие, которые используют ctl, должны быть указаны перед.

Если вам нужно отключить несколько правил, вы можете использовать следующий синтаксис:

SecRule REQUEST_FILENAME chart.php "phase:2,nolog,id:1,ctl:ruleRemoveById=973338,ctl:ruleRemoveById=973306,pass"