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. STM32F4寄存器初始化系列:时钟开启

    1 static void RCC_Init(void) 2 { 3 RCC->APB1ENR|=1<<17; //使能串口2时钟 4 RCC->APB1ENR|=1<& ...

  2. Osx10.14升级watchman踩坑记

    背景 使用 watchman 检测文件变化通知非常的好用, 但有些时候会出现 watchman 占用内存和 CPU 特别疯狂, 通过 watch-del 也无济与事, 由于 watchman 的版本 ...

  3. ajax的原理是什么?如何实现?

    一.是什么 AJAX全称(Async Javascript and XML) 即异步的JavaScript 和XML,是一种创建交互式网页应用的网页开发技术,可以在不重新加载整个网页的情况下,与服务器 ...

  4. sublime text中开启本地服务器

    步骤: 1 Ctrl+shift+p-> 输入选中install package 2 输入sublimeserver回车安装即可 3 安装完了以后,需要开启服务器 4 回到页面上右键 转载于:h ...

  5. 轻量级CI/CD发布部署环境搭建及使用_01_基本介绍

    轻量级CI/CD发布部署环境搭建及使用_01_基本介绍 授人以鱼不如授人以渔,如果说的别人都没明白,说明自己实际也不是太明白 最终实现效果如图 1,选择相应环境下的项目,执行构建 注: web:vue ...

  6. dismount ASM磁盘组,影响未使用的其它ASM磁盘组

    # 问题概述登录数据库,查看活动会话,发现大量library cache lock ,log file switch (archiving needed),归档失败,redo log无法重用.# 问题 ...

  7. Nginx 同一个域名自动识别 pc h5

    首先设置环境变量 我们先设置变量,通过判断来改变变量的值(注: 我写在server中) set $is_mobile false; # 初始值 if ( $http_cookie ~* "A ...

  8. 【8】java之引用传递

    一.引用传递 ​引用传递是整个 java 的精髓所在 引用传递核心意义:同一块堆内存空间可以被不同的栈内存所指向,不同栈内存可以对同一块堆内存内容进行修改. 范例:第一道引用传递范例 class Me ...

  9. 2023.3.4Leecode982按位与为零的三元组

    题目的要求 给你一个整数数组 nums ,返回其中 按位与三元组 的数目. 按位与三元组 是由下标 (i, j, k) 组成的三元组,并满足下述全部条件: 0 <= i < nums.le ...

  10. QT个人笔记

    1.QT的setCursor(Qt::CrossCursor) 干什么用 ui->View->setCursor(Qt::CrossCursor); setCursor函数用于设置窗口上的 ...