PHP7.2下LFI漏洞核心是用户可控参数直拼入include/require且无白名单校验;需探测/etc/passwd、日志文件及php://filter读源码,注意open_basedir限制和空字节截断已失效。

检测 PHP7.2 环境下的本地文件包含(LFI)漏洞,核心是验证用户可控参数是否能被直接拼入 include、require 等函数,且未做路径白名单或规范化校验。PHP7.2 本身不改变 LFI 的触发逻辑,但需注意其默认配置(如 allow_url_include=Off)会限制 RFI,而 LFI 依然畅通。
确认参数是否参与文件包含逻辑
先定位疑似入口点,常见位置包括:
– URL 中的 page、file、view、lang、template 等参数
– POST 或 Cookie 中的同名字段(如 Cookie: lang=en.php)
– 静态后缀拼接场景(如 include($_GET['page'] . '.php'))
测试时不要只看响应内容,重点观察错误信息是否暴露路径或函数调用痕迹,例如:
-
?page=nonexistent返回Warning: include(nonexistent.php): failed to open stream→ 表明参数确实进了include -
?page=../返回failed to open stream: Permission denied或类似路径解析失败提示 → 强烈暗示存在路径穿越能力
用典型路径探测敏感文件读取
PHP7.2 环境下,Linux 服务器常见敏感路径仍有效。建议按顺序尝试(注意 URL 编码处理):
立即学习“PHP免费学习笔记(深入)”;
-
?file=/etc/passwd—— 验证基础读取能力,成功返回用户列表即确认 LFI 存在 -
?file=../../../../../etc/passwd—— 测试路径穿越深度,绕过前端目录限制 -
?file=/proc/self/environ—— 若返回环境变量(含 User-Agent、Referer),说明可读内存映射文件,为日志投毒铺路 -
?file=/var/log/apache2/access.log(或/var/log/nginx/access.log)—— 检查日志文件是否可读,这是后续 GetShell 的关键跳板
尝试 php://filter 协议读源码
该方法不依赖文件权限,专用于读取 PHP 源码(尤其当 /etc/passwd 被禁读时):
-
?file=php://filter/read=convert.base64-encode/resource=index.php—— 将目标 PHP 文件 Base64 编码输出,解码后即可审计逻辑 - 若返回空白或报错,检查是否过滤了
php://协议头,或是否启用了open_basedir限制 - 注意:PHP7.2 默认支持该协议,无需额外开启,但某些 WAF 可能拦截含
filter的请求
留意 PHP7.2 特有的干扰点
部分 PHP7.2 部署环境会启用更严格的默认策略,需针对性排除:
-
open_basedir开启时,/etc/passwd类路径会被拒绝,但/tmp/、/var/www/下的文件仍可能可读 - 若页面对
../做了简单字符串替换(如删掉..),尝试双写绕过:?file=....//etc/passwd或 URL 编码:?file=%2e%2e%2f%2e%2e%2fetc%2fpasswd - 某些框架自动添加后缀(如
.php),可用空字节截断(%00)或利用php://filter绕过,但 PHP7.2+ 已移除空字节截断支持,应优先试伪协议



















