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签名链接
- 流程:
- 创建随机密钥:
{"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应优先设置为attachmentacl应优先选择private或不设置content-type应明确设置(不使用starts-with)或不设置
4.2 URL签名安全建议
- 不要基于用户请求参数创建URL签名
- 严格控制签名权限范围
- 避免暴露Bucket根目录访问权限
- 实施严格的路径验证
4.3 其他建议
- 定期审计Bucket权限设置
- 监控异常访问模式
- 使用最小权限原则配置访问控制
- 考虑使用存储桶策略进一步限制访问
5. 总结
本文详细介绍了Bucket上传策略和URL签名机制的安全风险及利用方法,包括多种绕过技术和实际案例。通过理解这些漏洞模式,开发人员可以更好地保护云端存储资源,避免敏感数据泄露。关键在于严格验证所有上传参数,实施最小权限原则,并避免将用户输入直接用于生成访问凭证。