PHP 7.2中排查GET引发的文件包含漏洞,核心是定位“$_GET直接参与include/require路径拼接”:先搜include、require、include_once、require_once,检查参数是否源自$_GET;典型如$page=$_GET['page']; include($page.'.php');需重点验证路径穿越(如../../../../etc/passwd)和php://filter读源码,注意PHP 7.2仍支持%00截断且allow_url_include默认关闭。

PHP 7.2 中排查 GET 参数引发的文件包含漏洞,核心是快速定位“用户输入直接参与 include/require 路径拼接”这一危险模式。它不依赖复杂工具,关键在代码逻辑和参数流向的精准判断。
盯紧四个函数 + GET 变量来源
先全局搜索以下函数调用:include、require、include_once、require_once。找到后,逐行检查其参数是否直接或间接来自 $_GET:
- 最典型:
$page = $_GET['page']; include($page . '.php');—— 参数未过滤、带拼接后缀,高危 - 较隐蔽:
include('templates/' . $_GET['theme'] . '/header.php');—— 前缀固定但变量在中间,仍可路径穿越 - 易忽略:
require($_SERVER['DOCUMENT_ROOT'] . '/lang/' . $_GET['lang'] . '.ini');—— 利用服务器变量拼接,同样可控
重点看“拼接动作”是否可绕过
开发者常加后缀(如 .php)或删 ../,但这在 PHP 7.2 下极易被绕过:
- 后缀无效:传
page=../../etc/passwd%00(空字节截断,PHP 7.2 默认仍支持) - 过滤不全:只替换一次
../?传....//或 URL 编码%2e%2e%2f可绕过 - 伪协议可用:即使有后缀,
page=php://filter/read=convert.base64-encode/resource=config仍能读源码
验证时优先测路径穿越和基础读取
别一上来就试 php://input,先确认是否真能控制路径:
- 访问
?page=../../../../etc/passwd,看页面是否输出系统用户列表 - 尝试
?page=../../../../var/log/apache2/access.log,判断日志是否可读(为后续日志包含打基础) - 若返回 404 或空白,再测
?page=php://filter/convert.base64-encode/resource=index,看是否返回 base64 编码的源码
注意 PHP 7.2 特有细节
这个版本对某些利用方式更敏感或更宽松,需留意:
-
allow_url_include默认为Off,所以http://远程包含基本不可用,专注本地利用 -
open_basedir若开启,会限制可读路径,但错误信息常泄露真实路径(如 Warning 中的绝对路径) - 空字节截断(
%00)在 PHP 7.2 中仍有效,尤其在 CGI 模式或旧版 SAPI 下 -
realpath()若用于校验,需确认是否在拼接前调用——否则攻击者可在realpath之前就注入恶意路径
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











