首页 > 其他分享 >hxp ctf valentine ejs ssti 语法特性造成的漏洞

hxp ctf valentine ejs ssti 语法特性造成的漏洞

时间:2023-03-14 19:33:25浏览次数:43  
标签:return name res app valentine ctf hxp template ejs

拿到源码,是一个node.js写的后端,源码如下:

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');  //设置express使用的render engine

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.template
  if (!/^[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);

这道题的漏洞点在

return res.render(template, query);

 template就是根据创建的ejs文件template.js,query就是用户的传参,这里的漏洞在于ejs允许自定义分隔符,like this:

// 单个模板文件
ejs.render('<?= users.join(" | "); ?>', {users: users},
    {delimiter: '?'});

参考官网文档:https://ejs.bootcss.com/

 比如说template.ejs文件的内容是<%= name %>,传参是?name=aaa,执行的命令就是ejs.render('<%= name %>',{name:aaa})

这道题tmpl传参控制了template.ejs的文件内容,且内容限制了以<%开头的字符串必须是<%= name %>,我们可以自定义分隔符,传参:?template=<*= global.process.mainModule.require('child_process').execSync('type flag.txt') *>,然后得到重定向链接,再传入?delimiter=*,就成功RCE了。

 ps:这道题我是赛后使用windows复现的,所以使用的命令是type flag.txt

 

标签:return,name,res,app,valentine,ctf,hxp,template,ejs
From: https://www.cnblogs.com/hackerone/p/17216027.html

相关文章

  • RealWorldCTF渗透赛第二期复现-ctfshow
    比赛概述开始时间:2023年3月10日15时环境保留时间:72小时环境重置时间:20分钟官方wp链接:Docs(feishu.cn)【本次复现跟着官方WP进行,只做记录学习之用】0x1目标资产......
  • Nullcon Berlin HackIM 2023 CTF - WEB,wp
    题目:reguest先来看下代码app.pyfromflaskimportFlask,Response,requestimportrequestsimportioapp=Flask(__name__)@app.route('/')defindex():......
  • [BUUCTF]Reverse-[BJDCTF2020]JustRE
      进去之后直接看字符串窗口,发现一个疑似flag的,点进去查看    我的妈耶!良心啊,直接把flag给我们了,呜呜呜呜,真的好少见这种淳朴的出题人!!!BJD{1999902069a4579......
  • ctfshow 1000题记录
    RCE-Web32<?phperror_reporting(0);if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/flag|system|php|cat|sort|shell|\.||\'|\`|echo|\;|\(/i",......
  • BUUCTF-PWN-warmup_csaw_2016
    定期pwn一下维持手感1.检查啥都没有捏2.找漏洞ida静态分析从main里面找到get找到shell思路是简单的栈溢出3.信息收集get_addr:0x40069E距离rbp:0x40shell_add......
  • buuctf
    1、JustRE首先将文件放入exeinfope查看是否有壳 发现无壳,32位放入ida32位查看 没找到什么有用的东西按shift+f12查找字符串 发现一处类似flag的代码 按住ct......
  • BUU pwn PicoCTF_2018_shellcode //最简单的shellcode
    这道题需要我们了解x86汇编的lea指令。leadst,src指的是dst=&srcfile可知32bitELFIDAF5发现反编译失败,查看main函数的汇编,发现会调用vuln函数。其中leaeax,[ebp+va......
  • ctfshow web入门 命令执行 特征及绕过技巧
    远程命令执行(RemoteCommandExecution,RCE)原理命令执行漏洞是指服务器没有对执行的命令进行过滤,用户可以随意执行系统命令,命令执行漏洞属于高危漏洞之一。危险函数......
  • [NISACTF 2022]popchains
    [NISACTF2022]popchains源代码<?phpecho'HappyNewYear~MAKEAWISH<br>';if(isset($_GET['wish'])){@unserialize($_GET['wish']);}else{$a=newRo......
  • [SWPUCTF 2021 新生赛]sql
    [SWPUCTF2021新生赛]sql-绕过首先直接通过wllm=1'发现有语句报错之后直接开始手测规则发现屏蔽了=空格+andor<>#空格的绕过方法很多,但是通过第一轮测试还发......