虚拟主机中ModSecurity对POST表单的RFI误报及解决咨询
解决ModSecurity RFI规则误拦截含末尾问号的POST内容问题
从日志能看出,OWASP CRS 3.3.2的RFI规则把输入的https://wa.me/111111111?text=Olá Katarina, tudo bem?末尾的问号误判成远程文件包含攻击模式,导致异常得分超标被拦截。以下是除双重URL编码外的可行解决方案:
1. 前端单次编码特殊字符
在表单提交前,对输入内容中的?做URL编码(转成%3F),后端接收后解码即可还原内容,同时绕过规则检测。示例代码:
document.querySelector('form').addEventListener('submit', e => { const input = document.querySelector('input[name="my_text"]'); input.value = encodeURIComponent(input.value); });
后端用对应语言的URL解码函数(比如PHP的urldecode())就能拿到原始内容,不影响正常使用。
2. 自定义请求头+主机规则例外(需主机商配合)
如果虚拟主机允许,可在表单提交时添加自定义请求头,比如X-Legitimate-Request: true,然后联系主机管理员在ModSecurity中添加规则例外:
SecRule REQUEST_HEADERS:X-Legitimate-Request "@streq true" "id:1000,phase:1,nolog,allow,ctl:ruleRemoveById=949110"
注:该方法依赖主机商配合,虚拟主机用户通常无法自行修改ModSecurity规则。
3. 调整输入格式(无编码方案)
利用「加空格可通过」的特性,前端自动给末尾带问号的内容追加空格,后端处理时再移除多余空格:
document.querySelector('form').addEventListener('submit', e => { const input = document.querySelector('input[name="my_text"]'); if (input.value.trim().endsWith('?')) { input.value += ' '; } });
后端接收后用trim()(PHP)或strip()(Python)等方法去掉末尾空格即可,完全不影响内容的实际使用。
4. 联系主机管理员调整规则
由于使用虚拟主机无法自行修改ModSecurity配置,建议将以下信息发给主机商请求处理:
- 误拦截的输入内容示例
- 完整的ModSecurity错误日志
- 你的表单代码
请求主机商做以下操作之一:
- 针对你的域名禁用触发误判的RFI具体规则(需排查日志找到对应规则ID)
- 降低OWASP CRS的偏执级别(当前PL1已触发拦截,调至PL0可能减少误判,但安全性略有降低)
- 为表单字段
my_text添加规则例外,允许其包含末尾带问号的URL
附:ModSecurity错误日志
ModSecurity: Access denied with code 429 (phase 2). Operator GE matched 5 at TX:anomaly_score. [file "/usr/share/modsecurity-crs-new/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "93"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] ModSecurity: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/usr/share/modsecurity-crs-new/rules/RESPONSE-980-CORRELATION.conf"] [line "91"] [id "980130"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 5 - SQLI=0,XSS=0,RFI=5,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 5, 0, 0, 0"] [ver "OWASP_CRS/3.3.2"] [tag "event-correlation"]
表单代码
<!DOCTYPE html> <html> <head> <title>My Form</title> </head> <body> <form action="test2.php" method="post"> <input type="text" name="my_text"> <input type="submit" value="Submit"> </form> </body> </html>
内容的提问来源于stack exchange,提问作者Marek H
相关产品推荐
相关产品推荐

