请求协助配置ModSecurity CRS 3.3拦截含HTML标签的所有输入
解决ModSecurity CRS 3.3拦截所有HTML标签输入的问题
问题说明
我们在Nginx服务器上部署了ModSecurity及OWASP Core Rule Set (CRS) 3.3版本,Web UI提交的三类JSON输入中:
- 输入1、2(含带事件属性的HTML标签)触发了941系列HTML注入规则
- 输入3(含纯
<h1>标签)未触发941320规则,需实现三类输入全拦截
提交的输入示例
// 输入1 { "data": { "id": 1002, "email": "testmodsec@gmail.com", "name": "ske<h1 onmouseover='console.log(\"js\")'>test</h1>", "locale": "en", "category": 1, "status": 0 } } // 输入2 { "data": { "id": 1002, "email": "testmodsec@gmail.com", "name": "ske<img src=''onerror='alert(1)'>", "locale": "en", "category": 1, "status": 0 } } // 输入3 { "data": { "id": 1002, "email": "testmodsec@gmail.com", "name": "ske<h1>test</h1>", "locale": "en", "category": 1, "status": 0 } }
解决方案
1. 调整941320规则的检测范围
CRS 3.3中941320规则默认仅拦截带风险属性的HTML标签,需修改其正则表达式以覆盖纯标签场景:
- 打开CRS规则文件
REQUEST-941-APPLICATION-ATTACK-XSS.conf - 找到
941320规则,将原正则表达式部分
修改为:@rx <[a-z][a-z0-9]*[^>]*>
该正则会匹配所有HTML起始标签,包括纯标签(如@rx <[a-z][a-z0-9]*(\s[^>]*|)><h1>)和带属性的标签
2. 新增自定义规则(可选,不修改默认CRS规则时用)
在自定义规则文件中添加以下规则,专门拦截纯HTML标签:
SecRule REQUEST_BODY "@rx <[a-z][a-z0-9]*>(.*?)</[a-z][a-z0-9]*>" \ "phase:2,block,msg:'Block pure HTML tags in input',id:'1000001',\ severity:'CRITICAL',tag:'CUSTOM/RULE/HTML_TAG_BLOCK',\ setvar:'tx.anomaly_score=+%{tx.critical_anomaly_score}'"
3. 确保JSON请求体被正确解析
若请求为JSON格式,需在modsecurity.conf中配置JSON解析:
SecRule REQUEST_HEADERS:Content-Type "application/json" \ "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,\ setvar:'tx.parsers=application/json'"
同时确保SecRequestBodyAccess On和SecRuleEngine On已开启
4. 验证规则
修改完成后重启Nginx:
sudo systemctl restart nginx
提交三类输入测试,查看ModSecurity日志(默认路径/var/log/modsec_audit.log)确认所有请求均被拦截
内容的提问来源于stack exchange,提问作者sk2
相关产品推荐
相关产品推荐

