vm是nodejs实现的一个沙箱环境,但是官方文档并不推荐使用vm来运行不可信任的代码,vm2则是一个npm包,在vm的基础上,通过es6新增的代理机制,来拦截对外部属性的访问。
vm
vm2是在vm的基础上实现的沙箱,所以内部调用的还是vm的API,在vm中运行一个沙箱环境:
相应的代码:
1 |
const vm = require('vm'); |
将代码编译为 script,然后创建一个上下文 vm.createContext(context) ,最后我们将编译好的脚本放在一个上下文中运行 script.runInContext
当然也可以不用那么麻烦,直接在沙箱中运行一段代码
1 |
const vm = require("vm"); |
如果不提供上下文变量,那么vm会自己创建一个隔离的上下文context。
显而易见,vm中最关键的就是 上下文context ,vm能逃逸出来的原理也就是因为 context 并没有拦截针对外部的 constructor 和__proto__
等属性 的访问
vm2
vm2相比vm做了很大的改进,其中之一就是利用了es6新增的 proxy 特性,从而拦截对诸如 constructor 和 __proto__
这些属性的访问
在vm2 中运行一段代码,如下
1 |
const {VM, VMScript} = require("vm2"); |
其中 VM 是vm2在vm的基础上封装的一个虚拟机,我们只需要实例化之后调用 run 方法即可运行一段脚本。
运行的代码和vm2对应的实现:
例题
[HFCTF2020]JustEscape
假的PHP
1 |
<?php |
输入Error().stack
1 |
run.php?code=Error().stack |
报vm2错误
1 |
Error at vm.js:1:1 at Script.runInContext (vm.js:131:20) at VM.run (/app/node_modules/vm2/lib/main.js:219:62) at /app/server.js:51:33 at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) at next (/app/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) at /app/node_modules/express/lib/router/index.js:281:22 at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12) |
https://github.com/patriksimek/vm2/issues/225
fuzz 一下,有 for, while, process, exec, eval, constructor, prototype, Function, 加号, 双引号, 单引号被过滤了。
可以利用字符串拼接和数组调用(对象的方法或者属性名关键字被过滤的情况下可以把对象当成一个数组,然后数组里面的键名用字符串拼接出来)的方式来绕过关键字的限制,但注意到单双引号和加号同时被过滤了,我们想要直接输入字符串拼接的话似乎也行不通了。这里我们可以利用反引号来把文本括起来作为字符串 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/template_strings,同时我们也可以利用模板字符串嵌套来拼接出我们想要的被过滤了的字符串。
比如这里 prototype 被过滤了,我们可以这样书写
1 |
`${`${`prototyp`}e`}` |
这样就可以拼接出一个 prototype 字符串,最后payload
1 |
(function (){ |
读取一下题目的源码
server.js
1 |
const express = require('express'); |
参考文章:
vm2实现原理分析
vm2沙箱逃逸分析
https://es6.ruanyifeng.com/?search=weakmap&x=0&y=0
FROM :blog.cfyqy.com | Author:cfyqy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论