0%

DASCTF X 0psu3十一月挑战赛|越艰巨·越狂热|web|复现

前言:

之前比赛没有打,本来想24国赛赛前准备做做题选择这个来练习一下,但是做的过程中发现难度过大复现有点挑战(未完)

一、realrce

描述:在和队友的测试中不断缝缝补补的辣鸡waf,师傅们看看还有没有其他打法

考点:js原型链污染

参考资料:JavaScript原型链污染原理及相关CVE漏洞剖析

下载附件得到源码,找到关键点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
app.post('/', function (req, res) {
let msg = req.body.msg; //从请求体(req.body)中提取名为msg的字段,并将其赋值给变量msg

let msgString = convertToString(msg); //将变量msg转换为字符串格式,并将结果赋值给变量 msgString
if (!waf(msgString)) {
try {
const msg_rce = {};
merge(msg_rce, msg);
if (cmd_rce && Door_lock(cmd_rce)) {
try {
const result = proc.execSync(cmd_rce.replace(/\r?\n/g,"").replace(/[a-zA-Z0-9 ]+=[a-zA-Z0-9 ]+/g,"114514").replace(/(\$\d+)|(\$SHELL)|(\$_)|(\$\()|(\${)/g,"114514").replace(/(\'\/)|(\"\/)|(\"\.)|(\"\.)|(\'~)|(\"~)|(\.\/+)/,"114514"));
res.render('index', { result });
} catch (error) {
res.render('index', { error: error.message });
}
} else {
res.render('index', { result: "this is a lock" });
}
} catch (error) {
res.render('index', { result: "无事发生" });
}
} else {
res.render('index', { result: "this is a waf" });
}
})

第一层waf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function waf(input_code) {
bypasspin = /%[0-9a-fA-F]{2}/i; //匹配 URL 编码的字符
const bypasscode = bypasspin.test(input_code); //使用正则表达式bypasspin来测试输入字符串input_code是否包含匹配的模式
if (bypasscode) {
try {
return waf(decodeURIComponent(input_code)); //尝试解码输入字符串,递归调用waf确保所有层次的URL编码字符都被解码
} catch (error) { //解码过程中发生错误,则进入 catch 块
console.error("Error decoding input: ", error); //打印错误信息
return false;
}
}
const blacklist = [/__proto__/i, /constructor/i, /prototype/i]; //设置黑名单
for (const blackword of blacklist) { /循环遍历blacklist数组中的每个正则表达式
if (blackword.test(input_code)) { //检查input_code是否匹配当前的黑名单关键字 blackword
return true;
}
}
return false;
}

二、EzPenetration

描述:题目源自真实渗透案例

提示1:flag写入方式已修改。flag在wp那个机器的 /flag

提示2:数据库里 的 邮箱key已更改为管理员密码,拿到后可直接登录

考点:

参考资料:【网安神器篇】——WPScan漏洞扫描工具活动日历注册 < 2.7.6 - 未经身份验证的 SQL 注入

进去页面后可以看到一个搜索框搜索个1,猜测这题的考点可能是sql注入(但是用sqlmap没有跑出来)

尝试了半天发现应该就是sql注入了但是基础的那几个试了一遍过去都没用(完全没有思路了)

看了一下wp思路就是需要用sql注入得到管理员邮箱及其授权码

用wappalyzer查看一下发现网站的CMS是wordpress,数据库是mysql的(那就有可能是wordpress里的一种sqlz注入漏洞)

看了一下wp,用wpscan扫描网站漏洞(不是哥们)

1
wpscan --url http://node5.buuoj.cn:26114/ --api-token=JOZ43JQiv5HB49X1CN9HUKOXGAaVaKo7aOwIasinEpY

扫出来了一堆洞但是不知道还存不存在(有些是误报得自己判断),选择sql的漏洞进行一个一个的尝试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
WP < 6.0.2 - SQLi via Link API

WP < 6.0.3 - Reflected XSS via SQLi in Media Library


WP < 6.0.3 - SQLi in WP_Date_Query

Email Subscribers & Newsletters < 5.3.2 - Subscriber+ Blind SQL injection

Icegram Express < 5.5.1 - Subscriber+ SQLi

Icegram Express - Email Subscribers, Newsletters and Marketing Automation Plugin < 5.7.15 - Unauthenticated SQL Injection

Email Subscribers by Icegram Express < 5.7.21 - Unauthenticated SQL Injection via hash

Icegram Express < 5.7.23 - Authenticated (Subscriber+) SQL Injection Vulnerability via options[list_id]

Icegram Express - Email Subscribers, Newsletters and Marketing Automation Plugin < 5.7.24 - Unauthenticated SQL Injection via optin

Email Subscribers by Icegram Express – Email Marketing, Newsletters, Automation for WordPress & WooCommerce < 5.7.26 - Unauthenticated SQL Injection via unsubscribe

Registrations for the Events Calendar < 2.7.6 - Unauthenticated SQL Injection
https://wpscan.com/vulnerability/ba50c590-42ee-4523-8aa0-87ac644b77ed
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-24943

Registrations for the Events Calendar – Event Registration Plugin < 2.12.3 - Authenticated (Contributor+) SQL Injection

这边就直接用wp里的Registrations for the Events Calendar < 2.7.6 - Unauthenticated SQL Injection