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?}