为什么 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 请求配置。