一道web题

作者:Cloud Security lab 发布:2026-09-15 17:47 收录:2026-09-16 08:30 1 次阅读 约 615 字
摘要:通武廊 WEB 2前阵子 搞了个题玩玩,我超威,大家的 AI 都这么强。
推荐理由:本文涉及「RCE」主题。

通武廊 WEB 2

前阵子 搞了个题玩玩,我超威,大家的 AI 都这么强。说一下 web 2 吧

这道题

AUV 这么邪乎

进来没啥东西,先跑个 dir 挂着,然后看看这俩路由怎么个事儿

路由 1

理由 2

访问下 static 看看

额,没看到啥。抓包放 burp 改个方法试试

嘿,还没 fuzz 呢,伙计,你看我发现了什么。多发几次,发现后端返回随机的值并且没次 flag 不一样。

这里的 flag 一看这么长,感觉是不是考啥解密之类的?fuzz 半天 发现和加密没关系

dir 也梭哈完了,扫到一个路由

阅读理解及格的我,我直接读文件试试


源码,wait wait wait 这个源码咋这么奇怪呢?咋选中不了?

丫挺的,是张图片

别问我怎么精准知道的路径,前端搜下就看到了


然后我们对 oracle.js 进行审计,交给 AI 即可

首先是存在沙箱逃逸,其次是可以通过 auth.wasm 反推出 token,最后就可以 rce 了

sink 点为 vm.Script(req.body.q).runInContext() 用户的输入会直接在 vm 中被执行

因为代码中 写了 b.constructor = Function; m.constructor = b; 所以呢 m.constructor.constructor = Function

代码中又 ctx.M = m; 最终 ctx.M.constructor.constructor 指向了宿主的真实 Function。构造出的函数会在宿主中全局执行即可拿到 proccess执行命令

Node.js 中 vm 模块的一个经典特性吧,就是用宿主的 Function 构造器创建的函数,它的执行作用域并不是 vm,而是整个 Node.js 全局作用域,所以可以沙箱逃逸

然后就是 oracle.js 中的 token 构造了,读取 auth.wasm 可以获取_R 编码表,然后 oracle.js 中的也给出了前 4 位

_M magic DE AD BE EF 然后呢就是第五个字节为 state 又因为 if (state < 2) return {r:[]} 会拦掉 所以啊第五个 token 校验的 magic 为 02 即可 所以只需要十个中文对应的下标两两组合拼成 DE AD BE EF 02 就可以执行命令 rce 了

例:字符 石 下标 13(=D),田 下标 14(=E),拼起来 (13<<4)|14 = 0xDE。

最终 token 为 “石田火石水田田人氵艹” (咋还骂人呢?)

最终呢 curl 发包执行命令就可以了(偷摸把题 down 下来了 😂)

比赛时候的答案 就是 flag{123}


转载声明:本文转载自原发布平台 (作者:Cloud Security lab), 原文标题《一道web题》, 查看原文。 版权归原作者及原发布平台所有,本站仅作收录与展示,未对正文内容作实质性修改; 若涉及侵权请联系本站处理。