AWS 云服务安全系列(一):S3 对象存储基础及典型安全风险解析
本文详细探讨了S3对象存储的安全问题及应对策略,包括存储桶爆破、接管、任意文件上传、ACL配置错误、策略漏洞等攻击原理与防御措施,并介绍了利用云函数限制文件上传类型的解决方案。 2025-8-21 07:14:39 Author: www.freebuf.com(查看原文) 阅读量:18 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

1.S3对象储存

  • 存储桶结构:

    • 存储桶(Bucket)内包含多个对象(Object),一个对象中包含唯一标识符(key)、数据本体(Data)、元数据(Metadata)

      • 注:此处元数据类似于数据标签,可以加快对象的排序分类和查找

    • 例如:https://awstest.s3.ap-northeast-2.amazonaws.com/flag

      • awstest 是存储桶 Bucket 的名称

      • /flag 就是 Key

1.1 Bucket 爆破

  • 类似目录爆破,通过内容判断桶是否存在

  • 当Bucket不存在时,返回InvalidBucketNameNoSuchBucket

  • 当Bucket存在时,返回ObjectAccessDenied

1.2 Bucket接管

  • 原理:利用 “域名指向 S3 服务但对应存储桶未创建” 的漏洞,通过创建与域名同名的存储桶,抢占该域名与 S3 服务的关联关系,最终实现对目标域名下 S3 资源的控制

  • 判定标准:

    1. 目标域名访问返回 NoSuchBucket错误;

    2. 域名的 CNAME 记录指向 Amazon S3 服务;

    3. 错误信息中指定的存储桶名称(与域名一致)未被创建

  • 操作:

    1. 当发现渗透目标子域出现NoSuchBucket时,说明该域名指向一个不存在的存储桶

    2. 在相对应云服务中创建名称的Bucket可以进行接管

    3. 再次访问出现AccessDenied即表示Bucket已被接管,上传文件可以访问

1.3 S3任意文件上传

  • 原理:对象存储配置不当,设置公共读写,可能会造成任意文件上传与文件覆盖。

  • 判定标准:存储桶是否开放公共写入权限,且能通过匿名 PUT请求成功上传文件并验证访问

  • 操作:

    1. 使用PUT方法,上传(覆盖)文件,HOST设定为存储桶域名

    2. 返回200 OK**即表示上传成功

    3. 若目标的对象存储支持 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_ACPREAD_ACP

  • 操作:

    1. 当发现具有ACL读写权限后,可以通过修改权限为FULL_CONTROL

    2. 使用aws s3api put-bucket-acl --bucket awstest --access-control-policy file://acl.json 命令写入ACL

    3. 尝试列出存储桶对象

  • 示例:

{
    "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_ACPREAD_ACP

  • 操作:

    1. 当发现具有ACL读写权限后,可以通过修改权限为FULL_CONTROL

    2. 使用aws s3api put-object-acl --bucket awstest --key flag --access-control-policy file://acl.json 命令写入ACL

    3. 尝试列出存储桶对象

  • 示例:

{
    "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")。

  • 操作:

    1. 使用 aws s3api get-bucket-policy命令获取目标存储桶的当前策略,分析权限配置;

    2. 修改策略中的Effect(如将 Deny改为 Allow)、Action(如添加 s3:GetObject)或 Resource(如扩大访问范围),保存为本地 JSON 文件;

    3. 通过 aws s3api put-bucket-policy命令将恶意策略应用到目标存储桶;

    4. 执行目标操作(如下载敏感文件、访问静态资源),确认策略修改生效。

  • 示例:

{  
  "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"  // 敏感文件路径  
    }  
  ]  
}  
  • 危害:

    1. 修改网站引用的 s3 资源进行钓鱼:利用写入权限修改s3资源,使其将数据传输到攻击者服务器

    2. 修改 Bucket 策略为 Deny 使业务瘫痪:将原本可访问的资源权限设置为不可访问,导致网站瘫痪

1.7 Bucket Object 遍历

  • 原理:策略配置不当,允许未授权用户(如所有用户Principal: " * ")执行 s3:ListBucket操作

  • 判定标准:aws s3api get-bucket-website --bucket awstest-bucket返回 s3:ListBucket且为Allow

  • 操作:

    1. 使用 AWS CLI 查看存储桶是否启用 s3:ListBucket

    2. 通过浏览器或 curl访问存储桶的目录路径,观察是否返回Key;

    3. 将 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 角色权限及触发器的条件。

  • 操作:

    1. 在云厂商函数计算服务(如阿里云 FC)中创建事件函数,区域需与目标存储桶一致;运行环境选择 Python,上传包含校验逻辑的代码包(index.py压缩为 ZIP)。

    2. 码需实现以下逻辑:

      • 通过事件获取上传文件的存储桶名称、对象路径、区域等信息;~~~~

      • 读取文件头(前 32 字节)、后缀、Content-Type;

      • 与预设允许类型(如jpg/jpeg/png/gif`及对应 Content-Type)比对;

      • 校验不通过则调用 API 删除文件。

    3. 创建具备oss:GetObject(读取文件)和oss:DeleteObject(删除不合规文件)权限的角色,关联至云函数。

    4. 在函数配置中创建 OSS 触发器,关联目标存储桶,触发事件选择oss:ObjectCreated:PutObject(文件上传事件)。

    5. 上传合规文件(如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)


文章来源: https://www.freebuf.com/articles/container/445246.html
如有侵权请联系:admin#unsafe.sh