PHP本地文件包含(LFI)漏洞核心在于用户输入直接拼接进include等函数,导致任意本地文件被加载解析;需路径可控与内容可控同时满足,常见利用包括读取敏感文件、php://filter解码、日志/会话/图片马Getshell;黑名单过滤易被双写、编码、空字节等绕过;唯一可靠修复是取消拼接、改用白名单映射,并辅以权限控制、WAF、PHP升级等纵深防御。

PHP本地文件包含(LFI)漏洞的核心问题,是用户输入直接拼接进include、require等函数,导致服务器加载并解析任意本地文件。它本身不直接执行命令,但能读取敏感文件、配合日志/会话/图片马实现Getshell,危害极大。
常见利用方式与触发条件
LFI成立需同时满足两个条件:路径可控 + 内容可控。典型场景包括:
-
任意文件读取:传入
?page=../../../../etc/passwd或?file=/var/www/config.php,直接输出文件内容; -
php://filter协议解码:用
php://filter/read=convert.base64-encode/resource=config.php绕过纯文本输出限制,Base64解码后获取源码; -
日志文件包含:向Apache/Nginx访问日志写入PHP代码(如User-Agent中注入
),再通过LFI包含/var/log/apache2/access.log触发执行; -
Session文件包含:若session存储在文件系统(
session.save_path默认为/tmp),攻击者控制PHPSESSID并注入恶意内容,再包含对应session文件; -
图片马+包含:上传带PHP代码的图片(如JPG末尾追加
),再用LFI加载该图片路径,PHP会按脚本解析。
为什么过滤“../”或关键词无效
黑名单式防护极易被绕过,例如:
- 双写绕过:
....//....//etc/passwd→ 中间过滤后剩../etc/passwd; - URL编码绕过:
%2e%2e%2fetc%2fpasswd或大小写混合..%c0%af..%c0%afetc%2fpasswd; - 空字节截断(旧版本PHP):
../../../etc/passwd%00.jpg,%00后缀被截断,实际加载/etc/passwd; - 伪协议组合:
zip://payload.zip%23shell.php,绕过路径检查逻辑。
这些手法说明:只要路径拼接逻辑存在,过滤永远滞后于绕过。
真正有效的修复方式
唯一可靠方案是**彻底取消用户输入与文件路径的拼接关系**,改用白名单映射:
-
静态映射表:定义允许的页面列表,如
$pages = ['home' => 'home.php', 'about' => 'about.php'];,再用$_GET['page']查表,不在白名单中则拒绝; -
固定后缀+目录限定:只允许字母数字,强制添加
.php后缀,并限定根目录,如realpath($base_dir . '/' . $safe_page) === $base_dir . '/' . $safe_page; -
禁用危险配置:在
php.ini中设allow_url_include = Off(防RFI)、open_basedir限制可访问路径、disable_functions = include, require, include_once, require_once(慎用,影响正常逻辑); -
权限最小化:Web进程以低权限运行,确保无法读取
/etc/shadow等高敏文件;日志和session目录禁止Web可写。
纵深防御补充建议
代码层修复是基础,还需叠加环境与架构防护:
- 启用WAF规则识别
php://、../../、etc/passwd等特征,虽不能替代白名单,但可辅助告警; - 定期审计代码,重点搜索
$_GET、$_POST、$_REQUEST直接传入include类函数的语句; - 关注PHP官方安全公告——如近期CVE-2026-109618/109619(PHP2Shell)属内核级漏洞,必须升级PHP至8.5.12/8.4.27等修复版本,仅修业务代码无用;
- 开发阶段禁用
display_errors,避免错误信息泄露真实路径,降低LFI探测效率。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











