buu-[HFCTF2020]JustEscape wp
这是一道Node,js沙盒逃逸的题目,根据大佬们的wp做的,记录一下做题的过程以及学习到的相应的知识点
信息查看
打开环境:
可以看到里面有一些提示,比如说 真的是php吗
打开/run.php进行查看发现里面有一个eval()函数
这个函数除了php中有,Node.js中也含有这个函数,结合提示信息推测应该是Node.js。于是尝试利用Error().stack来进行查看
页面回显了一堆报错信息
根据这些信息可以推断这道题目是一个vm的沙盒逃逸
那么接下来把demo的那个请求参数放到url中进行查看。
发现没有回显,那么推测就是可能有黑名单检测机制,尝试输入其他的node.js语句,发现一下字符串被列入了黑名单
- '
- "
- +
- process
- constructor
- exec
bypass 黑名单机制
首先是单引号或者双引号,我的代码需要用到它们,但都被禁用了,我选择用 `` 代替单双引号声明字符串。
process、constructor 和 exec 都是被用于命名方法或者属性的标识符,它们本身不是字符串,但是由于在 JavaScript 中,除了可以通过 . 访问属性和方法,还可以通过中括号 [] 访问,中括号里面是方法或属性的字符串名称
对于黑名单中的字符串我们可以用concat连接字符串
绕过的形式类似于a[proces
.concat(s
)]
绕过沙盒执行系统的命令
根据之前的Error().stack报错信息进行查看发现vm2的模块
在snyk网站上找到poc
根据之前得到得到各种信息在本地进行一下修改
主要是将黑名单的字符串进行了修改。修改完成之后将代码复制到地址栏中访问
这样就得到了flag
总结
根据这道题目学会了沙盒逃逸的一些简单的知识点,以及一些js的知识Javascript声明字符串的几种方式:
- 单引号 '
- 双引号 "
- 反引号 `
- Buffer.form()
- 正则表达式,然后 toString() 得到字符串,再 substring() 去掉左右的 /,例如: /apple/.toString().substring(1,6)
JavaScript拼接字符串的方式:
- 加号 +
- String.concat()方。如'pronces.concat('s')
JavaScript可以用点号或者中括号访问属性的方法:
- this.constuctor
- this['constructor']
Error 对象的 stack 属性可以返回调用栈,包括程序文件的路径,利用这点查看用的哪个沙盒模块。
其他的知识点暂时需要深入学习。