ModSecurity:访问被拒绝,代码403


ModSecurity: Access denied with code 403

我已经为我的一个服务器启用了mod安全,如果我提交一个带有unicode字符的表单,它会在日志中显示以下错误,并且不允许访问网页。

[Wed May 192.168.0.1 2013] [error] [client 192.168.0.1] ModSecurity: Access denied with code 403 (phase 2). 
Pattern match "(?i:(?:,.*?[)''''da-f''"'`''xc2''xb4''xe2''x80''x99''xe2''x80''x98][''"'`''xc2''xb4''xe2''x80''x99''xe2''x80''x98](?:[''"'`''xc2''xb4''xe2''x80''x99''xe2''x80''x98].*?[''"'`''xc2''xb4''xe2''x80''x99''xe2''x80''x98]|''''Z|[^''"'`''xc2''xb4''xe2''x80''x99''xe2''x80''x98]+))|(?:''''Wselect.+''''W*?from)|((? ..." at ARGS:shortDescription. [file "/etc/httpd/modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "209"] [id "981257"] [msg "Detects MySQL comment-/space-obfuscated injections and backtick termination"] [data "Matched Data: , ''xe0''xb6''xa1''xe0''xb6''xb1''xe0''xb7''x8a''xe0''xb6''xaf ''xe0''xb6''xb6''xe0''xb6''xbd''xe0''xb6''xba''xe0''xb7''x99''xe0''xb6''xb1''xe0''xb7''x8a ''xe0''xb6''x91''xe0''xb6''xba ''xe0''xb6''xb4''xe0''xb7''x99''xe0''xb6''xbb''xe0''xb7''x85''xe0''xb7''x93''xe0''xb6''xb8''xe0''xb6''xa7 ''xe0''xb6''x9a''xe0''xb6''xa7''xe0''xb6''xba''xe0''xb7''x94''xe0''xb6''xad''xe0''xb7''x94 ''xe0''xb6''x9a''xe0''xb6''xbb''xe0''xb6''xb1 ''xe0''xb6''xb6''xe0''xb7''x80''xe0''xb6''xad''xe0''xb7''x8a ''xe0''xb7''x80''xe0''xb7''x92''xe0''xb6''xb4''xe0''xb6''x9a''xe0''xb7''x8a''xe0''xb [hostname "doomain.test.invalid"] [uri "/admin/add_news_article.php"] [unique_id "UZycDtHvchoAAENNXfYAAABR"] 

如果此站点是生产服务器:首先在detection_only模式下运行Mod_Security,检查日志是否有误报。

在CRS中查找ID:

localhost:/etc/modsecurity>grep 981257 *.conf
modsecurity_crs_41_sql_injection_attacks.conf:SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|REQUEST_COOKIES_NAMES|ARGS_NAMES|ARGS|XML:/* "(?i:(?:,.*?[)'da-f'"'`´’‘]['"'`´’‘](?:['"'`´’‘].*?['"'`´’‘]|'Z|[^'"'`´’‘]+))|(?:'Wselect.+'W*?from)|((?:select|create|rename|truncate|load|alter|delete|update|insert|desc)'s*?'('s*?space's*?'())" "phase:2,capture,t:none,t:urlDecodeUni,block,msg:'Detects MySQL comment-/space-obfuscated injections and backtick termination',id:'981257',tag:'OWASP_CRS/WEB_ATTACK/SQL_INJECTION',logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',severity:'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}'"

看起来你的参数shortDescription中有特殊字符

另一个提示:如果您有一个规则引发了很多"误报",您可以使用SecRuleRemoveById关键字轻松禁用它(甚至专门针对给定的路径)。问题中的错误示例:

<Directory /var/www/admin>
  SecRuleRemoveById 981257
</Directory>

假设/var/www为所用的DOCUMENT_ROOT。这样,您可以使用完整的提供的规则集,但在不应该应用的地方禁用单个规则。

我在Apache 2.4.6 (CentOS)上也遇到了Mod Security错误。我不得不关闭Mod Security功能,因为它会阻止WordPress身份验证并显示403页。

免责声明:这只是一个快速修复。但是不建议在生产环境中关闭此功能,因为它基本上会危及安全性。

也就是说,寻找mod_security.conf文件,在大多数Linux环境中/etc/httpd/conf.d目录中可以找到。

查找包含SecRuleEngineSecRequestBodyAccess的行,当此功能生效时,它们通常被设置为On。所以将它们设置为关闭以禁用Mod安全。保存文件并重新启动服务器。

应该是这样的

SecRuleEngine Off
SecRequestBodyAccess Off