buu-[HFCTF2020]JustEscape wp

这是一道Node,js沙盒逃逸的题目,根据大佬们的wp做的,记录一下做题的过程以及学习到的相应的知识点

信息查看

打开环境:

可以看到里面有一些提示,比如说 真的是php吗

打开/run.php进行查看发现里面有一个eval()函数

这个函数除了php中有,Node.js中也含有这个函数,结合提示信息推测应该是Node.js。于是尝试利用Error().stack来进行查看
页面回显了一堆报错信息

根据这些信息可以推断这道题目是一个vm的沙盒逃逸

那么接下来把demo的那个请求参数放到url中进行查看。

发现没有回显,那么推测就是可能有黑名单检测机制,尝试输入其他的node.js语句,发现一下字符串被列入了黑名单

  1. '
  2. "
  3. +
  4. process
  5. constructor
  6. exec

bypass 黑名单机制

首先是单引号或者双引号,我的代码需要用到它们,但都被禁用了,我选择用 `` 代替单双引号声明字符串。

process、constructor 和 exec 都是被用于命名方法或者属性的标识符,它们本身不是字符串,但是由于在 JavaScript 中,除了可以通过 . 访问属性和方法,还可以通过中括号 [] 访问,中括号里面是方法或属性的字符串名称

对于黑名单中的字符串我们可以用concat连接字符串

绕过的形式类似于a[proces.concat(s)]

绕过沙盒执行系统的命令

根据之前的Error().stack报错信息进行查看发现vm2的模块

在snyk网站上找到poc

根据之前得到得到各种信息在本地进行一下修改

主要是将黑名单的字符串进行了修改。修改完成之后将代码复制到地址栏中访问

这样就得到了flag

总结

根据这道题目学会了沙盒逃逸的一些简单的知识点,以及一些js的知识

Javascript声明字符串的几种方式:

  1. 单引号 '
  2. 双引号 "
  3. 反引号 `
  4. Buffer.form()
  5. 正则表达式,然后 toString() 得到字符串,再 substring() 去掉左右的 /,例如: /apple/.toString().substring(1,6)

JavaScript拼接字符串的方式:

  1. 加号 +
  2. String.concat()方。如'pronces.concat('s')

JavaScript可以用点号或者中括号访问属性的方法:

  1. this.constuctor
  2. this['constructor']

Error 对象的 stack 属性可以返回调用栈,包括程序文件的路径,利用这点查看用的哪个沙盒模块。

其他的知识点暂时需要深入学习。


buu-[HFCTF2020]JustEscape wp
https://sakula33.github.io/2025/01/24/sandbox/
作者
sakula33
发布于
2025年1月24日
许可协议