技术讨论 | 如何绕过并利用Bucket的上传策略和URL签名
字数 1894 2025-08-18 11:37:33
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为空
示例策略:
["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,可:
- 列出Bucket中所有文件
- 为已知文件请求URL签名
- 访问原本私有的文件数据
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签名滥用
流程:
- 创建随机密钥:
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 高风险操作禁止
绝对避免的实现:
https://example.com/api/sign?to_sign=GET%0A%0A%0A%0Ax-amz-date...[实际请求]...
此类实现允许攻击者构造任意AWS服务请求并获得有效签名。
5. 总结
Bucket上传策略和URL签名机制在提供便利的同时,也带来了显著的安全风险。通过严格遵循最小权限原则、避免基于用户输入的签名生成、以及实施全面的输入验证,可以显著降低数据泄露和未授权访问的风险。安全团队应特别关注starts-with条件的使用和路径遍历的可能性,确保云存储配置符合企业安全要求。