漏洞挖掘365天挑战——Day032:漏洞报告学习之Full Response SSRF via Google Drive

报告:https://hackerone.com/reports/1406938

writeup: https://github.com/httpvoid/writeups/blob/main/Hacking-Google-Drive-Integrations.md

作者的意思是说,2019年作者挖过一个类似的洞,就是Vimeo 获取gdriver文件的流程。主要是怎么使用API来请求。

然后2022年,他在Dropbox也复现了。

集成Google Drive的流程

我在Google Drive上看到,很多程序其实是集成了gdrive的。 那怎么集成gdrive呢?

三种方式:

  1. 客户端嵌入
  2. 客户端获取URL,然后服务端下载
  3. 通过Gdrive API 获取服务端的文件

这里是第三种的方式出现了问题。

#List images from Gdrive

@app.route('/cloud/gdrive/list')
def list_files():
    token = request.args.get('access_token')
    html = ""
    if token:
      r = requests.get('https://www.googleapis.com/drive/v2/files/',headers={'Authorization': 'Bearer '+token})
      resp = json.loads(r.text)
      print(resp)
      for file in resp['items']:
        if file['mimeType'].startswith('image/'):
          html += "<a href='/cloud/gdrive/fetch?file_id="+file['id']+"&access_token="+token+"'>"+file['title']+"</a><br>"    
      return "Select Gdrive image (max 1mb) to fetch <br><br>" + html

    else:
      return "Error"

#Render provided image id from gdrive

@app.route('/cloud/gdrive/fetch')
def fetch_gdrive_video():
    token = request.args.get('access_token')
    file_id = request.args.get('file_id')
    if token and file_id:
      try:
        r = requests.get('https://www.googleapis.com/drive/v2/files/'+file_id,headers={'Authorization': 'Bearer '+token})
        download_url = json.loads(r.text)['downloadUrl']
        d = requests.get(download_url,headers={'Authorization': 'Bearer '+token})
      except Exception as e:
        return Response(str(e), headers={'Content-type':'text/plain'})
      return Response(d.content, headers={'Content-type':'image/png'})
    else: 
      return "Error"

看了一下,上面的代码。

有两个接口,一个是列出文件,另外一个展示图片

image

第二个接口如上的效果,你从request中得到token和file_id,然后通过带有headers验证的请求就请求内容,然后得到了下载的URL,你去请求这个URL就行了。

观察一下这个file_id,好像是很难控制的。但是,downloadUrl 是我们从JSON里面解析出来的。

看看文档:

image

我去google的文档上看了一下,链接:https://developers.google.com/drive/api/v3/manage-downloads#python

意思是说,alt=media 是一个系统参数。如果你使用客户端库的话,就不要用这个参数。

那如果在客户端请求这个参数会出现什么呢?

  1. 创建一个payload.txt
  2. 将相同的文件JSON放在文件中
  3. 将downloadUrl改成你的URL
  4. 使用alt=media来请求:格式 file_id =fileId? alt = media & access_token = abcdef
  5. 恶意JSON被解析,服务器点击我们构造的URL
  6. 导致了SSRF

image

这里我还是有点看不明白,加了alt=media,是不是,会去读文件的内容?

不需要alt=media

很多公司会把doc,slides和sheets都放到google dirve上

PUT /gdrive/import/ HTTP/2
Host: redacted.com
...

{"fileId":"gdrive_file_id","fileName":"testest","authToken":"gdrive_auth_token","fileType":"slides"}

这里就因为不能添加alt=media这种参数遭受攻击,但是可以使用下面的查询来攻击

PUT /gdrive/import/ HTTP/2
Host: redacted.com
...

{"fileId":"test","fileName":"test","authToken":"x\r\nSSRF:http://rce.ee/aaaaazzzzza\r\nConnection:keep-alive\r\n\r\nGET /drive/v2/files/1XfY_BqdWT-UWM2CNivW1lSR2GhRCizdJ?alt=media HTTP/1.1\r\nHost:www.googleapis.com\r\nAuthorization: Bearer REDACTEDr\n\r\n","fileType":"slides"}

在authToken中添加一个HTTP头和一个请求,这样就可以成功控制URL

确实云服务的hacking,越来越重要了。而且我们应该去通读云服务的文档,然后寻找弱点。

漏洞挖掘365天挑战——Day032:漏洞报告学习之Full Response SSRF via Google Drive”的一个响应

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 注销 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 注销 /  更改 )

Connecting to %s