记录一些 S3 攻防相关的知识点。
S3基础
基础概念
- S3(Simple Storage Service),也就是我们常说的对象存储,有点像云盘那种托管存储服务。
- Bucket,桶,通常用来装相同类型的Object(非强制,不是相同类型的也可以)
- Object,对象,最小存储单位,Object为(Key,Value,metadata)的三元组
- 目前多家云服务厂商都提供对应的S3存储服务,如Amazon、阿里云,百度云为例,此处先以AWS的S3进行基础学习
权限模型
S3预定义的组
整体可以参考https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/acl-overview.html 大概有如下几种组:
- 经身份验证的用户组, 用http://acs.amazonaws.com/groups/global/AuthenticatedUsers 表示,可以理解为全世界任一有效 AWS 账号(必须签名)均可访问
- 所有用户组 – 由 http://acs.amazonaws.com/groups/global/AllUsers 表示,可以理解为没有身份要求,匿名或者实名均可
- 日志传输组 – 由 http://acs.amazonaws.com/groups/s3/LogDelivery 表示。
S3常见ACL策略
作用对象
- 某个Group:AuthenticatedUsers、AllUsers、LogDelivery
- 某个 AWS 账号(用 Canonical User ID)
授权类型
- READ:对于Bucket可列举对象,对于Object可读取Value和metadata
- WRITE:对于Bucket能往Bucket写对象
- READ_ACP:对于Bucket和Object均可以读取其ACL
- WRITE_ACP:对于Bucket和Object均可以修改其ACL
- FULL_CONTROL:对于Bucket具备包括READ、WRITE、READ_ACP、WRITE_ACP权限,对于Object具备READ、READ_ACP、WRITE_ACP权限
Policy配置
Policy五要素分别为:Effect、Principal、Action、Resource、Condition
- Effect:Allow or Deny;默认拒绝;
- Principal:身份的授权主体,这条策略授权给谁;
- Action:S3的API名列表,带服务前缀;
- Resource:作用在哪,可以是具体的Bucket或者Object,和Actions有对应关系
- Condition:额外门槛,相当于访问所需的额外条件
屏蔽公共访问权限设置(Blocking public access)
具备账号级 + 桶级的双重管控,账号级和桶级按更严的算
- BlockPublicAcls和BlockPublicPolicy,主要管控增量公开配置
- IgnorePublicAcls / RestrictPublicBuckets 主要限制存量公开配置
拦截开关
- BlockPublicAcls:拒绝新的公开 ACL
- IgnorePublicAcls:已有的公开 ACL 不再生效
- BlockPublicPolicy:拒绝新的公开 Bucket Policy
- RestrictPublicBuckets:已有公开 Policy 时,把公开访问收窄(公开 Policy 一旦存在,整份 Policy 带来的公开和跨账号授权都不再生效,只剩本账号 + AWS 服务)
常见攻击面
Bucket 爆破
在已确认是S3的服务时,对BucketName未知的情况下,可以执行爆破操作,此时:
- InvalidBucketName代表桶的命名不符合格式要求
- NoSuchBucket代表Bucket不存在
- 接口返回对象列表同时意味着可能存在列对象漏洞(但对象不一定能直接访问)
- 匿名请求返回 AccessDenied 时,可认为该 BucketName 存在,此时则需要继续通过其他方式尝试获取Key
Bucket 接管
前置条件:
- 受害者曾经将某个子域名CNAME指到BucketName.s3.amazonaws.com,并注册过此BucketName
- 受害者删除掉这个曾用的BucketName,但没有清除该子域名对应的CName解析
攻击方式:
- S3的Bucketname是全局唯一
- 攻击者可以抢注与该域名相同的BucketName,来达成实际控制该子域名下内容的效果
- 因为攻击者持有了该Bucket,即使域名非攻击者持有,攻击者仍相当于控制了该信任域下的内容
任意文件上传
- 可以直接通过PUT方式,向Bucket上传文件
- 如果可覆盖,则可以造成供应链文件偷毒问题
- 如果对象存储支持 html 解析,可以进一步XSS、钓鱼等攻击。
Bucket ACL(BPA允许为前提)
如果某个Group或者某个AWS账号(Canonical User ID)被授权了WRITE_ACP,则可以通过修改ACL策略来达到进一步攻击的效果
Object ACL 可写
如果Object的ACL设置了可写,则可以被攻击者修改并造成进一步攻击
Bucket Object 遍历
对象遍历问题可能有如下两种情况造成:
- Bucket的ACL开放了READ
- Bucket的Policy设置了s3:ListBucket
Bucket Policy可读
如果Bucket的Policy设置了s3:GetBucketPolicy,可能会泄露Condition等访问条件
Bucket Policy可写
如果某个Bucket的Policy可写,则可以被攻击者修改并造成进一步攻击
常用命令
Bucket
- 按前缀列某个Bucket的key目录
1
aws s3 ls s3://bucketName --recursive
- 列出Bucket的Objects
1
aws s3api list-objects --bucket bucketname
- 查看Bucket的ACL策略
1
aws s3api get-bucket-acl --bucket bucketname
- 修改Bucket的ACL策略
1
aws s3api put-bucket-acl --bucket bucketname --access-control-policy file://acl.json
- 查看Bucket的Policy
1
aws s3api get-bucket-policy --bucket bucketname
- 修改Bucket的Policy
1
aws s3api put-bucket-policy --bucket bucketname --policy file://policy.json
Object
- 按前缀列某个Bucket的下的Object目录
1
aws s3 ls s3://bucketName/ObjectKey
- 复制某个object内容到某个路径
1
aws s3 cp s3://bucketName/ObjectKey targetPath
- 读取某个Object的ACL策略
1
aws s3api get-object-acl --bucket bucketname --key ObjectKey
- 修改某个Object的ACL策略
1
aws s3api put-object-acl --bucket bucketname --key ObjectKey --access-control-policy file://acl.json
附录
- https://wiki.teamssix.com/CloudService/S3/
- https://zone.huoxian.cn/d/907-aws-s3
- https://docs.aws.amazon.com/zh_cn/cli/v1/userguide/cli-services-s3-commands.html
- https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/access-control-block-public-access.html
本文作者:
yd0ng
本文链接: https://blog.yd0ng.top/2026/09/07/%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8/%E4%BA%91%E5%AE%89%E5%85%A8-s3/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
本文链接: https://blog.yd0ng.top/2026/09/07/%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8/%E4%BA%91%E5%AE%89%E5%85%A8-s3/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!