Webhacking.kr g00gle1

Challenge

题目跳转到一个公开的 Google Form,目标是检查浏览器实际加载的页面源码和脚本,从客户端数据中找到 flag。

题目入口:

1
https://forms.gle/P2uTaZw9252V59L86

Solution

在 chall.php 中找到 g00gle1 后,入口链接指向 Google Form。展开短链接后,实际页面为:

1
https://docs.google.com/forms/d/e/1FAIpQLSd5S_aJDd8jMiGEpabw1l4NCObP-4Zwdd5l0uAQU5NElpsrCw/viewform

页面标题为 g00gle1。表单看起来只需要选择 yes 或 sure,但提交表单不是必要步骤。题目的有效信息已经随 HTML 和 inline JavaScript 发送到浏览器。

使用 View page source,或者在开发者工具的 Sources 面板中搜索 FLAG{,可以在页面内联脚本的 FB_PUBLIC_LOAD_DATA_ 数据中看到完整题面和 flag。实际源码中对应的结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var FB_PUBLIC_LOAD_DATA_ = [
null,
[
null,
[
[
46995807,
"Do you want flag?",
null,
4,
[[1748584378, [["yes", null, null, null, 0], ["sure", null, null, null, 0]], 1]]
]
],
[
"ok. here is what you want. FLAG{how_can_i_pwn_googl3?}",
1,
0,
1,
0
],
null,
null,
[null, 0],
null,
[1, ""],
"g00gle1"
]
];

关键数据位于 FB_PUBLIC_LOAD_DATA_ 的表单初始化数据中。它同时包含表单问题、选项和提交后显示的文本;因此仅检查表单渲染后的可见控件可能遗漏 flag。

也可以在浏览器控制台中执行以下代码,筛选所有 inline script 中的 flag 字面量:

1
2
[...document.scripts]
.flatMap(script => script.textContent.match(/FLAG\{[^}]+\}/g) || [])

在当前页面中,该表达式返回题目 flag。Network 面板可以进一步确认这段数据已经包含在页面加载响应中,客户端没有额外的隐藏请求或复杂利用链。

FLAG{how_can_i_pwn_googl3?}