Webhacking.kr g00gle2

Challenge

EN : It is hacking challenge. do "hack", do NOT request access.

这是道 hack 题,需要自己动手,不要申请访问权限。

1
https://docs.google.com/spreadsheets/d/1uCpV_9NriUEwD8ZPqPVsU02n6Hg9JitGZPinbRmmL4I/edit?usp=sharing

题目是一张公开只读的 Google 表格。A1 显示 FLAG{?????????????},flag 的中间部分被问号替换,A3 是上面那句题面。原值存放在另一张不可访问的表格里,需要取到掩码之前的字符串。

Solution

A1 里是一个公式,选中单元格即可在公式栏读到全文:

1
=REPLACE(IMPORTRANGE("https://docs.google.com/spreadsheets/d/1x7b8Wwp3jJAr6sgEG8RmuZOh-d7gpSmYvH9tmXWDq_c/edit","A1"),6,19,REPT("?",19-6))

公式分三层:

  • IMPORTRANGE(源表格, "A1") 取另一张表格 A1 的值,源表格 ID 为 1x7b8Wwp3jJAr6sgEG8RmuZOh-d7gpSmYvH9tmXWDq_c。
  • REPLACE(text, 6, 19, 替换文本) 从第 6 位起删掉 19 个字符,再插入替换文本。
  • REPT("?", 19-6) 生成 13 个问号,替换文本比被删掉的 19 个字符短 6 个字符,页面上的结果因此是 FLAG{?????????????}。

源表格无法直接读取:/edit、/htmlview、/preview、/pubhtml、/gviz/tq、/export?format=csv 均返回 401,drive.google.com/uc?id=<源表格 ID>&export=download 落到 Google 登录页。公开表格自身的 /gviz/tq?tqx=out:csv 同样只返回掩码后的单元格,常规导出无法得到原值。

掩码由表格自己计算,但 IMPORTRANGE 属于外部数据,表格客户端会单独取一次导入结果。在浏览器中打开表格,开发者工具 Network 面板过滤 fetchData,可以看到一条 POST 请求:

1
https://docs.google.com/spreadsheets/d/1uCpV_9NriUEwD8ZPqPVsU02n6Hg9JitGZPinbRmmL4I/externaldata/fetchData?id=<表格 ID>&rpwf=a&sid=<sid>&vc=0&c=0&w=0&flr=0&smv=2147483647&smb=<smb>&token=<token>&ouid=<ouid>&includes_info_params=true&usp=sharing&cros_files=false&nded=false

响应体以 )]}' 开头,是一行 JSON:键为依赖标识 {1=4,7={1=44#<源表格 ID>,2=2#A1}},值为导入范围的数据,原值以转义引号包住的形式出现在其中。

1
[1,1,null,null,null,null,null,null,null,null,[[[6,[null,null,null,[1,[[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[500,[[null,null,null,[[\"FLAG{now_i_pwned_googl3?}\"],0],1]]]]]],[]]]]]]

该请求带 token、sid 等会话参数,且只接受 POST;脱离浏览器会话重放无法取得响应数据(实测返回 400),复现需要在浏览器中观察这次加载。

恢复出的原值即题目 flag,提交到 Auth 页面即可。

FLAG{now_i_pwned_googl3?}