云存储的攻击利用方式
1 何为对象存储
对象存储中可以有多个桶(Bucket),然后把对象(Object)放在桶里,对象又包含了三个部分:Key、Data 和 Metadata。
1.1 Bucket
存储空间(Bucket)是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。
- 同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。
- 每个用户可以拥有多个存储空间。
- 存储空间的名称在 OSS 范围内必须是全局唯一的,一旦创建之后无法修改名称。
- 存储空间内部的对象数目没有限制。
1.2 Object
对象(Object)是 OSS 存储数据的基本单元,也被称为 OSS 的文件。和传统的文件系统不同,对象没有文件目录层级结构的关系。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的 Key 来标识。
Key 是指存储桶中的唯一标识符,例如一个 URL 为:https://yang999.oss-cn-hangzhou.aliyuncs.com/1.png
,这里的 yang999
是存储桶 Bucket 的名称,/1.png
就是 Key。
Data 就是存储的数据本体。
Metadata 对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。可以简单的理解成数据的标签、描述之类的信息,这点不同于传统的文件存储,在传统的文件存储中这类信息是直接封装在文件里的,有了元数据的存在,可以大大的加快对象的排序、分类和查找。
2.对象存储的利用方式
2.1 Object 遍历
在创建Bucket时,可以选择是否公开,默认是 private 的权限,如果在错误的配置下,给了 Listobject
权限,就会导致可遍历存储桶。
先创建,上传两个测试文件
如果直接访问,那么会拒绝,但是如果知道key。那么直接访问就会触发下载文件。
如果要在这个界面预览就需要
那么就可以预览所有的key。
2.2 Bucket桶爆破
当真正存在这个Bucket时,会出现AccessDenied
当桶不存在时
当名称不规范
所以根据回显不同来爆破Bucket的名称。可以通过CNAME
nslookup来收集域名解析的存储桶
2.3 特定的Bucket策略配置
特定的策略配置的指的是,如果管理员设置了某些 IP,UA 才可以请求该存储桶的话,此时如果错误的配置了 GetBucketPolicy
,可导致攻击者获取策略配置
这里使用aliyunCLI
2.4 文件上传覆盖
依旧是配置问题。管理员错误配置权限为可写时,那么就可以进行覆盖已经存在的文件。
如果目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作。
2.5 AK泄露,SAK泄露
1.可以通过Github等开源平台泄露AK
2.通过反编译小程序
3.目标网站源码中(JS代码)
这里给出我在某网站上挖到的AK
成功拿下该bucket
2.6 bucket子域接管
假设管理员通过域名CNAME解析并绑定了一个存储桶,但是管理员将存储桶删除后,没有将域名解析的 CNAME 删除,这时会访问域名就会出现 NoSuchBucket。因此可以登录自己的阿里云账号,创建同样的 Bucket 即可。
在阿里云下,当 Bucket 显示 NoSuchBucket 说明是可以接管的,如果显示 AccessDenied 则不行。
这里我自己添加了一个解析。如果是bucket存在则是AccessDenied。管理员删掉了这个bucket。然后我们自己建立一个同名bucket
可以通过nslookup获得bucket的名称。最后我们自己创建一个同名bucket去接管这个子域名。
2.7 Bucket 可修改
如果拥有 Bucket Policy 的编辑权限,可以通过上传或修改一个新的配置,进而实现攻击(拒绝服务或者修改访问策略)
可以通过直接 PUT 一个配置,达到攻击的目的。
aliyun oss bucket-policy oss://yang999public --method put ./oss.json