0x01 起因

前两天和朋友聊天,他发现了一家在hackerone上赏金颇高的Program,并且发现了其中的漏洞

让老夫羡慕不已

image-20230316093850240

去hackerone看了看厂商信息,漏洞奖励确实是非常诱人的

而且BugBounty Program Launched on Apr 2015….

8年hackerone的老厂商了,业务点本来就不多,又被世界各国牛逼的黑客们挖了八年,难度可想而知

image-20230316094052559

但是为了赏金迎难而上,才应该是真正的漏洞猎人该有的风格。

0x03 走业务点万念俱灰到发现敏感请求

从Hackerone的Program scope中搜集了一下业务信息,虽然展开测试

测试了常规的一些WEB漏洞,IDOR等漏洞,发现完全没有一点机会,Filter和鉴权写的非常过硬,而且用户都是通过uuid类型来传参进行身份鉴权

首先目标没有IDOR,其次哪怕有IDOR也非常难以利用

image-20230316094832965

image-20230316095041490

从晚上九点测到了第二天凌晨两点,啥也没测出来,万念俱灰准备洗洗睡了

但是心想还是看看Burp的HttpHistory吧,万一有自己没注意的敏感请求呢

结果没想到。。。还真就看到了一个graphql的敏感查询请求

POST /agw/graphql?op=UrlReachableVerifierQuery&client_trace_id=09bee58d-8358-4f00-acc0-8d26d0018d32,rst:1678201703792 HTTP/1.1
Host: xxxxx
Cookie: xxxx
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/110.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/json
Authorization: xxxxx
Content-Length: 386
Origin: https://xxxxx
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Te: trailers
Connection: close

{"operationName":"UrlReachableVerifierQuery","variables":{
"url":"http://xxxx.com/"},"query":"query UrlReachableVerifierQuery($url: String!) {\n  verifyUrlReachable(url: $url) {\n    ... on UrlReachableResult {\n      url\n       __typename\n    }\n    ... on GenericError {\n      errorCode\n      message\n      __typename\n    }\n    __typename\n  }\n}\n"}

url在json中传参,测啥漏洞,我想大家应该都懂

立马用Burp的Collaborator测试dnslog

image-20230316095750418

果不其然,收到了来自两个IP的Http Request,但是目标的回显少的可怜

只有url,__typename两个键的JSON返回了回来

image-20230316100032084

查了一下,两台发送请求的服务器都部署在GoogleCloud,瞬间就让人兴奋了起来

image-20230316100318112

但是想了一下又萎了,GoogleCloud meta data(元数据)的获取不像国内的某某云,其必须带有特定的Header

这个SSRF点既没有回显也没法通过构造恶意页面的js发送带有header的数据,真是操蛋

request example:

curl "http://metadata.google.internal/computeMetadata/v1/instance/image" -H "Metadata-Flavor: Google"

image-20230316100749756

思前想后,寻思也算个盲SSRF,先交了再说

0x04 秒忽略NoBugBounty到利用Graphql发掘新的攻击面

交完这个盲SSRF点,睡了一觉起来,发现直接被厂商的安全团队给忽略了

image-20230316101227267

真是操蛋,盲SSRF看样不太行,混不到钱,我们必须得发掘新的攻击面

(不了解Graphql的兄弟可以看下下面这张图,生动地解释了Restful类型接口和Graphql接口的区别,上方为restful接口请求样式,下方为graphql的接口请求样式)

image-20230316102800443

image-20230316102729116

既然这个点是基于Graphql进行查询的

那么我们可以自定义查询的column(param),如果存在该column,那么就会返回这个参数的有效结果,二话不说开始FUZZ

image-20230316102014491

最终结果让人非常寒心,啥勾八东西也没有(这里当时的图忘存了)

再次陷入万念俱灰,但是仔细观察graphql查询请求的op参数,让我有了一点想法

image-20230316102242146

op字段为UrlReachableVerifierQuery,我们为啥不试试拿他当query的column呢?

结果发现测试到UrlReachable这个字段时,reponse中出现了有效回显”Reachable”

image-20230316103133250

nice,现在我们可以用这个接口来探测内网端口开放情况了

我直接使用GoogleCloud的meta data地址来探测端口连通性

没想到直接告诉我了个”Not_Reachable”。。

image-20230316103324813

那么就得用点方法绕过了

0x05 绕过SSRF限制探测内网

试了试302跳转,短连接等方式,都不好使

于是寄出dns rebinding

在ceye上配置好dns rebinding的IP地址(googleCloud meta data的ip地址为169.254.169.254,借此来验证内网连通性)

image-20230316103545120

直接dns rebinding来绕过SSRF限制

image-20230316103640166

发现我们成功获得了“Reachable”的结果!

接下来就是常规操作了,探测端口连通性

image-20230316103901683

image-20230316104112068

80端口reachable,其他端口Not_Reachable,已经证明了此处SSRF可探测内网

0x06 再次提交漏洞到triage与bounty

再次提交后漏洞得到了Triage

image-20230316104214787

triage的severity为medium

最终bounty按照low发的

image-20230331183101311

仍在交涉中,估计是大写的寄