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的更多相关文章

随机推荐

  1. 记一次完整的PHP代码审计——yccms v3.4审计

    一.环境搭建与使用工具 (一)环境搭建 打开源码查看安装要求 PHP 5.4+,Mysql 5.0.*,直接使用phpstudy配置即可 查看源码目录结构,发现是mvc模式的,那么我们重点关注的就是c ...

  2. SQL靶场过关

    background1基础部分 注入分类: 基于从服务器接收到的相应: 基于错误的SQL注入 联合查询的类型 堆叠查询注射 SQL盲注 布尔盲注 时间盲注 报错盲注 基于如何处理输入的SQL查询(数据 ...

  3. 【雅礼联考DAY02】Revolution

    #include<cstdio> #include<queue> using namespace std; const int N = 210 , M = 210000 , I ...

  4. Postgresql动态共享内存类型

    一.简介 linux为多个进程通信提供了不同的IPC机制,如:System V , POSIX 和 MMAP,所以Postgresql共享内存管理也支持以上类型. 在Postgresql中可以使用dy ...

  5. 2023年2月份CKA考试历程

    2023年2月份CKA 考试历程 目录 2023年2月份CKA 考试历程 一.购买CKA/CKS套餐 二.CKA 考试练习 三.CKA 第一次考试 考前考中 考后 四.CKA 第二次考试 五.考试的一 ...

  6. Qt实现简单的TCP协议(客户端的实现)

    1.QT提供了QTcpSocket类,可以直接实例化一个客户端.需要在pro文件中添加   QT += network 2.连接服务端 connect(connectbutton,SIGNAL(cli ...

  7. sqlserver 通过.mdf 和.ldf 恢复数据库

    USE master;GOCREATE DATABASE ImageManager ON (FILENAME = 'D:\LD\计时器demo\winform图片上传DB\ImageManager.m ...

  8. lg9019题解

    容易发现,向左跳是不优的. 而且除了最后一次跳跃,每次跳跃一定跳到现在能够跳到的最右的区间. 设\(r_i\)表示第\(i\)个区间能够跳到的最右的区间,\(l_i\)表示第\(i\)个区间能够跳到的 ...

  9. TensorFlow中使用tf.keras.callbacks.EarlyStopping防止训练过拟合

    TensorFlow tf.keras.callbacks.EarlyStopping 当模型训练次数epoch设置到100甚至更大时,如果模型的效果没有进一步提升,那么训练可以提前停止,继续训练很可 ...

  10. elementUi-2.13.2版本添加暂无数据

    1.实现效果如下: 2. 代码实现 <el-table empty-taxt="暂无数据"></el-table> css样式设置: .el-table__ ...