Bucket上传策略和URL签名的绕过与利用

  • A+
所属分类:网络安全文章

导读

Bucket(存储空间)上传策略是直接从客户端将数据上传到Bucket。通过上传策略中的这些规则以及与访问某些文件的相关逻辑,我们将展示如何爆出所有Bucket对象列表,同时还能够修改或删除Bucket中的文件。

什么是Bucket策略

(如果您已经知道了什么是Bucket策略和URL签名,则可以直接跳到下面利用部分的内容)

Bucket策略是一种将内容直接上传到基于云端的大型存储区(如Google云端存储或AWS S3)的安全方式。我们的想法是创建一个定义有检验是否允许文件上传的策略,随后用密钥对策略进行签名,再将策略和签名发送给客户端。

然后,客户端可以直接将文件上传到Bucket,Bucke存储会验证上传的内容和策略是否匹配,如果匹配,则上传文件。

上传策略 vs URL预签名

在开始之前,我们需要明确指出有多种方法可以访问Bucket中的对象。使用POST请求访问Bucket时,POST策略(AWS)和POST对象 (谷歌云存储)方式只允许上传内容。

另一种称为URL预签名(AWS)或URL签名(Google云端存储)的方式就不仅仅是可以修改对象。我们是否可以PUT,DELETE或GET 默认的私有对象,取决于预签名逻辑定义的HTTP方式。

在定义内容类型(Content-Type),访问控制和文件上传时,URL预签名比POST策略相比会更加宽松。使用错误的自定义逻辑也会更频繁地执行URL签名,如下所示。

有更多允许某人访问上传内容的方法,其中一个是AssumeRoleWithWebIdentity ,类似于POST策略,区别在于您可以获得由预定义的IAM Role(身份和访问管理角色)创建的临时安全凭证(ASIA *)。

如何发现上传策略或URL签名
这是使用用POST方法的上传请求,如下所示:

Bucket上传策略和URL签名的绕过与利用

该策略用的是ba64编码的JSON

  1. {
  2.  "expiration""2018-08-09T13:55:50Z",
  3.  "conditions": [
  4.   {"bucket""bucket-name"},
  5.   ["starts-with""$key""acc123"],
  6.   {"acl""public-read"},
  7.   {"success_action_redirect""https://www.cesafe.com/"},
  8.   ["starts-with""$Content-Type"""],
  9.   ["content-length-range", 0, 524288]
  10.  ]
  11. }

在AWS S3上的类似于下面的URL签名:

  1. https://bucket-name.s3.amazonaws.com/?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA...

就像谷歌云存储一样:

  1. HTTPS://storage.googleapis.com/uploads/images/test.png?Expires=1515198382&GoogleAccessId=example%40example.iam.gserviceaccount.com&Signature=dlMA---

上传策略的利用
现在到了有意思的部分!

如果我们想要发现策略中的错误,并充分利用,我们需要定义一些不同的属性:

Access = Yes - 在上传后我们是否可以以某种方式访问​​该文件。在策略中ACL是否 被定义为public-read或者能够接收上传文件的URL预签名。在策略中上传但未定义ACL的对象默认为私有。
Inline=Yes - 如果您能够修改 1content-disposition`文件,那么我们可以在内联中提供内容。如果策略中根本没有定义,则文件以内联方式提供。

  1. 1. starts-with $key是空的
  2. ["starts-with""$key"""]
  3. 2. starts-with $key不包含路径分隔符或为所有用户都用相同的路径
  4. ["starts-with""$key""acc_1322342m3423"]
  5. 3. starts-with $Content-Type为空
  6. ["starts-with""$Content-Type"""]
  7. 4.使用starts-with $Content-Type定义内容类型
  8. ["starts-with""$Content-Type""image/jpeg"]

使用自定义逻辑来利用URL签名
URL签名是在服务器端签名并提供给客户端,以获得上传、修改或访问内容的许可。最常见的问题是网站构建自定义逻辑来检索它们。

首先,要了解怎么利用已签名的URL,重要的是要知道在默认情况下,如何获取Bucket根目录下已签名的可以显示Bucket的文件列表的GET-URL。这和使用公开列表Bucket的情况基本相同,不同之处在于此Bucket肯定包含其他用户的私有数据。

请记住,当我们知道Bucket中的其它文件时,我们也可以为它们请求URL签名,这就让我们有了访问私密文件的权限。

因此,我们目标始终是尝试获根目录或已知的另一个文件。

错误的自定义逻辑的例子
以下是一些示例,其中逻辑通过发出签名的GET-URL实际暴露了Bucket的根路径。

  1. 1.使用get-image这个点对整个Bucket进行可读访问
  2. 2.正则表达式解析URL签名请求,导致可完全获取读权限
  3. 3.利用临时的URL签名链接
  • 服务器购买微信群
  • 阿里云&腾讯云&国外VPS
  • weinxin
  • 服务器购买QQ群
  • 阿里云&腾讯云&国外VPS
  • weinxin
CE安全网

发表评论

您必须登录才能发表评论!