不同的厂商对对象存储的叫法有些不同,但从功能使用者角度来看,其实都是一回事。
阿里云:OSS 腾讯云:COS 华为云:OBS
谷歌云:GCS 微软云:Blob 亚马逊云:S3
因为阿里云可免费试用3个月的OSS存储,以下讲解均以阿里云OSS存储为例。
在阿里云上开通OSS存储,阿里云可以免费试用一段时间的OSS存储
开通后,OSS存储控制台在左上方菜单栏中
然后就可以创建Bucket
在此之前,简单介绍一下OSS存储的几个概念
首先给大家介绍一下Bucket,Bucket是用户用来管理所存储Object的储物空间。每个用户可以拥有多个Bucket。Bucket的名称在OSS的范围内必须是全局唯一的,一旦创建之后无法修改名称。Bucket内部的Object数目是没有限制的。用户可以简单的把Bucket理解为本地电脑的一个文件夹。
对象是OSS存储数据的基本单元,也被称为OSS的文件。和传统的文件系统不同,对象没有文件目录层级结构的关系。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的Key来标识。对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。对象的生命周期是从上传成功到被删除为止。在整个生命周期内,除通过追加方式上传的Object可以通过继续追加上传写入数据外,其他方式上传的Object内容无法编辑。用户可以把Object简单理解为文件夹中的文件。
Region表示OSS的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的Region访问速度更快。Region是在创建Bucket的时候指定的,一旦指定之后就不允许更改。该Bucket下所有的Object都存储在对应的数据中心,目前不支持Object级别的Region设置。
Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同的Region的时候,需要不同的域名。通过内网和外网访问同一个Region所需要的Endpoint也是不同的。例如杭州Region的外网Endpoint是http://oss-cn-hangzhou.aliyuncs.com,内网Endpoint是http://oss-cn-hangzhou-internal.aliyuncs.com。
AccessKey简称AK,指的是访问身份验证中用到的AccessKey ID和AccessKey Secret。OSS通过使用AccessKey ID和AccessKey Secret对称加密的方法来验证某个请求的发送者身份。AccessKey ID用于标识用户;AccessKey Secret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。
AccessKey包含以下三种:
Bucket的拥有者申请的AccessKey。
被Bucket的拥有者通过RAM授权给第三方请求者的AccessKey。
被Bucket的拥有者通过STS授权给第三方请求者的AccessKey。
存储空间(Bucket)是存储对象(Object)的容器。对象都隶属于存储空间,存储空间的访问权限(ACL)有以下三类:
访问权限 | 描述 | 访问权限值 |
私有 | 存储空间的拥有者和授权用户有该存储空间内的文件的读写权限,其他用户没有权限操作该存储空间内的文件。 | Aliyun::OSS::ACL::PRIVATE |
公共读 | 存储空间的拥有者和授权用户有该存储空间内的文件的读写权限,其他用户只有该存储空间内的文件的读权限。请谨慎使用该权限。 | Aliyun::OSS::ACL::PUBLIC_READ |
公共读写 | 所有用户都有该存储空间内的文件的读写权限。请谨慎使用该权限。 | Aliyun::OSS::ACL::PUBLIC_READ_WRITE |
在上传文件(Object)时未指定文件的ACL,则文件的ACL均默认继承Bucket ACL。故申请OSS Bucket一般禁止申请公共读写。公共读写意味着互联网上任何用户都可以对该Object进行访问,并且向该Object写入数据。这有可能造成数据的外泄以及费用激增,若被人恶意写入违法信息还可能会影响公司商誉。
如果想加速文件访问,可以配置OSS 私有Bucket回源。但需要注意,开启OSS私有Bucket回源授权后,即授权CDN对你所有Bucket的只读权限,不只是对当前Bucket授权。
实例演示:
创建一个私有的Bucket
点击刚刚创建的Bucket,上传一个文件测试
选择扫描文件,进行文件上传
设置文件元数据
上传成功后,可在文件列表中进行查看。点击详情即可查看文件访问链接地址
当我们访问文件地址的时候,此时就会出现拒绝访问
公共读Bucket
当我们将Bucket设置成公共读的时候,即浏览器就可以直接读取文件内容
设置路径如下图所示
文件设置为公共读
在这里有个问题,我看网上的访问文件地址,都是在浏览器上直接显示,而我设置后,就直接能下载文件,目前还不知道原因是什么。
公共读写Bucket
当权限设置为公共读写时候,此时可通过PUT方法上传任意文件。
正常访问读取文件如下:
将请求方法改成PUT,然后上传文件
返回200 说明上传成功,此时我们可以从OSS控制台看到上传的文件。
文件遍历
OSS存储里面有种类似列目录的漏洞,会显示当前存储下所有的文件存储路径。
实例演示:
首先点击权限控制,Bucket策略授权 新增授权
选择 授权所有账号,只读包含(ListObject操作)
然后我们在文件列表这边,新建两个文件夹,并上传一些文件上去
然后访问域名,就会发现所有文件列表。
注:OSS存储域名命令规则一般是 [Bucket名称].oss-cn-[地域].aliyuncs.com
然后我们就可以拼接路径,访问Bucket下的目录及文件。
从上面的实例演示可以看出,权限配置错误一般有以下三种风险:
公共读或公共读写:可完整访问但不显示完整结构
权限Bucket授权策略:设置ListObject显示完整结构
权限Bucket读写权限:公共读写直接PUT文件任意上传
正常情况下OSS存储是不解析存储的文件的,比如上传一个html文件,访问是直接下载,而非展示出html文件解析后的页面。当Bucket配置域名绑定后,直接访问域名,即可解析html文件。
域名绑定:
由于域名备案要买服务器或者花钱买备案码,后面的就演示不下去了。
直接文字说说吧。
如果域名绑定成功后,直接访问绑定的域名,就相当于直接访问OSS存储。比如你Bucket下存在一个xxx.html, 直接访问绑定的 域名/xxx.html,就可以直接解析html文件。
这样设置本身是没有漏洞的,但如果用户设置了域名绑定,但后来由于某种原因将OSS存储中的Bucket删除了,域名绑定没有删除,此时就会出现网站接管漏洞。
攻击者可以选择在原来的区域,新建一个一样的Bucket。这样原来绑定的域名就会解析到攻击者创建的Bucket上。
去网上搜一个访问显示NoSuchBucket的网站
然后去阿里云存储桶重新创建一个与HostID一样的存储桶名称
之后随便上传一个文件,就可以让该域名显示我们上传的任意文件
如果不知道Bucket怎么办?走投无路的情况下,可以尝试进行爆破。获得 Bucket 名称,这有些类似于目录爆破,只不过目录爆破一般通过状态码判断,而这个通过页面的内容判断。
当 Bucket 不存在时有两种返回情况,分别是 InvalidBucketName 和 NoSuchBucket
当 Bucket 存在时也会有两种情况,一种是列出 Object
另一种是返回 AccessDenied
这样通过返回内容的不同,就可以进行 Bucket 名称爆破了,知道 Bucket 名称后,Key 的爆破也就很容易了。
访问密钥AccessKey(简称AK)是阿里云提供给阿里云用户的永久访问密钥,用于通过开发工具(API、CLI、SDK、Cloud Shell、Terraform等)访问阿里云时的身份验证,不用于控制台登录。
其他厂商也有,可能叫法不一样。获取到这些信息后,是可以用官方工具或者网上别人开发的利用工具接管OSS存储的。
下一篇文章再详细讲一下控制台接管。
下面介绍一下,其他厂商的AccessKey如何查找。
亚马逊云计算服务 (Amazon Web Services, AWS) 的 Access Key 开头标识一般是 "AKIA"。
^AKIA[A-Za-z0-9]{16}$
Access Key ID: 20个随机的大写字母和数字组成的字符,例如 AKHDNAPO86BSHKDIRYTE
Secret Access Key ID: 40个随机的大小写字母组成的字符,例如 S836fh/J73yHSb64Ag3Rkdi/jaD6sPl6/antFtU(无法找回丢失的 Secret Access Key ID)。
Google Cloud Platform (GCP) 的 Access Key 开头标识一般是 "GOOG"。
^GOOG[\w\W]{10,30}$
服务账号的JSON文件中包含了Access Key和密钥的信息,其中Access Key为client_email,其长度不固定,由字母、数字和特殊字符组成。
密钥(Key)的长度为256个字符,由字母、数字和特殊字符组成。
Microsoft Azure 的 Access Key 开头标识一般是 "AZ"。
^AZ[A-Za-z0-9]{34,40}$
Azure AD Application的Client ID通常用作Access Key,长度为36个字符,由字母和数字组成。
对于Azure AD Application的密钥(Secret),长度为44个字符,由字母、数字和特殊字符组成。
IBM 云 (IBM Cloud) 的 Access Key 开头标识一般是 "IBM"。
^IBM[A-Za-z0-9]{10,40}$
Oracle云 (Oracle Cloud) 的 Access Key 开头标识一般是 "OCID"。
^OCID[A-Za-z0-9]{10,40}$
阿里云 (Alibaba Cloud) 的 Access Key 开头标识一般是 "LTAI"。
^LTAI[A-Za-z0-9]{12,20}$
Access Key ID长度为16-24个字符,由大写字母和数字组成。
Access Key Secret长度为30个字符,由大写字母、小写字母和数字组成。
腾讯云 (Tencent Cloud) 的 Access Key 开头标识一般是 "AKID"。
^AKID[A-Za-z0-9]{13,20}$
SecretId长度为17个字符,由字母和数字组成。
SecretKey长度为40个字符,由字母和数字组成。
华为云 (Huawei Cloud) 的 Access Key 开头标识一般是 "AK"。
^AK[\w\W]{10,62}$
Access Key ID长度为64个字符,由字母、数字和特殊字符组成。
Secret Access Key长度为44个字符,由字母、数字和特殊字符组成。
百度云 (Baidu Cloud) 的 Access Key 开头标识一般是 "AK"。
^AK[A-Za-z0-9]{10,40}$
京东云 (JD Cloud) 的 Access Key 开头标识一般是 "AK"。
^AK[A-Za-z0-9]{10,40}$
UCloud (UCloud) 的 Access Key 开头标识一般是 "UC"
^UC[A-Za-z0-9]{10,40}$
青云 (QingCloud) 的 Access Key 开头标识一般是 "QY"。
^QY[A-Za-z0-9]{10,40}$
金山云 (Kingsoft Cloud) 的 Access Key 开头标识一般是 "KS3"。
^KS3[A-Za-z0-9]{10,40}$
联通云 (China Unicom Cloud) 的 Access Key 开头标识一般是 "LTC"。
^LTC[A-Za-z0-9]{10,60}$
移动云 (China Mobile Cloud) 的 Access Key 开头标识一般是 "YD"。
^YD[A-Za-z0-9]{10,60}$
中国电信云 (China Telecom Cloud) 的 Access Key 开头标识一般是 "CTC"。
^CTC[A-Za-z0-9]{10,60}$
AccessKey泄露,一般都是APP,小程序,JS中泄漏导致。实战案例可参考我之前发的文章
【微信小程序渗透测试】小程序抓包及反编译通杀方法,附漏洞挖掘案例
参考:
https://wiki.teamssix.com/CloudSecurityResources/
https://zhuanlan.zhihu.com/p/566350805