portswigger_文件上传漏洞

一、是啥

1. 什么是文件上传漏洞

  • 当web服务器允许用户上传文件时,对上传文件的检测疏忽,名称、类型、内容、大小等等。
  • 即使是基本的图像上传函数也可以用于上传任意和潜在的危险文件。这甚至可以包括启用远程代码执行的服务器端脚本文件。

2. 文件上传漏洞如何出现

  • 开发人员维护,利用黑名单,但实际上黑名单虽然限制了部分文件,但仍存在更危险晦涩的文件类型可被上传

3. web服务器如何处理静态的文件请求

  • 过去网站几乎完全由静态文件组成
  • 每个请求路径与服务器文件系统上的目录文件层次结构映射为1:1
  • 网站越来越动态,请求的路径通常与文件系统完全没有直接关系。但是,Web服务器仍处理某些静态文件的请求,包括样式表,图像等
  • 处理静态文件:服务器解析文件扩展名与MIME类型 进行比较
  • 若 文件类型不可执行:图像或静态HTML页面,服务器发给客户端
  • 若 文件类型是可执行的:PHP,执行结果在HTTP响应返回给客户端
  • 若文件类型可执行,但服务器未配置执行此类型文件:会错误响应,文件的内容可能会作为纯文本提供给客户端,可能会被利用为泄漏源代码和其他敏感信息
  • content-type响应标头可能会提供有关服务器认为已使用的文件的线索。如果该标头未通过应用程序代码明确设置,则通常包含文件扩展名/MIME类型映射的结果。

二、类型

1. 任意上传以部署webshell

  • 从安全角度来看,最坏的情况是网站允许您上传服务器端脚本(例如PHP,Java或Python文件),并且还配置为将其执行为代码
  • 如果您能够成功上传Web Shell,则可以有效地控制服务器。这意味着您可以读取和编写任意文件,渗透敏感数据,甚至使用服务器对内部基础架构和网络外部的其他服务器进行旋转。例如,可以使用以下PHP单线线从服务器的文件系统读取任意文件:<?php echo file_get_contents('/path/to/target/file'); ?>
lab:上传webshell进行远程代码执行

用wiener:peter登录 account
上传1.php
访问webshell的地址

在这里插入图片描述
上传webshell php <?php echo file_get_contents('/home/carlos/secret');?>
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
qMofGFtevw0O02V6s3adxBLOkKb5bfrT

2. 文件类型验证存在缺陷

如果未进行进一步的验证以检查文件的内容是否实际匹配所谓的MIME类型,则可以使用Burp Repeater等工具轻松绕过此防御。

lab:上传webshell 通过Content-Type 限制绕过
  • wiener:peter登录
  • 上传1.php上传时抓包发到repeater
  • content-type改为image/png
  • 在这里插入图片描述
    在这里插入图片描述

3. 防止文件执行

lab:上传websh
Apache Batik 是一个用于处理可缩放矢量图形(SVG)文件的 Java 库,常被用来解析和渲染 SVG 内容。在某些情况下,Batik 的不当使用可能导致服务器端出现文件读取漏洞,攻击者可以借此读取服务器上的任意本地文件。 该漏洞的核心在于 SVG 文件中可以嵌入脚本或引用外部资源。当 Batik 解析这些 SVG 文件时,如果没有对文件内容进行严格限制,就可能触发对外部资源的访问或者执行恶意代码。例如,通过 `script` 标签、`xlink:href` 属性等方式引入外部内容,从而导致服务器端发起请求或泄露敏感信息[^1]。 ### 漏洞分析 #### 1. SVG 中的外部引用 SVG 文件支持使用 `xlink:href` 或 `<image>` 元素来加载外部资源。如果 Batik 在解析过程中没有正确过滤这些引用,攻击者可以通过构造特定的 SVG 文件诱导服务器加载本地文件,如 `/etc/passwd` 等。 ```xml <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <image xlink:href="file:///etc/passwd"/> </svg> ``` 上述代码片段展示了如何利用 SVG 文件读取服务器上的本地文件。当 Batik 渲染该 SVG 时,会尝试加载指定路径的内容并显示出来,进而导致敏感信息泄露[^1]。 #### 2. 数据协议 (data URI) 和 Base64 编码 除了直接引用本地文件外,还可以通过 data URI 协议将任意数据编码为 Base64 并嵌入到 SVG 中。这种方式可用于隐藏恶意内容或绕过简单的黑名单检查机制。 ```xml <svg xmlns="http://www.w3.org/2000/svg"> <script type="text/ecmascript"><![CDATA[ alert('XSS'); ]]></script> </svg> ``` 尽管 Apache Batik 不直接执行 JavaScript,但如果其解析流程中存在沙箱逃逸问题,则仍有可能触发 XSS 攻击或其他类型的安全事件[^2]。 ### 利用方法 #### 1. 利用 SVG 读取本地文件 上传精心构造的 SVG 文件后,系统可能会将其解析为图像并展示在前端页面上。此时,若解析器未禁用对外部资源的访问,则会加载本地文件内容并通过 HTTP 响应返回给客户端。 - 构造包含 `xlink:href="file:///etc/passwd"` 的 SVG 文件。 - 将此 SVG 文件上传至目标服务器。 - 访问该 SVG 资源时,服务器响应中将包含 `/etc/passwd` 的内容。 #### 2. 绕过防护机制 一些应用可能尝试通过限制上传文件扩展名或 MIME 类型来阻止 SVG 文件上传。然而,攻击者可通过以下方式绕过这些限制: - **修改文件扩展名**:将 `.svg` 文件更改为 `.txt` 或其他允许上传的格式。 - **使用压缩包封装 SVG**:部分系统接受 ZIP 压缩包作为上传格式,攻击者可在其中放入 SVG 文件,并利用解压后自动解析的逻辑实现攻击。 - **混合 HTML 与 SVG**:创建 `.html` 文件并在其中嵌入 SVG 内容,利用浏览器自动识别并渲染 SVG 的特性触发漏洞。 ### 防护措施 为了有效防止 Apache Batik SVG 文件读取漏洞带来的风险,建议采取以下措施: 1. **禁用外部实体解析**:配置 XML 解析器以禁用 DTD(Document Type Definitions)和外部实体引用,防止 XXE(XML External Entity)攻击。 2. **限制资源访问**:确保 Batik 在解析 SVG 时不访问本地文件系统或网络资源。可以通过设置 `ALLOW_EXTERNAL_RESOURCES` 参数为 `false` 来实现。 3. **严格校验上传内容**:不仅检查文件扩展名,还应验证文件的真实内容,避免用户上传含有恶意脚本或外部引用的 SVG 文件。 4. **隔离解析环境**:在沙箱环境中运行 Batik,限制其对系统资源的访问权限,减少潜在攻击面。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值