2023Hgame
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函数这里是会报错的
2023Hgame的更多相关文章
随机推荐
- j-link "the connected j-link is defective"问题的解决
出现这个原因是 J-link和J-link的驱动不匹配,比如J-link的固件太老,J-link驱动太新.因此要解决的话,要不就是换不同版本的J-link驱动,要不就是换J-Link或升级J-link ...
- 微信小程序自定义导航栏机型适配
自定义微信小程序头部导航栏,有几种方式 方式一 { "navigationStyle": "custom" // 将navigationStyle从默认defa ...
- 0x06_自制操作系统My-OS,IDT,GDT,PIC初始化,实现键盘中断
把class03改成class04 IDT,GDT,PIC 我来介绍什么是IDT和GDT,PIC,怎么实现键盘中断 GDT全局描述表在16位CPU用不到,到了32位CPU要用. 16位CPU实模式用基 ...
- 软件设计原则(Principles)
设计模式的从许多优秀的软件中总结出来的 , 使用设计模式能够实现可复用.可维护.开发人员之间方便沟通设计和理解代码. Tips 对于模式的使用 , 不能拘泥于格式 , 事实上根据需要模式是可以演化的 ...
- CSS3--通过Animation实现简单的手指点击动画
效果图 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta ...
- PostgreSQL维护年龄的处理
1.错误信息 WARNING: database "postgres" must be vacuumed within 3330803 transactions 最常见的方法是通过 ...
- 【转载】python解决文本乱码问题及文本二进制读取后的处理
转自:https://blog.csdn.net/u011316258/article/details/50450079 python解决文本乱码问题及文本二进制读取后的处理 吲哚乙酸 当文本中含有很 ...
- Jmeter 如何把 时间戳 转为 本地时间
一.引入主题(time) jmeter中,有很多已经封装好的函数,使用这些函数,就能实现某些特定的功能,这对于没有代码基础,或代码基础薄弱的同学来说,是一个非常大的福音. 二.Jmeter把时间戳转为 ...
- java学习日记20230302-字符
JAVA字符 char c1 = 97 System.out.println(c1)// a 会输出97代表的字符(字符编码) 字符类型细节: 字符常量用单引号 java中允许使用\转义字符代表一个字 ...
- Date时间API
JDK8之前时间API 1. java.lang.System类 System类提供的public static long currentTimeMillis()用来返回当前时间与1970 ...