环境搭建
搭建一个阿里云OSS,可以选择试用
https://www.aliyun.com/product/oss?spm=5176.28536895.nav-dropdown-menu-0.19.53dd586ckiS3OP&scm=20140722.X_data-47ed1f95c8b1f5f652d4._.V_1
访问存储桶的几种场景
这种有key id等等数据的就算成功访问了,说明该存储桶配置为了公开的,而且允许了文件路径列出 "只读(包含ListObject)"
这种是有权访问,但是文件路径不正确
403拒绝访问,这种有很多可能性:可能是没有权限访问,配置为了私有需要身份认证、文件路径不对、目前没有任何文件、特定的Bucket策略限制,后面专门详细解释。
这种是存储桶虽然是公开的,但是是该存储桶目前没有任何文件,且开启了文件列出(ListObject)权限
这种是不存在这个存储桶
这种是存储桶名无效
漏洞分析
接下来介绍几种不安全配置导致的安全漏洞:
如果配置为公共读/公共读写,那么所有人可以不用经过身份验证就可以访问存储桶的数据
oss凭证泄露
可以直接看我博客这篇文章
https://x1lys.github.io/2024/07/12/%E4%BA%91%E4%B8%BB%E6%9C%BA%E5%AF%86%E9%92%A5%E6%B3%84%E9%9C%B2/
OSS存储桶路径列出
如果配置为公共读/公共读写,且权限控制中的Bucket授权策略配置了"只读(包含ListObject)",那么访问存储桶会直接列出所有文件路径(Key),类似于Apache的目录遍历漏洞,都是配置错误的原因。那就不用爆破存储桶文件名路径了,只需提取出路径来访问就行
当文件太多,一个一个手动去拼接访问链接太慢了,可以用这个工具,提取文件的具体路径
https://github.com/source-xu/ossx
OSS爆破
如果配置为公共读/公共读写,但知道的信息很少,想得到更多的数据,还可以试试爆破来碰碰运气。
1. 存储桶名爆破
对存储桶名的爆破其实就是对子域名的爆破,因为存储桶名会被用来作为子域名,通过查看响应得知是否成功。但是其实如果都不知道目标的存储桶的名字,那么想单纯靠爆破的方式得到目标的存储桶名,几乎是不可能的,除非目标的存储桶名有规律,比如以企业名+其他标识为存储桶名的话可能还有一丝丝希望,不过也难。又但是,一般情况下,存储桶名很容易就得到了:访问存储桶的文件看子域名,查看响应包,FindSomeThing插件就可直接得到了
2. 存储桶文件名路径爆破
可以尝试一些常见的文件名比如1.pdf 1.docx test.jpg 等等,准备好字典跑就完事
说明oss配置为了私有,需要经过身份验证或者满足配置的特定Bucket策略才可以访问。还有一种可能是,该存储桶虽然是公开的,但是是你不知道文件的访问路径,或者该存储桶目前没有任何文件,且关闭了文件列出(ListObject)权限
403的场景与绕过
上图出现了403 AccessDenied,有如下几种情况:
存储桶被配置为了私有
需要带上正确的身份验证参数才能访问,这种情况直接跳过,没法利用了,除非通过泄露达到了ak sk等等身份验证数据
不知道文件路径key
这种情况是,明明存储桶是公开的,但是不知道文件路径的话,且没有开启文件列出(ListObject)权限,也会出现403 AccessDenied
这种就按照上面提到的直接爆破文件名就行
如果开启了文件列出(ListObject)权限,会是这样