PHP 7.0 文件包含漏洞渗透核心是利用include/require拼接用户可控参数且无路径限制或后缀校验,重点为LFI及php://filter等伪协议读源码,空字节截断仍有效但7.1+已移除。

PHP 7.0 环境下做文件包含漏洞渗透测试,核心是围绕 include、require 等函数是否直接拼接了用户可控参数,且未做路径限制、后缀校验或白名单过滤。PHP 7.0 默认已禁用 allow_url_include(远程包含默认不可用),所以重点落在本地文件包含(LFI)及其延伸利用链上,而非 RFI。
确认漏洞存在性与基础读取能力
先验证是否能触发 LFI,常见手法包括:
- 尝试路径穿越:如
?file=../../../../etc/passwd,观察是否返回系统用户列表; - 补全后缀干扰:若代码类似
include($_GET['file'] . '.php'),可尝试?file=../../../etc/passwd%00(PHP 7.0 仍支持空字节截断,但需magic_quotes_gpc=off且 PHP 版本 ≤ 7.0.x,注意 7.1+ 已移除); - 绕过固定后缀:用伪协议替代,例如
?file=php://filter/read=convert.base64-encode/resource=index.php,成功则说明未禁用php://filter,且能读源码。
利用 PHP 封装协议读敏感文件或源码
PHP 7.0 完全支持以下协议,无需开启 allow_url_include:
-
php://filter:最常用,用于读取并编码任意可访问文件(如配置、源码),再 base64 解码即可还原; -
file://:直接读取绝对路径文件,如?file=file:///var/www/html/config.php; -
php://input:若目标允许 POST 请求且未禁用该流,可发带 PHP 代码的原始 POST 数据,实现无文件 RCE(需allow_url_include=On,但 PHP 7.0 默认关,故通常不适用); -
data://和phar://:前者需allow_url_include=On(默认关),后者可用于反序列化链或绕过上传检测,但在纯 LFI 场景中需配合其他漏洞。
尝试执行类利用(GetShell 前置条件)
纯 LFI 本身不执行代码,需结合服务器上已有可执行内容的文件:
-
日志文件包含:向访问日志(如
/var/log/apache2/access.log)注入 PHP 代码(通过 User-Agent 或 URL 参数),再包含该日志路径; -
Session 文件包含:若 session 存储在文件(
session.save_handler = files),且能控制 session 内容(如通过 cookie 注入),可包含/var/lib/php/sessions/sess_*; -
图片马/上传文件包含:若站点有上传功能,上传含 PHP 代码的图片(如 GIF89a 开头 +
<?php @eval($_POST[cmd]);?>),再用 LFI 包含该图片路径——PHP 7.0 会解析其中的 PHP 标签; - /proc/self/environ:在 Apache + mod_cgi 环境下可能读到环境变量,若 User-Agent 可控,可注入代码后包含该路径(但 PHP-FPM 环境下通常不可用)。
绕过常见防护与注意事项
PHP 7.0 下需特别注意的限制和绕过点:
-
open_basedir开启时会限制文件访问路径,报错提示常含open_basedir restriction,此时优先尝试其指定目录内的文件(如/var/www/html/); - 空字节截断(
%00)在 PHP 7.0 中仍有效,但仅适用于部分字符串处理函数(如include的参数未被内部清理),7.1+ 彻底移除; - 过滤关键词(如
etc、log、php://)时,可尝试大小写混淆(Php://Filter)、双写(pphphp://filter)、URL 编码(php%3A%2F%2Ffilter)或使用短路径(/etc/passwd→/etc//passwd); - 务必检查响应状态码、空白回显、HTML 注释或错误信息,它们常暴露真实路径、PHP 配置或过滤逻辑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











