Bucket上传策略和URL签名的绕过与利用
字数 2083 2025-08-29 08:32:25

Bucket上传策略和URL签名的绕过与利用

1. 基本概念

1.1 Bucket策略

Bucket策略是一种将内容直接上传到云端存储(如Google云端存储或AWS S3)的安全方式。它通过创建一个定义上传规则的策略文档,用密钥对策略进行签名,然后将策略和签名发送给客户端,客户端可以直接上传文件到Bucket。

1.2 上传策略 vs URL预签名

  • 上传策略(POST策略):仅允许上传内容
  • URL预签名:不仅限于上传,还可以PUT、DELETE或GET对象,取决于预签名逻辑定义的HTTP方法

2. 上传策略的利用

2.1 关键属性定义

  • Access=Yes:上传后是否可以访问文件
  • Inline=Yes:是否可以修改content-disposition使内容内联显示

2.2 常见漏洞场景

场景1: starts-with $key为空

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

  • 影响:可以上传文件到Bucket的任何位置,覆盖任何对象
  • 限制:如果Bucket使用UUID命名且不公开,利用难度较大

场景2: starts-with $key不包含路径分隔符

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

  • 影响:可以将内容直接放在Bucket根目录
  • 利用条件:Access=Yes和Inline=Yes
  • 攻击方式:通过AppCache-manifest窃取其他用户上传的URL

场景3: starts-with $Content-Type为空

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

  • 影响:可以上传text/html内容
  • 利用方式:运行JavaScript或安装AppCache-manifest

场景4: starts-with $Content-Type定义不严格

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

  • 绕过方法:添加额外内容使第一个内容类型成为未知mime类型
    Content-type: image/jpegz;text/html
  • 影响:文件将被识别为text/html类型

3. URL签名的利用

3.1 基本利用思路

获取Bucket根目录下已签名的GET-URL,可以显示Bucket的文件列表。知道其他文件后,可以为它们请求URL签名,获取访问权限。

3.2 错误自定义逻辑示例

示例1: 路径遍历

  • 原始请求:
    https://freehand.example.com/api/get-image?key=abc&document=xyz
  • 返回签名URL:
    https://prodapp.s3.amazonaws.com/documents/648475/images/abc?...
  • 利用方式:通过遍历路径指向根目录
    https://freehand.example.com/api/get-image?key=document=xyz
  • 结果:
    https://prodapp.s3.amazonaws.com/?X-Amz-Algorithm=...

示例2: 正则表达式解析问题

  • 请求:
    {"url":"https://example-bucket.s3.amazonaws.com/dir/file.png"}
    
  • 利用方式:欺骗URL extraction
    {"url":"https://example-bucket.s3.amazonaws.com/dir/../../../"}
    
  • 结果:获取Bucket根目录签名URL

示例3: 临时URL签名链接

  • 流程:
    1. 创建随机密钥:{"random_key":"abc-123", "s3_key":"/file.jpg"}
    2. 访问:https://secure.example.com/files/abc-123
    3. 重定向到:https://example.s3.amazonaws.com/file.jpg?...
  • 利用方式:修改s3_key/
    {"random_key":"xx1234","s3_key":"/"}
  • 结果:获取Bucket根目录列表

4. 防御建议

4.1 上传策略最佳实践

  1. 为每个文件上传请求或至少每个用户生成独立的上传策略
  2. $key应有完整定义:包含唯一、随机的名称和路径
  3. content-disposition应优先设置为attachment
  4. acl应优先选择private或不设置
  5. content-type应明确设置(不使用starts-with)或不设置

4.2 URL签名安全建议

  1. 不要基于用户请求参数创建URL签名
  2. 严格控制签名权限范围
  3. 避免暴露Bucket根目录访问权限
  4. 实施严格的路径验证

4.3 其他建议

  1. 定期审计Bucket权限设置
  2. 监控异常访问模式
  3. 使用最小权限原则配置访问控制
  4. 考虑使用存储桶策略进一步限制访问

5. 总结

本文详细介绍了Bucket上传策略和URL签名机制的安全风险及利用方法,包括多种绕过技术和实际案例。通过理解这些漏洞模式,开发人员可以更好地保护云端存储资源,避免敏感数据泄露。关键在于严格验证所有上传参数,实施最小权限原则,并避免将用户输入直接用于生成访问凭证。

Bucket上传策略和URL签名的绕过与利用 1. 基本概念 1.1 Bucket策略 Bucket策略是一种将内容直接上传到云端存储(如Google云端存储或AWS S3)的安全方式。它通过创建一个定义上传规则的策略文档,用密钥对策略进行签名,然后将策略和签名发送给客户端,客户端可以直接上传文件到Bucket。 1.2 上传策略 vs URL预签名 上传策略(POST策略) :仅允许上传内容 URL预签名 :不仅限于上传,还可以PUT、DELETE或GET对象,取决于预签名逻辑定义的HTTP方法 2. 上传策略的利用 2.1 关键属性定义 Access=Yes :上传后是否可以访问文件 Inline=Yes :是否可以修改content-disposition使内容内联显示 2.2 常见漏洞场景 场景1: starts-with $key为空 ["starts-with", "$key", ""] 影响 :可以上传文件到Bucket的任何位置,覆盖任何对象 限制 :如果Bucket使用UUID命名且不公开,利用难度较大 场景2: starts-with $key不包含路径分隔符 ["starts-with", "$key", "acc_1322342m3423"] 影响 :可以将内容直接放在Bucket根目录 利用条件 :Access=Yes和Inline=Yes 攻击方式 :通过AppCache-manifest窃取其他用户上传的URL 场景3: starts-with $Content-Type为空 ["starts-with", "$Content-Type", ""] 影响 :可以上传text/html内容 利用方式 :运行JavaScript或安装AppCache-manifest 场景4: starts-with $Content-Type定义不严格 ["starts-with", "$Content-Type", "image/jpeg"] 绕过方法 :添加额外内容使第一个内容类型成为未知mime类型 Content-type: image/jpegz;text/html 影响 :文件将被识别为text/html类型 3. URL签名的利用 3.1 基本利用思路 获取Bucket根目录下已签名的GET-URL,可以显示Bucket的文件列表。知道其他文件后,可以为它们请求URL签名,获取访问权限。 3.2 错误自定义逻辑示例 示例1: 路径遍历 原始请求: https://freehand.example.com/api/get-image?key=abc&document=xyz 返回签名URL: https://prodapp.s3.amazonaws.com/documents/648475/images/abc?... 利用方式:通过遍历路径指向根目录 https://freehand.example.com/api/get-image?key=document=xyz 结果: https://prodapp.s3.amazonaws.com/?X-Amz-Algorithm=... 示例2: 正则表达式解析问题 请求: 利用方式:欺骗URL extraction 结果:获取Bucket根目录签名URL 示例3: 临时URL签名链接 流程: 创建随机密钥: {"random_key":"abc-123", "s3_key":"/file.jpg"} 访问: https://secure.example.com/files/abc-123 重定向到: https://example.s3.amazonaws.com/file.jpg?... 利用方式:修改 s3_key 为 / {"random_key":"xx1234","s3_key":"/"} 结果:获取Bucket根目录列表 4. 防御建议 4.1 上传策略最佳实践 为每个文件上传请求或至少每个用户生成独立的上传策略 $key 应有完整定义:包含唯一、随机的名称和路径 content-disposition 应优先设置为 attachment acl 应优先选择 private 或不设置 content-type 应明确设置(不使用 starts-with )或不设置 4.2 URL签名安全建议 不要基于用户请求参数创建URL签名 严格控制签名权限范围 避免暴露Bucket根目录访问权限 实施严格的路径验证 4.3 其他建议 定期审计Bucket权限设置 监控异常访问模式 使用最小权限原则配置访问控制 考虑使用存储桶策略进一步限制访问 5. 总结 本文详细介绍了Bucket上传策略和URL签名机制的安全风险及利用方法,包括多种绕过技术和实际案例。通过理解这些漏洞模式,开发人员可以更好地保护云端存储资源,避免敏感数据泄露。关键在于严格验证所有上传参数,实施最小权限原则,并避免将用户输入直接用于生成访问凭证。