文件包含漏洞审计核心是识别include/require及其变体的用户输入参数。需搜索可控参数的包含语句,验证LFI用/etc/passwd等系统文件及php://filter,绕过防御常用大小写、双写、URL编码、空字节截断等手法。

文件包含漏洞在PHP代码审计中属于高频且高危类型,新手上手快、利用路径清晰,但容易因忽略细节而漏掉关键点。核心就一条:只要看到 include、require 及其带 _once 的变体,且参数来自用户输入($_GET、$_POST、$_REQUEST 等),就必须重点盯住。
一眼识别可疑包含点
审计时优先搜索以下模式的代码片段:
-
include($_GET['xxx']);或require($_POST['file']);—— 参数完全可控,无任何过滤,最危险 -
include($dir . $_GET['page'] . '.php');—— 拼接后缀看似安全,但可通过page=../../config&nbs;绕过,注意后缀是否可被截断(如加%00或/.php) -
include('templates/' . $tpl . '.inc');—— 路径固定但变量可控,仍可能触发目录穿越或伪协议利用 - 函数调用中含
fopen、readfile、file_get_contents且参数同样来自用户输入,也属于广义文件包含风险点
快速验证是否存在LFI
发现疑似点后,不急着写复杂payload,先做三步轻量探测:
- 把参数值换成已知存在的PHP文件,比如
?file=index.php,观察页面是否空白(说明执行了但没输出)或报错(如Failed opening,可能泄露路径) - 尝试读取系统文件:
?file=/etc/passwd(Linux)或?file=C:/Windows/win.ini(Windows),看是否返回内容 - 试一下基础伪协议:
?file=php://filter/resource=index.php,若返回空或报错,再补上convert.base64-encode看是否出base64编码结果
绕过常见防御手法的思路
很多代码会加简单过滤,但往往不彻底。遇到时按顺序排查:
-
关键词黑名单:如过滤
php://、etc、flag—— 尝试大小写混合(PhP://)、双写(pphphp://)、URL编码(php%3A%2F%2F)、短路径(/etc/./passwd) -
后缀强制拼接:如
include($_GET['f'].'.php')—— 利用空字节截断(?f=../../config%00),或用/.php终止解析(?f=../../config/.php) -
白名单校验不严:如只检查开头是否为
home、about—— 传入home.php?xx=php://filter,部分环境会忽略问号后内容
源码读取是审计突破口
CTF或真实环境中,flag常藏在源码里。确认LFI存在后,直接用 php://filter 读取当前脚本:
- 标准payload:
?file=php://filter/convert.base64-encode/resource=index.php - 解码后即可看到完整PHP代码,从中定位数据库配置、密钥、flag变量或二次包含逻辑
- 若目标文件名未知,可结合目录猜测(
config.php、db.php、init.php)或用../往上探路径
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











