为什么 Modsecurity 不拒绝 SQL 对 JSON 有效负载的注入
Why Modsecurity does not deny SQL injection on JSON payload
我有一个 Web 应用程序 运行 在配置了 OWASP CRS 的 apache/modsecurity 防火墙后面。
以下 URL 被 Modsecurity 拒绝:
GET /login?username=' /*!or*/1=1#
但是这个通过了防火墙:
POST /login
Body: {"password":"' /*!or*/1=1#"}
Modsecurity 对 JSON Body 有限制吗?
发送
更新 1:
我部署了最新的 OWASP CSR:
Producer: ModSecurity for Apache/2.9.2 (http://www.modsecurity.org/); OWASP_CRS/3.1.1.
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
通过 GET 触发的规则是 942100("msg": "SQL Injection Attack Detected via libinjection")。此规则如下:
SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|REQUEST_COOKIES_NAMES|REQUEST_HEADERS:User-Agent|REQUEST_HEADERS:Referer|ARGS_NAMES|ARGS|XML:/* "@detectSQLi" \
"id:942100,\
phase:2,\
block,\
capture,\
t:none,t:utf8toUnicode,t:urlDecodeUni,t:removeNulls,\
msg:'SQL Injection Attack Detected via libinjection',\
logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',\
tag:'application-multi',\
tag:'language-multi',\
tag:'platform-multi',\
tag:'attack-sqli',\
tag:'OWASP_CRS/WEB_ATTACK/SQL_INJECTION',\
tag:'WASCTC/WASC-19',\
tag:'OWASP_TOP_10/A1',\
tag:'OWASP_AppSensor/CIE1',\
tag:'PCI/6.5.2',\
ver:'OWASP_CRS/3.1.1',\
severity:'CRITICAL',\
multiMatch,\
setvar:'tx.anomaly_score_pl1=+%{tx.critical_anomaly_score}',\
setvar:'tx.sql_injection_score=+%{tx.critical_anomaly_score}',\
setvar:'tx.msg=%{rule.msg}',\
setvar:'tx.%{rule.id}-OWASP_CRS/WEB_ATTACK/SQL_INJECTION-%{MATCHED_VAR_NAME}=%{MATCHED_VAR}'"
更新 2:
解决方案:
在 conf:
中添加 JSON body 解析
SecRule REQUEST_HEADERS:Content-Type "application/json" "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"
请注意,在 Centos 中,YAJL 在打包的 modsecurity 模块中不可用,您必须从源代码编译它才能启用 JSON 支持。
ModSecurity 从 2.8 版本开始支持 JSON 解析请求体,但您需要对其进行配置。在此处查看更多详细信息:https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/modsecurity-advanced-topic-of-the-week-json-support/
然而ModSecurity只是一个可以处理规则的框架。您没有说明您正在使用哪个规则集(OWASP CRS,您自己的规则?其他?),也没有说明为 GET 请求触发了哪个规则。可能是它仅为 GET 请求配置。
我有一个 Web 应用程序 运行 在配置了 OWASP CRS 的 apache/modsecurity 防火墙后面。
以下 URL 被 Modsecurity 拒绝:
GET /login?username=' /*!or*/1=1#
但是这个通过了防火墙:
POST /login
Body: {"password":"' /*!or*/1=1#"}
Modsecurity 对 JSON Body 有限制吗?
发送
更新 1: 我部署了最新的 OWASP CSR:
Producer: ModSecurity for Apache/2.9.2 (http://www.modsecurity.org/); OWASP_CRS/3.1.1.
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
通过 GET 触发的规则是 942100("msg": "SQL Injection Attack Detected via libinjection")。此规则如下:
SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|REQUEST_COOKIES_NAMES|REQUEST_HEADERS:User-Agent|REQUEST_HEADERS:Referer|ARGS_NAMES|ARGS|XML:/* "@detectSQLi" \
"id:942100,\
phase:2,\
block,\
capture,\
t:none,t:utf8toUnicode,t:urlDecodeUni,t:removeNulls,\
msg:'SQL Injection Attack Detected via libinjection',\
logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',\
tag:'application-multi',\
tag:'language-multi',\
tag:'platform-multi',\
tag:'attack-sqli',\
tag:'OWASP_CRS/WEB_ATTACK/SQL_INJECTION',\
tag:'WASCTC/WASC-19',\
tag:'OWASP_TOP_10/A1',\
tag:'OWASP_AppSensor/CIE1',\
tag:'PCI/6.5.2',\
ver:'OWASP_CRS/3.1.1',\
severity:'CRITICAL',\
multiMatch,\
setvar:'tx.anomaly_score_pl1=+%{tx.critical_anomaly_score}',\
setvar:'tx.sql_injection_score=+%{tx.critical_anomaly_score}',\
setvar:'tx.msg=%{rule.msg}',\
setvar:'tx.%{rule.id}-OWASP_CRS/WEB_ATTACK/SQL_INJECTION-%{MATCHED_VAR_NAME}=%{MATCHED_VAR}'"
更新 2: 解决方案: 在 conf:
中添加 JSON body 解析SecRule REQUEST_HEADERS:Content-Type "application/json" "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"
请注意,在 Centos 中,YAJL 在打包的 modsecurity 模块中不可用,您必须从源代码编译它才能启用 JSON 支持。
ModSecurity 从 2.8 版本开始支持 JSON 解析请求体,但您需要对其进行配置。在此处查看更多详细信息:https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/modsecurity-advanced-topic-of-the-week-json-support/
然而ModSecurity只是一个可以处理规则的框架。您没有说明您正在使用哪个规则集(OWASP CRS,您自己的规则?其他?),也没有说明为 GET 请求触发了哪个规则。可能是它仅为 GET 请求配置。