通武廊 WEB 2
前阵子 搞了个题玩玩,我超威,大家的 AI 都这么强。说一下 web 2 吧
这道题
AUV 这么邪乎

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

理由 2

访问下 static 看看

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

嘿,还没 fuzz 呢,伙计,你看我发现了什么。多发几次,发现后端返回随机的值并且没次 flag 不一样。
这里的 flag 一看这么长,感觉是不是考啥解密之类的?fuzz 半天 发现和加密没关系
dir 也梭哈完了,扫到一个路由

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


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

丫挺的,是张图片
别问我怎么精准知道的路径,前端搜下就看到了



首先是存在沙箱逃逸,其次是可以通过 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}