对象存储

GinTvT 发布于 2025-05-29 162 次阅读 安全学习 预计阅读时间: 14 分钟


云攻防

云场景攻防:公有云,私有云,混合云,虚拟化集群,云桌面等

云厂商攻防:阿里云,腾讯云,华为云,亚马云,谷歌云,微软云等

云服务攻防:对象存储,云数据库,弹性计算服务器,VPC&RAM等

云原生攻防:Docker,Kubernetes(k8s),容器逃逸,CI/CD等

对象存储:

各大厂商对于对象存储的称呼都不一样, 但是都叫对象存储

阿里云:OSS 腾讯云:COS 华为云:OBS

谷歌云:GCS 微软云:Blob 亚马逊云:S3

Bucket也就是经常说的存储桶

文件上传:

创建后, 在此处上传文件

上传完后点击该文件, 会有个地址, 通过这个地址可以直接访问

这里提示我们AccessDenied, 也就是权限被拒绝, 在修改权限之后, 我们也能读写

在对象存储中, 如果配置不当会出现一些问题

如果选择包含ListObject, 会直接显示该对象存储下的所有文件

将权限改为公共读写后, 我们可以抓包将GET改为PUT, 达到一个任意文件上传的操作

虽然我们成功上传了进去, 但是存储桶的特性就是不解析, 那么如何能够解析存储桶的文件

我们绑定域名后, 用域名访问就可以成功解析了, 但是直接通过存储桶访问还是执行的一个下载操作, 如果上传的是其他文件, 具体是下载还是其他的也就根据实际情况去操作了

如何判断网站是联动了OSS

  1. 访问网站, 出现了以下错误页面, 则网站是用到了OSS
  1. 如果ping网站的时候, 显示以下, 则网站也是用到了OSS

域名接管:

可以尝试通过桶去接管域名, 如果对方只删除了桶没有删除域名解析的话, 通过创建桶可以直接接管该域名, 存储桶不绑定账号且唯一, 双方的平台要一致, 解析亚马逊的桶也要去亚马逊创建桶

Bucket爆破:

当不知道 Bucket 名称的时候,可以通过爆破获得 Bucket 名称,这有些类似于目录爆破,只不过目录爆破一般通过状态码判断,而这个通过页面的内容判断。

当 Bucket 不存在时有两种返回情况,分别是 InvalidBucketName 和 NoSuchBucket

<font style="color:rgba(0, 0, 0, 0.85);"></font>

<font style="color:rgba(0, 0, 0, 0.85);"></font>

当 Bucket 存在时也会有两种情况,一种是列出 Object

另一种是返回 AccessDenied

<font style="color:rgba(0, 0, 0, 0.85);"></font>

这样通过返回内容的不同,就可以进行 Bucket 名称爆破了,知道 Bucket 名称后,Key 的爆破也就很容易了

AccessKeyId,SecretAccessKey泄漏:

APP,小程序,JS中泄漏导致

一般使用工具或者插件去正则匹配到泄露出来的AKSK

以下是大佬整理出来的常见AKSK特征文章:

对于云场景的渗透,现在已经层出不穷,获得AK和SK,也是云安全渗透中重要的一环。

通常,我们会在一些敏感的配置文件或者通过未授权访问、任意文件读取漏洞等方式,来寻找AK和SK。

但市面上,通过正则匹配式来寻找AK和SK的,如下:

(?i)((access_key|access_token|admin_pass|admin_user|algolia_admin_key|algolia_api_key|alias_pass|alicloud_access_key|amazon_secret_access_key|amazonaws|ansible_vault_password|aos_key|api_key|api_key_secret|api_key_sid|api_secret|api.googlemaps AIza|apidocs|apikey|apiSecret|app_debug|app_id|app_key|app_log_level|app_secret|appkey|appkeysecret|application_key|appsecret|appspot|auth_token|authorizationToken|authsecret|aws_access|aws_access_key_id|aws_bucket|aws_key|aws_secret|aws_secret_key|aws_token|AWSSecretKey|b2_app_key|bashrc password|bintray_apikey|bintray_gpg_password|bintray_key|bintraykey|bluemix_api_key|bluemix_pass|browserstack_access_key|bucket_password|bucketeer_aws_access_key_id|bucketeer_aws_secret_access_key|built_branch_deploy_key|bx_password|cache_driver|cache_s3_secret_key|cattle_access_key|cattle_secret_key|certificate_password|ci_deploy_password|client_secret|client_zpk_secret_key|clojars_password|cloud_api_key|cloud_watch_aws_access_key|cloudant_password|cloudflare_api_key|cloudflare_auth_key|cloudinary_api_secret|cloudinary_name|codecov_token|config|conn.login|connectionstring|consumer_key|consumer_secret|credentials|cypress_record_key|database_password|database_schema_test|datadog_api_key|datadog_app_key|db_password|db_server|db_username|dbpasswd|dbpassword|dbuser|deploy_password|digitalocean_ssh_key_body|digitalocean_ssh_key_ids|docker_hub_password|docker_key|docker_pass|docker_passwd|docker_password|dockerhub_password|dockerhubpassword|dot-files|dotfiles|droplet_travis_password|dynamoaccesskeyid|dynamosecretaccesskey|elastica_host|elastica_port|elasticsearch_password|encryption_key|encryption_password|env.heroku_api_key|env.sonatype_password|eureka.awssecretkey)[a-z0-9_ .\-,]{0,25})(=|>|:=|\|\|:|<=|=>|:).{0,5}['\"]([0-9a-zA-Z\-_=]{8,64})['\"]

但这是通过匹配 AccessKey 开头的内容,比如 <font style="color:rgba(0, 0, 0, 0.85);background-color:rgb(242, 243, 245);">access_token:AKID1AS893JF90AWK</font> 中 <font style="color:rgba(0, 0, 0, 0.85);background-color:rgb(242, 243, 245);">access_token</font> 这个开头来进行正则匹配的,但如果没有这样的开头呢?那我们要怎么办?

那这里我就将不同厂商的 <font style="color:rgba(0, 0, 0, 0.85);background-color:rgb(242, 243, 245);">Access Key</font> 内容特征,分别整理出来,欢迎各位师傅补充和纠错哈哈 ~

同时也能够根据不同厂商 Key 的不同特征,直接能判断出这是哪家厂商的 <font style="color:rgba(0, 0, 0, 0.85);background-color:rgb(242, 243, 245);">Access Key</font> ,从而针对性进行渗透测试。

Amazon Web Services

亚马逊云计算服务 (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

Google Cloud Platform (GCP) 的 Access Key 开头标识一般是 "GOOG"。

^GOOG[\w\W]{10,30}$
  • 服务账号的JSON文件中包含了Access Key和密钥的信息,其中Access Key为<font style="color:rgba(0, 0, 0, 0.85);background-color:rgb(242, 243, 245);">client_email</font>,其长度不固定,由字母、数字和特殊字符组成。
  • 密钥(Key)的长度为256个字符,由字母、数字和特殊字符组成。

Microsoft Azure

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 Cloud

IBM 云 (IBM Cloud) 的 Access Key 开头标识一般是 "IBM"。

^IBM[A-Za-z0-9]{10,40}$

或者是以下规则:

[a-zA-Z0-9]{8}(-[a-zA-Z0-9]{4}){3}-[a-zA-Z0-9]{12}$

Oracle Cloud

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 是20个随机大写字母和数字组成,较难用正则表达式匹配。

[A-Z0-9]{20}

百度云

百度云 (Baidu Cloud) 的 Access Key 开头标识一般是 "AK"。

^AK[A-Za-z0-9]{10,40}$

京东云

京东云 (JD Cloud) 的 Access Key 开头标识一般是 "JDC_"。

^JDC_[A-Z0-9]{28,32}

字节跳动火山引擎

字节跳动火山引擎 (Volcengine) 的 Access Key 开头标识一般是 "AKLT",长度小于256位。

^AKLT[a-zA-Z0-9-_]{0,252}

UCloud

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 开头标识一般是 "AKLT"。

^AKLT[a-zA-Z0-9-_]{16,28}

联通云

联通云 (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}$

一云通

一云通 (YiYunTong Cloud) 的 Access Key 开头标识一般是 "YYT"。

^YYT[A-Za-z0-9]{10,60}$

用友云

用友云 (Yonyou Cloud) 的 Access Key 开头标识一般是 "YY"。

^YY[A-Za-z0-9]{10,40}$

南大通用云

南大通用云 (OUCDC) 的 Access Key 开头标识一般是 "CI"。

^CI[A-Za-z0-9]{10,40}$

G-Core Labs

G-Core Labs 的 Access Key 开头标识一般是 "gcore"

^gcore[A-Za-z0-9]{10,30}$

总结

云服务,顾名思义就是云上服务,在云厂商上购买的产品服务。

国内有阿里云、腾讯云、华为云、天翼云、Ucloud、金山云等,

国外有亚马逊的AWS、Google的GCP、微软的Azure,IBM云等。

各个云厂商对云服务的叫法都不统一,这里统一以AWS为例。

S3 对象存储Simple Storage Service,简单的说就是一个类似网盘的东西

EC2 即弹性计算服务Elastic Compute Cloud,简单的说就是在云上的一台虚拟机。

RDS 云数据库Relational Database Service,简单的说就是云上的一个数据库。

IAM 身份和访问管理Identity and Access Management,简单的说就是云控制台上的一套身份管理服务,可以用来管理每个子账号的权限。

对象存储各大云名词:

阿里云:OSS 腾讯云:COS 华为云:OBS

谷歌云:GCS 微软云:Blob 亚马逊云:S3

对象存储:

权限配置错误

-公共读或公共读写:可完整访问但不显示完整结构

-权限Bucket授权策略:设置ListObject显示完整结构

-权限Bucket读写权限:公共读写直接PUT文件任意上传

域名解析Bucket接管:

Bucket存储桶绑定域名后,当存储桶被删除而域名解析未删除,可以尝试接管!

当Bucket显示NoSuchBucket说明是可以接管的,如果显示AccessDenied则不行。

AccessKeyId,SecretAccessKey泄漏:

APP,小程序,JS中泄漏导致

知识点:

1、云服务-对象存储-权限配置不当

2、云服务-对象存储-域名解析接管

3、云服务-对象存储-AccessKey泄漏

案例

案例**1:对象存储任意文件上传**

1、打开xxx.xxx.com 显示目录遍历一般肯定是公共可读写

2、 尝试获取解析oss的url地址

3、尝试对oss的url地址进行put上传

案例**2:对象存储解析域名劫持**

1、访问该域名显示NoSuchBucket,

那么只需要去阿里云存储桶重新创建一个与HostID一样的存储桶名称即可

2、随后只需要上传文件,就可以让该域名显示我们上传的任意文件

案例**3:对象存储泄漏AccessKey**

1、在JS文件中找到存在泄露的AccessKey

2、在托管平台找到存在泄露的AccessKey

3、在第三方组件配置不当导致泄露AccessKey

常见场景:/actuator/heapdump堆转储文件泄露SecretId/SecretKey

4、 在APP,小程序反编译中泄漏AccessKey

5、利用官方OSS工具连接

实战操作

fofa直接查询NoSuchBucket, 查询到后去阿里云创建存储桶

上传文件后访问, 接管成功

有域名:

直接ping域名, 可以直接拿到地址

无域名:

用xxx.oss-cn-hongkong.aliyun.com反推到xxx.com

如何反推:关注xxx, 有没有类似域名, 或者关注IP地址下是否有网站

此作者没有提供个人介绍。
最后更新于 2025-07-28