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