Day30 XD安全学习笔记--JS 应用&Node JS指南&原型链污染&Express框架&功能实现&审计
- 2026-11-05 07:35:27
Day30 XD安全学习笔记--JS 应用&Node JS指南&原型链污染&Express框架&功能实现&审计







NodeJs是Javascript运行在服务端的环境,Express是Node.js 的 Web 后端框架。所以它的代码在前端看不到,只能进行黑盒审计。这节课主要讲了NodeJs注入、目录遍历、命令执行和代码执行以及原型链污染等漏洞问题。
参考文档:
www.w3cschool.cn/nodejs/
github.com/Tencent/secguide
1、SQL注入
关键代码:
const mysql=require('mysql');const express = require('express');const bodyParser = require('body-parser');// require('body-parser'):加载请求体解析中间件,用于把 POST 请求中提交的表单数据解析成 JavaScript 对象(挂在 req.body 上)const app=express();var urlencodedParser = bodyParser.urlencoded({ extended: false })// 创建一个 urlencoded 格式的请求体解析中间件实例:// urlencoded:解析 Content-Type 为 application/x-www-form-urlencoded 的表单数据// extended: false:使用 Node 内置的 querystring 库解析,// 解析结果是"键值对"形式,不支持嵌套对象/数组// (extended: true 则使用 qs 库,支持 a[b]=1 这种嵌套结构)//post路由app.post('/login',urlencodedParser,function(req,res){const u = req.body.username;const p = req.body.password;console.log(u);console.log(p);var connection = mysql.createConnection({host : 'localhost',user : 'root',password : '123456',database : 'demo01'});connection.connect();const sql = 'select * from admin where username="'+u+'" and password="'+p+'"';console.log(sql);connection.query(sql,function(error,data){if(error){console.log('数据库连接失败!');}try{//原先的判断// if(u==(data[0]['username']) && p==data[0]['password']){// res.send('欢迎进入后台管理页面');// }if(data && data.length > 0){//把"字符串相等"改成"是否查出数据"res.send('欢迎进入后台管理页面');}}catch{res.send('错误');};})})const server = app.listen(3000,function(){console.log('web的3000端口已启动!');})
这段代码的sql语句由用户输入直接拼接,故存在注入问题。原先的判断逻辑有点问题,注入成功进不去,验证逻辑把"字符串相等"改成"是否查出数据"。
在命令行输入node .\sql.js启动服务,先在数据库用payload试一下

由sql.html提交表单到sql.js。

注入成功


2、目录遍历
关键代码:
const fs=require('fs');// 引入 Node.js 内置的 fs(文件系统)模块const express = require('express');const app = express();// 创建一个 express 应用实例,后续的路由和中间件都挂载到它上面app.get('/file', function (req, res) {const dir=req.query.dir;// req.query 是 express 解析 URL 查询字符串后得到的对象,例如访问 /file?dir=/tmp 时,req.query 为 { dir: '/tmp' }.这里取出查询参数 dir,作为要读取的目录路径/console.log(dir);filemanage(dir);})var server = app.listen(3000, function () {console.log('web应用3000端口已启动!')})function filemanage(dir){fs.readdir(dir,function(error,files){console.log(files);})};
dir 直接来自用户输入,用户可以传入 ../../etc 等路径,造成任意目录读取(路径遍历)
访问127.0.0.1:3000/file?dir=./


上上级目录

3、RCE
关键代码:
const rce=require('child_process');// 引入 Node.js 内置的 child_process 模块(子进程模块),用于在 Node.js 中创建子进程,从而调用系统命令、外部程序等//nodejs 调用系统命令执行rce.exec('notepad');// exec(command[, options], callback)异步执行// 作用:在 shell 中执行一条命令(Windows 下是 cmd.exe,Linux/macOS 下是 /bin/sh)rce.spawnSync('calc');//和exec差不多,但是是同步执行,会阻塞当前进程直到命令结束//nodejs 调用代码命令执行 把字符串当做代码解析eval('require("child_process").exec("calc");');// 作用:把传入的字符串当作 JavaScript 代码在当前作用域中解析并执行// 这里执行的字符串是:require("child_process").exec("calc");// 等价于:// 1. 通过 require 重新加载 child_process 模块// 2. 调用其 exec 方法执行系统命令 'calc'(打开计算器)// 特点:// - eval 可以访问当前作用域中的变量,能力极强// - 如果字符串来自外部输入(用户参数、网络请求等),// 攻击者可构造任意 JS 代码 → 造成远程代码执行(RCE)
启动服务执行node .\rce.js,弹出两个计算机一个记事本

4、原型链污染
原理讲解
测试
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。