Node.js是运行在服务端的JavaScript它是一个JavaScript运行时的环境原生态js的浏览器网页源代码就是源代码Node.js的浏览器网页源代码是代码执行的结果不是源代码演示案例环境搭建-NodeJS-解析安装库安装功能实现-NodeJS-数据库文件执行安全问题-NodeJS-注入RCE原型链案例分析-NodeJS-CTF题目源码审计开发指南-NodeJS-安全SecGuide项目#环境搭建-NodeJS-解析安装库安装0、文档参考https://www.runoob.com/nodejs/nodejs-tutorial.html1、NodeJS安装官网下载即可安装后需要重新启动因为系统环境变量不会自动刷新windows以及大部分系统的终端只会在启动时读取一次path变量2、三方库安装expressexpress是一个简洁而灵活的node.js web应用框架boby-parsernode.js中间件用于处理json,row.text和url编码的数据cookie-parser这就是一个解析cookie的工具通过req.cookie可以取到传过来的cookie并把它们转成对象multernode.js中间件用于处理enctypemultipart/form-data设置表单的mime编码的表单数据mysqlnode.js 来连接mysql专用库并对数据库进行操作下载命令npm i express其他库以此类推windows powershell的执行策略限制运行.ps1脚本npm本质上就是调用npm.ps1脚本临时绕过Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process这条设置只对当前打开的终端生效关闭就恢复默认了。node .\sql.js用nodejs运行我写的sql.js文件#功能实现-NodeJS-数据库文件执行登录操作1、express开发2、实现用户登录3、加入数据库操作我们接收到前端发来的账户的密码后要进行逻辑处理但是这里报错了是为什么这是因为req.query是接收url中的参数所以就必须使用get请求前端和get路由数据库const mysql require(mysql2);//引入mysql数据库驱动 const express require(express); //从node_modules文件夹里加载你之前用npm iexpress安装好的express库把它赋给一个值这样方便后续创建实例就是后续的express const appexpress();//创建express应用实例一句话总结用express工具创建一个‘服务实例’这个实例就是你整个web服务的本体 const bodyParser require(body-parser);//是express的中间件库用来解析POST请求里的表单/json数据让你通过req.body拿到请求体中的参数 var urlencodeparser bodyParser.urlencoded({enxtend:false}) //这行代码会生成一个中间件函数这个函数就是我定义的这个变量它的作用解析POST提交的表单数据比如HTML表单默认的application/x-www-form-urlencode格式把解析好的数据放到req.body里让你在路由里用req.body.uername拿到表单值 //get路由 app.get(/login,function(req,res){ //res.send(hr登录页面/hr); const ureq.query.username;//req代表客户端发过来的请求对象req.query是express自动帮你解析的url查询字符串参数也就是网址?后面的键值对。 const preq.query.password; console.log(u); console.log(p); if(up123456){ res.send(欢迎进入后台管理页面); }else{ res.send(登录用户或密码错误); } }) /* app.get(login,...) app就是前面创建的服务实例 .get():表示监听客户端的get请求浏览器直接访问地址点击链接都是 login:路由地址也就是url里的路径部分比如我的服务跑在3000端口访问localhost:3000/login时就会触发这段代码 function(req,res){} 这是一个回调函数当请求匹配上路由时express会自动调用它 req(request):请求对象包含客户端发来的所有信息 res(response):响应对象用来给客户端返回数据 res.send(登录成功):给客户端发送响应,可以写HTML代码 */ //post路由 app.post(/login,urlencodeparser,function(req,res){ const ureq.body.username; const preq.body.password; console.log(u); console.log(p); if(uadminp123456){ res.send(欢迎进入后台管理页面); }else{ res.send(登录用户或密码错误); } }) app.get(/,function(req,res){ //res.send(hr首页页面/hr); res.sendFile(__dirname/sql.html);//express专门用来给浏览器发送完整HTML文件的方法渲染页面,__dirname就是获取当前文件的目录 }) const server app.listen(3000,function(){ console.log(web的3000端口已启动); }) /* 核心作用让express服务监听3000端口等待浏览器/客户端发起请求 */ var connection mysql.createConnection({ host:localhost, user:root, password:123456, database:demo01 }) //这段代码本质上就是给node.js程序配置好连接数据库的钥匙createconnection用来结束数据库配置返回一个数据库连接对象返回给变量 connection.connect();//.connect是发起连接的动作 const sqlselect * from admin; connection.query(sql,function(error,data){ if(error){ console.log(数据库连接失败,error) }else{ console.log(数据库连接成功) } console.log(data[0][username])//[0]是代表第几行[username]是定位取什么键值 console.log(data[1][password]) console.log(data[2][password]) }) //connection.query():用之前建立好的数据库连接去执行sql变量里的查询语句回调函数中的error如果查询过程出错这里会保存错误信息没出错是为nulldata如果查询成功这里会保存从数据库查到的结果数据文件管理const fs require(fs)//node.js自带的核心库内置模块-文件系统 const express require(express) const app express(0) app.get(/file,function(req,res){ const dir req.query.dir;//从url中取得dir的值 console.log(dir); filemanage(dir);//调用自己的函数 }) var server app.listen(3000,function(){ var host server.address().address//server.address()返回服务器的地址信息包含address和port var port server.address().port console.log(应用实例访问地址为http://%s:%s,host,port) }) function filemanage(dir){ fs.readdir(dir,function(error,files){ console.log(files); }) } // fs.readdir(./,function(error,files){ // console.log(files); // }) /* fs.readdir(path,calback):path代表选择的路径回调函数有两个参数error操作失败才会有只比如文件夹不存在、没权限files操作成功的结果是一个数组里面装着文件夹所以文件/子文件的名字 */命令执行const rce require(child_process)//这个模块就是创建子进程执行系统命令的核心模块也就是rce远程代码执行漏洞中最常见的攻击入口 //node.js 调用系统命令 rce.exec(notepad) rce.spawnSync(calc) //node.js 调用代码命令把字符串当做代码解析 eval(require(child_process).exec(calc))#安全问题-NodeJS-注入RCE原型链1、sql注入文件操作2、rce执行原型链污染3、nodejs黑河无代码分析实战测试nodejs安全判断参考前期的信息收集返回包插件等黑盒通过对各种功能和参数进行payload测试白盒通过对代码中写法安全进行审计分析-原型链污染实战中基本没有ctf中有如果攻击者控制并修改一个对象的原型__proto__那么将可以影响所有和这个对象来自同一个类、父祖类的对象// //foo是一个简单的js对象对象就是现实中的一个东西在js里就是一个对象里面可以有属性和方法 // let foo {bar:1} // //原型链污染 // //foo.bar此时为1 // console.log(foo.bar) // //修改佛欧的原型即object // foo.__proto__.bar 2//__proto__就是对象的老爹每个js对象天生都有个__proto__属性指向它的原型对象js找属性的顺序是先看对象自己身上有没有有就直接用没有就顺着原型链往上找 // //由于查找顺序的原因foo.bar仍然是1 // console.log(foo.bar) // //此时再用object创建一个空的zoo对象 // let zoo {} // //查看zoo.bar,此时bar为2 // console.log(zoo.bar) let foo {bar:1} console.log(foo.bar) foo.__proto__.bar require(\child_process\).exec(\calc\) console.log(foo.bar) let zoo {} console.log(eval(zoo.bar))#案例分析-NodeJS-CTF题目源码审计1、ctf题目https://ctf.show里面web入门中的web334看一下代码了解逻辑登录一下就找到flag了2、YApi管理平台漏洞https://blog.csdn.net/weixin_42353842/article/details/127960229