技术讨论 | 如何绕过并利用Bucket的上传策略和URL签名
字数 1894 2025-08-18 11:37:33

Bucket上传策略与URL签名安全分析与利用指南

1. Bucket策略基础概念

1.1 什么是Bucket上传策略

Bucket上传策略是一种直接从客户端向云端存储空间(如AWS S3或Google云端存储)上传数据的安全机制。其核心流程包括:

  1. 服务端创建定义上传规则的上传策略
  2. 使用密钥对策略进行签名
  3. 将签名后的策略发送给客户端
  4. 客户端直接上传文件到Bucket
  5. Bucket存储验证上传内容与策略是否匹配

1.2 URL预签名机制

URL预签名(AWS)或URL签名(Google云端存储)是另一种访问Bucket对象的方式,与POST策略相比:

  • 功能更强大:不仅限于上传,还可用于PUT、DELETE或GET操作
  • 控制更宽松:对Content-Type、访问控制和文件上传的限制较少
  • 风险更高:错误实现时更容易导致安全问题

2. 上传策略的漏洞模式与利用技术

2.1 关键评估属性

在分析上传策略安全性时,需评估以下属性:

  • Access:上传后是否能访问文件(如ACL设为public-read或提供URL预签名)
  • Inline:是否能修改content-disposition以内联方式提供内容

2.2 常见漏洞模式

2.2.1 starts-with $key为空

示例策略

["starts-with", "$key",""]

风险

  • 可上传文件到Bucket任意位置
  • 可覆盖任意现有对象
  • 实现完整的Bucket写入权限

限制

  • 当Bucket使用UUID命名且不公开对象时,利用难度增加

2.2.2 starts-with $key不包含路径分隔符或使用固定路径

示例策略

["starts-with", "$key","acc_1322342m3423"]

风险

  • 可将内容上传到Bucket根目录
  • 结合Access=Yes和Inline=Yes,可:
    • 通过AppCache-manifest窃取其他用户上传的URL
    • 当所有用户使用相同上传路径时效果相同

2.2.3 starts-with $Content-Type为空

示例策略

["starts-with","$Content-Type", ""]

风险

  • 可上传text/html内容
  • 在Bucket域上运行恶意JavaScript
  • 安装恶意AppCache-manifest窃取数据

2.2.4 starts-with $Content-Type定义不严格

示例策略

["starts-with","$Content-Type", "image/jpeg"]

绕过技巧

Content-type: image/jpegz;text/html

风险

  • 通过添加额外内容绕过MIME类型限制
  • 当Bucket托管在公司子域时,可实现跨站脚本攻击

3. URL签名机制的漏洞与利用

3.1 基本利用思路

通过获取Bucket根目录的已签名GET-URL,可:

  1. 列出Bucket中所有文件
  2. 为已知文件请求URL签名
  3. 访问原本私有的文件数据

3.2 常见错误实现案例

3.2.1 路径遍历导致根目录暴露

正常请求

GET /api/get-image?key=abc&document=xyz

返回签名URL:

https://prodapp.s3.amazonaws.com/documents/648475/images/abc?... 

攻击方式

GET /api/get-image?key=../../../../&document=xyz

返回根目录签名URL:

https://prodapp.s3.amazonaws.com/?...

3.2.2 正则表达式解析缺陷

请求示例

POST /api/file_upload_policies/s3_url_signature.json
{"url":"https://example-bucket.s3.amazonaws.com/dir/file.png"}

攻击方式

{"url":"https://example-bucket.s3.amazonaws.com/?"}

3.2.3 临时URL签名滥用

流程

  1. 创建随机密钥:POST /api/s3_file/
  2. 返回:https://secure.example.com/files/abc-123-def-456-ghi-789
  3. 重定向到:https://example.s3.amazonaws.com/file.jpg?...

攻击方式
提交s3_key":"/",获取根目录访问权限

4. 防御建议与最佳实践

4.1 上传策略安全配置

  1. 唯一性:为每个文件上传请求生成独立的上传策略
  2. 严格key定义
    • 使用唯一、随机的文件名
    • 包含随机路径组件
  3. Content-Disposition:优先设置为attachment
  4. ACL设置:设为private或不定义(默认为私有)
  5. Content-Type
    • 避免使用starts-with
    • 明确指定允许的MIME类型

4.2 URL签名安全实践

  1. 避免基于用户输入:不应直接根据用户提供的参数生成签名
  2. 最小权限原则:仅签署必要的操作(GET/PUT等)和路径
  3. 时间限制:为签名URL设置合理的过期时间
  4. 审计日志:记录所有签名URL的生成和使用

4.3 高风险操作禁止

绝对避免的实现

https://example.com/api/sign?to_sign=GET%0A%0A%0A%0Ax-amz-date...[实际请求]...

此类实现允许攻击者构造任意AWS服务请求并获得有效签名。

5. 总结

Bucket上传策略和URL签名机制在提供便利的同时,也带来了显著的安全风险。通过严格遵循最小权限原则、避免基于用户输入的签名生成、以及实施全面的输入验证,可以显著降低数据泄露和未授权访问的风险。安全团队应特别关注starts-with条件的使用和路径遍历的可能性,确保云存储配置符合企业安全要求。

Bucket上传策略与URL签名安全分析与利用指南 1. Bucket策略基础概念 1.1 什么是Bucket上传策略 Bucket上传策略是一种直接从客户端向云端存储空间(如AWS S3或Google云端存储)上传数据的安全机制。其核心流程包括: 服务端创建定义上传规则的上传策略 使用密钥对策略进行签名 将签名后的策略发送给客户端 客户端直接上传文件到Bucket Bucket存储验证上传内容与策略是否匹配 1.2 URL预签名机制 URL预签名(AWS)或URL签名(Google云端存储)是另一种访问Bucket对象的方式,与POST策略相比: 功能更强大:不仅限于上传,还可用于PUT、DELETE或GET操作 控制更宽松:对Content-Type、访问控制和文件上传的限制较少 风险更高:错误实现时更容易导致安全问题 2. 上传策略的漏洞模式与利用技术 2.1 关键评估属性 在分析上传策略安全性时,需评估以下属性: Access :上传后是否能访问文件(如ACL设为public-read或提供URL预签名) Inline :是否能修改content-disposition以内联方式提供内容 2.2 常见漏洞模式 2.2.1 starts-with $key为空 示例策略 : 风险 : 可上传文件到Bucket任意位置 可覆盖任意现有对象 实现完整的Bucket写入权限 限制 : 当Bucket使用UUID命名且不公开对象时,利用难度增加 2.2.2 starts-with $key不包含路径分隔符或使用固定路径 示例策略 : 风险 : 可将内容上传到Bucket根目录 结合Access=Yes和Inline=Yes,可: 通过AppCache-manifest窃取其他用户上传的URL 当所有用户使用相同上传路径时效果相同 2.2.3 starts-with $Content-Type为空 示例策略 : 风险 : 可上传text/html内容 在Bucket域上运行恶意JavaScript 安装恶意AppCache-manifest窃取数据 2.2.4 starts-with $Content-Type定义不严格 示例策略 : 绕过技巧 : 风险 : 通过添加额外内容绕过MIME类型限制 当Bucket托管在公司子域时,可实现跨站脚本攻击 3. URL签名机制的漏洞与利用 3.1 基本利用思路 通过获取Bucket根目录的已签名GET-URL,可: 列出Bucket中所有文件 为已知文件请求URL签名 访问原本私有的文件数据 3.2 常见错误实现案例 3.2.1 路径遍历导致根目录暴露 正常请求 : 返回签名URL: 攻击方式 : 返回根目录签名URL: 3.2.2 正则表达式解析缺陷 请求示例 : 攻击方式 : 3.2.3 临时URL签名滥用 流程 : 创建随机密钥: POST /api/s3_file/ 返回: https://secure.example.com/files/abc-123-def-456-ghi-789 重定向到: https://example.s3.amazonaws.com/file.jpg?... 攻击方式 : 提交 s3_key":"/" ,获取根目录访问权限 4. 防御建议与最佳实践 4.1 上传策略安全配置 唯一性 :为每个文件上传请求生成独立的上传策略 严格key定义 : 使用唯一、随机的文件名 包含随机路径组件 Content-Disposition :优先设置为 attachment ACL设置 :设为 private 或不定义(默认为私有) Content-Type : 避免使用 starts-with 明确指定允许的MIME类型 4.2 URL签名安全实践 避免基于用户输入 :不应直接根据用户提供的参数生成签名 最小权限原则 :仅签署必要的操作(GET/PUT等)和路径 时间限制 :为签名URL设置合理的过期时间 审计日志 :记录所有签名URL的生成和使用 4.3 高风险操作禁止 绝对避免的实现 : 此类实现允许攻击者构造任意AWS服务请求并获得有效签名。 5. 总结 Bucket上传策略和URL签名机制在提供便利的同时,也带来了显著的安全风险。通过严格遵循最小权限原则、避免基于用户输入的签名生成、以及实施全面的输入验证,可以显著降低数据泄露和未授权访问的风险。安全团队应特别关注 starts-with 条件的使用和路径遍历的可能性,确保云存储配置符合企业安全要求。