1. 首页
  2. 代码审计

nodejs审计基础篇1

【推荐学习】暗月渗透测试培训 十多年渗透经验,体系化培训渗透测试 、高效学习渗透测试,欢迎添加微信好友aptimeok 咨询。

内容不多,参考链接难得过多的梳理,不懂得多看看参考链接自己去复现

参考链接

https://www.sohu.com/a/203989631_354899

https://xz.aliyun.com/t/11791

靶场

https://github.com/cr0hn/vulnerable-node

nodejs前置基础

nodejs 基础教程

https://www.runoob.com/nodejs/nodejs-install-setup.htmlhttps://www.nhooo.com/nodejs/express-js-tutorial.html

常用命令整理

npm install module  --registry=https://registry.npmmirror.com //本地安装module npm list -g 查看安装的全局模块npm list grunt 查看grunt模块的版本号npm uninstall express 卸载express模块npm ls 查看某个模块是否存在npm update express 更新express模块npm search express 搜索express模块npm cache clean  清除缓存

nodejs路由

https://www.runoob.com/nodejs/nodejs-router.html 原生的路由仅做了解,目前基本倾向于框架开发

常用文件&&文件夹

package.json     定义了包的属性,可以理解为maven中的pom.xml,在此文件下npm install可以安装依赖router.js        里面一般定义了一些路由文件node_modules:  依赖的模块包app.js          主文件

tips

global 全局对象,引用的时候不需要包含console.log() 控制台打印调试信息

nodejs web

https://www.runoob.com/nodejs/nodejs-web-module.html

Express 框架

https://www.runoob.com/nodejs/nodejs-express-framework.html

常用

路由app.post("路径","函数") 根据路径调用相对应的函数路由器https://www.nhooo.com/nodejs/express-js-router.html文件app.use('/public', express.static('public')); 设置静态文件路径为public下面数据库https://www.runoob.com/nodejs/nodejs-mysql.htmlhttps://www.runoob.com/nodejs/nodejs-mongodb.html模块作用域(解决两个js模块下同名变量的问题,防止互相污染)https://blog.csdn.net/yezhihaobk/article/details/125225290exports 将当前的模块共享出去,但是module.exports为最高权限的共享module.exports 将当前js的某个模块共享出去 require包含的js就是module.exports 共享出去的对象

文件结构分析

(1)后端的文件,具体的项目具体看,一般可以看server,app文件夹等下面,存在controller等很明显路由字眼的属于后端处理文件(2)前端文件,一般也就是静态文件一类的,public等等(3)项目依赖 /node_modules(4)一些启动文件,如app.js等等,mvc的还是需要从主文件跟进去,可能有一些拦截器,过滤器之类的。下面用yapi的文件路径来截图说明,而我们主要看的是后段的文件

nodejs常见漏洞

sql注入

node一般配合mongodb,mysql的数据库,mongodb的注入可以看一下这篇文章 https://cloud.tencent.com/developer/article/1602092其他的都是直接看有没有参数直接带入了sql查询如下:let sql=`select * from user where id= ${req.params.id}`;db.query(sql);

xss

和普通web类似,没有做任何处理直接将数据返回给前端app.get(‘/xss’,function(req,res) {res.send(req.query.q);})

ssrf

和其他的类似,传入的地址由服务端直接进行请求

命令&&代码执行

直接执行javascript的代码

eval(require('child_process').exec('open /System/Applications/Calculator.app/Contents/MacOS/Calculator'))setInteval(require('child_process').exec('open /System/Applications/Calculator.app/Contents/MacOS/Calculator'), 2000)setTimeout(require('child_process').exec('open /System/Applications/Calculator.app/Contents/MacOS/Calculator'), 2000)

文件上传

node的文件上传,不能直接被解析执行命令,也就是常规情况不能一键getshell,一般需要跨目录配合其他的问题进行进一步的利用。

原型链污染

这一块有点难,有兴趣专门做这一块可以好好研究一下https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chainhttps://blog.csdn.net/qq_61209261/article/details/125821976https://xz.aliyun.com/t/10809

沙箱逃逸

https://xz.aliyun.com/t/11859vm模块原理:由于作用域的不同,非全局变量如果放在不同的作用域中隔离开来,也就是实现了变量之间的相互隔离,也就是vm的原理。vm模块vm.runinThisContext(code)  在当前上下文创建一个作用域,code为我们执行的nodejs代码vm.createContext([sandbox]) 在当前上下文外创建一个对象沙箱逃逸的原理 将global的命令执行对象引入到当前的沙箱中

依赖包检查

npm i nsp 安装npsnsp check 检查依赖包中的漏洞 类似于直接检查maven中第三方组件的漏洞

总结

对于沙箱逃逸,原型链污染的这一块,基本是特定环境会用上的,所以平时了解就好,有需要的时候进行深入研究

实战之cms分析

yapi

安装

mac环境

https://nodejs.org/dist/v14.1.0/ 下载地址mongo 采用docker 搭建4.4.1 docker pull mongo:4.4.1中间报错按照https://github.com/YMFE/yapi/issues/16解决,node,mongo一定装低版本,不然会有奇怪的错误,环境搭建如下

app.js

主要是定义了一些启动项的一些配置参数之类的

router.js

定义了一些路由相关的模块等,同时限制了一些请求的类型,需要get或者post等等

/server/controllers

这里面就是一些路由相关的访问了,是我们必须看的掌握的,审计非原生组件最重要的我个人理解为就是utils(工具类,某个方法出问题要打一堆),路由类(确定漏洞的触发位置)

yapi注入浅析

前端时间yapi爆了一个注入,今天就简单的看一下过程,是token出的问题,我们根据补丁位置来分析,限制了token的类型必须为string

我们本地看存在漏洞的代码,原本是怎么样,这里是没有对token进行类型限制的

阅读一下的代码,发现了

持续跟进,最终到了这里

虽然我们不太懂nodejs的具体的数据库查询,但是凭借经验也能看到,这里直接把token带入了查询,那么配合之前看的mongodb的注入,很容易能想到大概是json格式触发的注入了,然后看一下前置条件,很容易就能构造出来一个跑注入的路径和poc了。当然因为是tool里面的方法有问题,所以触发的地方可能不止一个点。

结果如下,通过mongodb盲注,让服务器爆不一样的错误,验证注入,存在的时候服务器出错,不存在直接400

目前只是复现了,但是还有几个关键点没来及看,关于token的利用等等。主要是通过一个洞学习一下叭

原创文章,作者:moonsec,如若转载,请注明出处:https://www.moonsec.com/7890.html

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息