2023Hgame

Shared Diary

源代码先放一下

const express = require('express');
const bodyParser = require('body-parser');
const session = require('express-session');
const randomize = require('randomatic');
const ejs = require('ejs');
const path = require('path');
const app = express(); function merge(target, source) {
for (let key in source) {
// Prevent prototype pollution
if (key === '__proto__') {
throw new Error("Detected Prototype Pollution")
}
if (key in source && key in target) {
merge(target[key], source[key])
} else {
target[key] = source[key]
}
}
} app
.use(bodyParser.urlencoded({extended: true}))
.use(bodyParser.json());
app.set('views', path.join(__dirname, "./views"));
app.set('view engine', 'ejs');
app.use(session({
name: 'session',
secret: randomize('aA0', 16),
resave: false,
saveUninitialized: false
})) app.all("/login", (req, res) => {
if (req.method == 'POST') {
// save userinfo to session
let data = {};
try {
merge(data, req.body)
} catch (e) {
return res.render("login", {message: "Don't pollution my shared diary!"})
}
req.session.data = data // check password
let user = {};
user.password = req.body.password;
if (user.password=== "testpassword") {
user.role = 'admin'
}
if (user.role === 'admin') {
req.session.role = 'admin'
return res.redirect('/')
}else {
return res.render("login", {message: "Login as admin or don't touch my shared diary!"})
}
}
res.render('login', {message: ""});
}); app.all('/', (req, res) => {
if (!req.session.data || !req.session.data.username || req.session.role !== 'admin') {
return res.redirect("/login")
}
if (req.method == 'POST') {
let diary = ejs.render(`<div>${req.body.diary}</div>`)
req.session.diary = diary
return res.render('diary', {diary: req.session.diary, username: req.session.data.username});
}
return res.render('diary', {diary: req.session.diary, username: req.session.data.username});
}) app.listen(8888, '0.0.0.0');

第一种方法通过正常解 ssti完成

漏洞点在这里 可以控制ssti

先看看怎么样才能进入这里,需要不满足这个条件

    if (!req.session.data || !req.session.data.username || req.session.role !== 'admin') {
return res.redirect("/login")
}

必须要有session.data data里面也要有username 然后 role必须要使admin

上面有个merge函数 先看这个login路由吧

这里将data赋值给了session.data 所以我们可以通过merge函数来将我们的输入赋值给data

继续往下看 我们可以通过rq.body赋值给data

这里如果我们的user.password等于testpassword的话就给user.role赋值为admin 然后如果user.role为admin的话就可以使req.session.role赋值为admin

然后在看一下条件 if (!req.session.data || !req.session.data.username || req.session.role !== 'admin') {我们只差req.session.data.username没有满足了 所以我们只需要在执行merge函数的时候将data同样赋值上username属性就可以了

然后就执行到这里了<%- global.process.mainModule.require('child_process').execSync('cat /flag') %>

第二种方法 直接用ejs 通过原型链污染直接rce就可以了

这样使直接可以的 但是平台题目这里污染就会报错 然后污染不成功 自己服务器上的还是可以的 通过排错 应该使docker的问题 直接命令行 node app.js 可直接污染上的 但是 用docker的话 在merege函数这里是会报错的

最新文章

  1. GOTO Berlin: Web API设计原则
  2. java问题小总结
  3. 利用substring()方法,把一个表的不同分级所对应的字段名取出来。
  4. OpenStack 镜像制作之cloud-init
  5. CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。
  6. POJ 2246 Matrix Chain Multiplication(结构体+栈+模拟+矩阵相乘)
  7. 解决如下json格式的字符串不能使用DataContractJsonSerializer序列化和反序列化 分类: JSON 2015-01-28 14:26 72人阅读 评论(0) 收藏
  8. YouTube CEO关于工作和生活平衡的完美回答
  9. web前端代码规范 - HTML代码规范
  10. golang printf
  11. hdu1248
  12. jQuery菜单示例(全选,反选,取消)
  13. 问题:编译eshoponcontainers失败,提示error:invalid reference format
  14. J2EE和android的GZIP测试
  15. iOS开发之四:常用控件--UIButton的使用
  16. (NO.00003)iOS游戏简单的机器人投射游戏成形记(十八)
  17. 大数据技术 - 通俗理解MapReduce之WordCount(二)
  18. MySQL 复制夯住一例排查以及原理探讨
  19. MongoDB数据库中更新与删除数据
  20. 将自己的域名解析跳转到博客主页(GitHub中的gitpage跳转)

热门文章

  1. 合肥光源纵向震荡数据源相关PV的增补
  2. JZOJ 4212. 【五校联考1day2】我想大声告诉你
  3. bootstrap怎么让手机端电脑端自适应显示隐藏元素
  4. 通过源码分析RocketMQ主从复制原理
  5. LeetCode-537 复数乘法
  6. centos7中关闭防火墙命令
  7. No.2.4
  8. 「JOI Open 2022」Giraffes 题解
  9. Educational Codeforces Round 138 (Rated for Div. 2) - D. Counting Arrays
  10. lg9018题解