前言

在Web安全领域,文件上传漏洞 与文件包含漏洞堪称两大"高危"漏洞,它们往往能直接导致服务器被控制。同时,一份高效的渗透测试离不开前期的信息收集与工具联动。
本文将系统性地整合这三部分知识,从信息收集、子域名挖掘,到文件上传与包含漏洞的深度利用,形成一套完整的攻防实战指南,希望能为你的安全测试工作提供有价值的参考。

第一部分:信息收集与工具联动("粮草先行")
信息收集的质量直接决定了后续渗透测试的深度和广度。在实战中,我们通常会组合使用多种工具,构建高效的工作流。
1.1 核心工具及其角色定位
- OneForAll :子域名收集的"重器"。它是一款功能强大的子域名集成工具,通过调用多源API和爆破字典,能全面收集目标主站的子域名资产。
-
- 基本用法 :
python3 oneforall.py --target example.com run - 结果导出 :支持
csv、json等格式,python3 oneforall.py --target example.com run --fmt csv
- 基本用法 :
- ENScan_GO :企业公开信息的"挖掘机"。不同于主动扫描,它专注于从爱企查、天眼查等公开渠道,自动化收集目标企业的ICP备案、APP、小程序、微信公众号及股权架构等,是前期踩点的重要工具。
- Fscan :内网安全的"侦察兵"。一款内网综合扫描工具,用于在获得授权后,快速探测内网存活主机、开放端口(如22, 445, 3306)、弱口令以及高危漏洞(如"永恒之蓝")。
- Dirsearch :Web目录的"翻找者"。基于字典的Web路径暴力枚举工具,常用于发现网站的后台、备份文件、未授权访问的API接口等隐藏路径。
- Goby 与 Xray :漏洞扫描的"黄金搭档"。Goby擅长资产管理和漏洞验证,Xray则专注于Web漏洞的深度扫描。两者可通过插件实现联动,实现从资产发现到漏洞扫描的无缝衔接。
1.2 构建自动化工作流
典型的渗透测试流程可以这样串联工具:
- 资产收集 :使用
OneForAll收集子域名,用ENScan_GO梳理企业股权结构。 - 存活探测 :利用
httpx等工具,从子域名列表中筛选出存活的Web服务。 - 指纹识别 :通过
EHole等工具识别目标使用的CMS、中间件等信息。 - 漏洞扫描:
-
- 方式一(文件导入) :将OneForAll的结果导出为CSV,然后导入到Goby或Xray中进行扫描。Xray支持
--target-file参数直接加载目标列表。 - 方式二(高效联动):在Goby中安装Xray插件,配置好路径后,可直接在Goby界面对选中的资产一键启动Xray扫描。
- 方式一(文件导入) :将OneForAll的结果导出为CSV,然后导入到Goby或Xray中进行扫描。Xray支持
第二部分:文件上传漏洞全解("突破口")
文件上传漏洞的本质是对用户输入的文件缺乏足够的过滤与限制,导致攻击者能上传并执行恶意脚本。
2.1 核心原理与防御绕过
核心思路:层层突破目标在前端到后端设下的验证关卡。
|-------------|----------------------|-----------------------------------------------------------------------------|
| 验证层面 | 验证方式 | 绕过技巧 |
| 前端JS验证 | 客户端检查后缀或类型 | 禁用浏览器JS、直接使用Burp抓包改包。 |
| MIME验证 | 检查Content-Type头 | 抓包修改Content-Type为image/jpeg等白名单值。 |
| 文件头验证 | 检查文件幻数(Magic Number) | 制作图片马 ,在脚本前添加GIF89a等合法文件头。 |
| 后缀黑名单 | 禁止.php、.asp等后缀 | 利用解析特性(.php5, .phtml)、大小写(.PhP)、双写(.pphphp)绕过;或上传.htaccess重写解析规则。 |
| 后缀白名单 | 仅允许.jpg、.png等 | 寻找文件包含漏洞配合图片马执行;利用中间件解析漏洞(如IIS 6.0的test.asp;.jpg)。 |
| 内容校验 | 二次渲染、严格图像校验 | 对比渲染前后差异,在未改变区域插入代码;或利用条件竞争,在上传和删除间隙访问文件。 |
| WAF/IPS | 基于规则的流量检测 | 使用编码、分块传输、混淆等方式绕过。 |
2.2 服务器解析漏洞("四两拨千斤")
|-------------|---------------------|---------------------------------------------------|
| 中间件 | 解析漏洞/特性 | 利用方式 |
| Apache | 多后缀解析、.htaccess配置 | 上传shell.php.jpg;或上传.htaccess文件,将.png解析为PHP。 |
| Nginx | 路径解析漏洞(配置不当) | 上传图片马,访问/upload/xxx.jpg/任意.php。 |
| IIS 6.0 | 目录解析、文件解析 | 创建test.asp目录,其下所有文件被解析为ASP;上传test.asp;.jpg。 |
| Tomcat | 某些版本JSP解析特性 | 上传JSP马到/upload/test.jsp/目录下。 |
2.3 高级利用场景
- JS接口隐藏上传 :通过分析前端JS代码(搜索
new FormData、upload等),发现隐藏的上传API接口。 - 第三方编辑器漏洞:如UEditor、CKEditor、KindEditor等历史版本的已知漏洞,常存在未授权或过滤不严的上传点。
- OSS对象存储绕过:即使存储桶不支持脚本执行,也可能因配置不当(如公共读写)导致可上传钓鱼HTML文件或进行资源劫持。
第三部分:文件包含漏洞深度利用("升华之路")
当文件上传漏洞遇到文件包含漏洞,攻击面将发生质的飞跃。文件包含漏洞的核心是应用程序动态包含文件时,用户可控了包含路径。
3.1 两种类型
- 本地文件包含 :包含服务器本地的文件,如
/etc/passwd。 - 远程文件包含 :包含远程服务器上的恶意文件,前提是PHP配置了
allow_url_include=On。
3.2 挖掘思路
- 白盒审计 :在代码中搜索
include、require、file_get_contents等函数,并追踪其参数是否用户可控。 - 黑盒测试 :在URL参数中寻找
?file=、?page=、?path=、?lang=等特征点进行模糊测试。
3.3 利用技巧与实战手法
- 读取敏感文件 :利用
file://协议或../../../../etc/passwd进行目录遍历。 - 读取源码 :使用
php://filter/read=convert.base64-encode/resource=index.php获取文件Base64编码内容。 - 直接执行代码:
-
data://协议:?file=data://text/plain,<?php phpinfo();?>php://input协议:在POST请求体中直接提交PHP代码。
- 日志包含 :修改User-Agent为
<?php system('id');?>,然后包含Web服务器日志文件(如/var/log/nginx/access.log)来执行代码。 - Session包含 :利用
PHP_SESSION_UPLOAD_PROGRESS在上传过程中创建恶意Session文件,并通过条件竞争包含它。 - 与文件上传联动:上传一个图片马,然后通过LFI去包含它,从而触发恶意代码执行。
3.4 实战案例复盘:kkFileView任意文件读取
知名开源项目kkFileView曾存在路径遍历漏洞,通过urlPath参数即可实现任意文件读取。
漏洞利用数据包示例:
GET /getCorsFile?urlPath=file:///etc/passwd HTTP/1.1
Host: target.com
此案例说明,对于文件预览、转换等功能,需格外注意其处理的url、path等参数。
第四部分:实战指南与自查清单
4.1 文件上传漏洞测试清单
- 梳理所有上传点(头像、文章、附件、导入、编辑器等)。
- 测试普通文件与脚本文件的上传,观察拦截情况。
- 依次尝试前端绕过、MIME绕过、文件头绕过、后缀变形。
- 探测服务器中间件版本,测试解析漏洞。
- 分析JS代码,寻找隐藏上传接口。
- 识别第三方编辑器及其版本,搜索历史漏洞。
- 尝试条件竞争上传。
- 上传
.htaccess或web.config,尝试重写解析规则。
4.2 文件包含漏洞测试清单
- 搜集所有包含文件操作的参数(file, path, page等)。
- 尝试读取敏感文件(
/etc/passwd,.env,config.php)。 - 测试
php://filter、data://等伪协议。 - 尝试包含Web日志或Session文件。
- 若存在上传点,尝试包含上传的图片马。
- 检查返回的报错信息,获取路径线索。
第五部分:安全加固建议("知其攻,更要知其守")
- 严格白名单:对上传文件类型、文件包含的路径均采用白名单策略。
- 重命名文件:上传文件使用随机字符串重命名,阻断用户对文件名的控制。
- 限制执行权限 :确保上传目录无脚本执行权限(如设置
php_flag engine off)。 - 内容深度检测:对图片进行二次渲染,清除恶意代码。
- 安全配置 :关闭PHP危险配置(如
allow_url_include),禁用不安全的协议(如php://filter、data://)在生产环境的使用。 - 及时更新:升级第三方编辑器、框架及中间件至最新安全版本。
结语
渗透测试是一门高度依赖上下文环境的实践科学。本文整合了从信息收集、工具联动,到文件上传与文件包含漏洞深度利用的全链路知识。希望这份指南能帮助你构建更清晰、更系统的渗透测试思维,在实战中游刃有余。