RFI 与 LFI 的区别
文件包含类问题分两种:LFI 只能包含服务器本地文件,RFI 则能包含远程地址、把外部内容当代码执行。RFI 的成立条件是运行环境允许远程包含——PHP 侧对应 allow_url_include 这类开关,该配置项在较新的 PHP 版本中已弃用或移除,因此现代 PHP 环境上 RFI 少见,包含类问题更多以 LFI 及其日志投毒等方式出现。旧版环境与部分其他语言实现仍需核查。
基本信息
| 成立条件 | 包含函数接受远程地址且运行环境允许远程包含 |
|---|---|
| 核查优先 | 先做配置核查,再考虑动态验证 |
| 常见平台 | 旧版 PHP 应用、部分 Java/JSP 与传统 CMS |
| 参考标准 | PHP 手册配置说明、CWE-98 |
典型使用场景
- 遗留系统评估中确认是否存在可被利用的包含点
- 代码审计时定位用户输入直接进入包含语句的写法
- 配置核查中确认远程包含开关的实际状态
- 与 LFI 一起评估:包含点通常同时存在两类风险
- 为客户提供包含类问题的统一整改建议
核查要点
核查要点
1. 核查运行环境的远程包含相关配置与包装协议启用情况(以官方手册为准)
2. 如确需动态验证:在自建 HTTP 服务上放置无害文本文件,观察是否被应用拉取
3. 通过访问日志确认拉取行为与来源地址,作为证据留存
4. 不放置任何可执行内容,不指向任何外部资源,验证后立即撤下自建服务
5. 结论同时说明包含点的输入来源与修复建议(白名单、禁用动态包含)检查项与判据
| 检查项 | 正常状态 | 异常信号 |
|---|---|---|
| 远程包含配置 | 关闭或该配置项在当前版本不存在 | 处于开启状态 |
| 包含参数来源 | 白名单映射,不接受任意路径 | 直接使用请求参数 |
| 应用访问日志 | 无出站拉取记录 | 出现指向测试地址的请求 |
| 错误信息 | 不暴露路径细节 | 包含失败时回显完整路径 |
严禁在验证时指向真实外部资源,也不要在自建服务上放置可执行内容:验证目标只是确认“应用是否会按输入去拉取远程内容”。
考虑到旧结论容易过期,修复方向建议写成通用原则:包含目标使用白名单映射、禁止动态包含、关闭不必要的包装协议与远程包含能力。