Web安全-文件上传&文件包含

前言

在Web安全领域,文件上传漏洞文件包含漏洞堪称两大"高危"漏洞,它们往往能直接导致服务器被控制。同时,一份高效的渗透测试离不开前期的信息收集与工具联动。

本文将系统性地整合这三部分知识,从信息收集、子域名挖掘,到文件上传与包含漏洞的深度利用,形成一套完整的攻防实战指南,希望能为你的安全测试工作提供有价值的参考。


第一部分:信息收集与工具联动("粮草先行")

信息收集的质量直接决定了后续渗透测试的深度和广度。在实战中,我们通常会组合使用多种工具,构建高效的工作流。

1.1 核心工具及其角色定位
  • OneForAll子域名收集的"重器"。它是一款功能强大的子域名集成工具,通过调用多源API和爆破字典,能全面收集目标主站的子域名资产。
    • 基本用法python3 oneforall.py --target example.com run
    • 结果导出 :支持csvjson等格式,python3 oneforall.py --target example.com run --fmt csv
  • ENScan_GO企业公开信息的"挖掘机"。不同于主动扫描,它专注于从爱企查、天眼查等公开渠道,自动化收集目标企业的ICP备案、APP、小程序、微信公众号及股权架构等,是前期踩点的重要工具。
  • Fscan内网安全的"侦察兵"。一款内网综合扫描工具,用于在获得授权后,快速探测内网存活主机、开放端口(如22, 445, 3306)、弱口令以及高危漏洞(如"永恒之蓝")。
  • DirsearchWeb目录的"翻找者"。基于字典的Web路径暴力枚举工具,常用于发现网站的后台、备份文件、未授权访问的API接口等隐藏路径。
  • GobyXray漏洞扫描的"黄金搭档"。Goby擅长资产管理和漏洞验证,Xray则专注于Web漏洞的深度扫描。两者可通过插件实现联动,实现从资产发现到漏洞扫描的无缝衔接。
1.2 构建自动化工作流

典型的渗透测试流程可以这样串联工具:

  1. 资产收集 :使用OneForAll收集子域名,用ENScan_GO梳理企业股权结构。
  2. 存活探测 :利用httpx等工具,从子域名列表中筛选出存活的Web服务。
  3. 指纹识别 :通过EHole等工具识别目标使用的CMS、中间件等信息。
  4. 漏洞扫描
    • 方式一(文件导入) :将OneForAll的结果导出为CSV,然后导入到Goby或Xray中进行扫描。Xray支持--target-file参数直接加载目标列表。
    • 方式二(高效联动):在Goby中安装Xray插件,配置好路径后,可直接在Goby界面对选中的资产一键启动Xray扫描。

第二部分:文件上传漏洞全解("突破口")

文件上传漏洞的本质是对用户输入的文件缺乏足够的过滤与限制,导致攻击者能上传并执行恶意脚本。

2.1 核心原理与防御绕过

核心思路:层层突破目标在前端到后端设下的验证关卡。

|-------------|----------------------|-----------------------------------------------------------------------------|
| 验证层面 | 验证方式 | 绕过技巧 |
| 前端JS验证 | 客户端检查后缀或类型 | 禁用浏览器JS、直接使用Burp抓包改包。 |
| MIME验证 | 检查Content-Type头 | 抓包修改Content-Typeimage/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 FormDataupload等),发现隐藏的上传API接口。
  • 第三方编辑器漏洞:如UEditor、CKEditor、KindEditor等历史版本的已知漏洞,常存在未授权或过滤不严的上传点。
  • OSS对象存储绕过:即使存储桶不支持脚本执行,也可能因配置不当(如公共读写)导致可上传钓鱼HTML文件或进行资源劫持。

第三部分:文件包含漏洞深度利用("升华之路")

当文件上传漏洞遇到文件包含漏洞,攻击面将发生质的飞跃。文件包含漏洞的核心是应用程序动态包含文件时,用户可控了包含路径

3.1 两种类型
  • 本地文件包含 :包含服务器本地的文件,如/etc/passwd
  • 远程文件包含 :包含远程服务器上的恶意文件,前提是PHP配置了allow_url_include=On
3.2 挖掘思路
  • 白盒审计 :在代码中搜索includerequirefile_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

此案例说明,对于文件预览、转换等功能,需格外注意其处理的urlpath等参数。


第四部分:实战指南与自查清单

4.1 文件上传漏洞测试清单
  • 梳理所有上传点(头像、文章、附件、导入、编辑器等)。
  • 测试普通文件与脚本文件的上传,观察拦截情况。
  • 依次尝试前端绕过、MIME绕过、文件头绕过、后缀变形。
  • 探测服务器中间件版本,测试解析漏洞。
  • 分析JS代码,寻找隐藏上传接口。
  • 识别第三方编辑器及其版本,搜索历史漏洞。
  • 尝试条件竞争上传。
  • 上传.htaccessweb.config,尝试重写解析规则。
4.2 文件包含漏洞测试清单
  • 搜集所有包含文件操作的参数(file, path, page等)。
  • 尝试读取敏感文件(/etc/passwd, .env, config.php)。
  • 测试php://filterdata://等伪协议。
  • 尝试包含Web日志或Session文件。
  • 若存在上传点,尝试包含上传的图片马。
  • 检查返回的报错信息,获取路径线索。

第五部分:安全加固建议("知其攻,更要知其守")

  1. 严格白名单:对上传文件类型、文件包含的路径均采用白名单策略。
  2. 重命名文件:上传文件使用随机字符串重命名,阻断用户对文件名的控制。
  3. 限制执行权限 :确保上传目录无脚本执行权限(如设置php_flag engine off)。
  4. 内容深度检测:对图片进行二次渲染,清除恶意代码。
  5. 安全配置 :关闭PHP危险配置(如allow_url_include),禁用不安全的协议(如php://filterdata://)在生产环境的使用。
  6. 及时更新:升级第三方编辑器、框架及中间件至最新安全版本。

结语

渗透测试是一门高度依赖上下文环境的实践科学。本文整合了从信息收集、工具联动,到文件上传与文件包含漏洞深度利用的全链路知识。希望这份指南能帮助你构建更清晰、更系统的渗透测试思维,在实战中游刃有余。