ctfshow jwt模块

web345

未对签名进行验证

image-20250724161404331

要伪造admin用户访问 admin路由

bp抓包

image-20250724161354771

可以看到这个jwt只要两部分

没有signature(签名)部分 很明显未对签名进行验证

直接把payload部分 的用户 该为admin

​ header部分 的加密算法 None改成任何一个加密算法都可以

直接在bp里就可以修改

image-20250724161942995

image-20250724162005497

改完之后应用变更send 到/admin/路由 即可

image-20250724162057702

web346

未对加密算法进行强验证

攻击手法跟上关一样 只不过这里要把后面的签名部分去掉 把header中的alg参数的值改为none payload中的sub改为admin

伪造成功发包就可以了

web347

弱密钥

jwt_tool爆破一下密钥

也可以用bp的JSON Editor插件 爆破

image-20250724163005939

image-20250724163011950

可以爆破出来secret是123456

然后用密钥去伪造jwt

伪造的话可以用JWT Web Tokens插件 JWT Editor应该也可以直接用 JWT Web Tokens插件感觉也更方便一点

image-20250724163701061

该一下sub 加一下密钥 去访问/admin/路由即可

image-20250724163744042

web348

这个也是爆破密钥 但不是弱密钥了

需要用到jwt-cracker工具进行爆破

1
./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc1MzM0NjgxMCwiZXhwIjoxNzUzMzU0MDEwLCJuYmYiOjE3NTMzNDY4MTAsInN1YiI6InVzZXIiLCJqdGkiOiI2MmRhM2Y1M2IwZGFiNzk2OTM2MTZlMmQyNzQ1NzhhYSJ9.iKSovfvhqggRhdGepXT5V28dSoi0kZWLePB9_5oxSG0

image-20250724165124009

拿到secret了剩下的就跟上一关一样了

image-20250724165206855

web349

公私钥泄密

js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* GET home page. */
router.get('/', function(req, res, next) {
res.type('html');
var privateKey = fs.readFileSync(process.cwd()+'//public//private.key');
var token = jwt.sign({ user: 'user' }, privateKey, { algorithm: 'RS256' });
res.cookie('auth',token);
res.end('where is flag?');

});

router.post('/',function(req,res,next){
var flag="flag_here";
res.type('html');
var auth = req.cookies.auth;
var cert = fs.readFileSync(process.cwd()+'//public/public.key'); // get public key
jwt.verify(auth, cert, function(err, decoded) {
if(decoded.user==='admin'){
res.end(flag);
}else{
res.end('you are not admin');
}
});
});

同一路由,get访问设置cookie,post访问检验cookie,user=admin得到flag
https://www.bejson.com/jwt/去解密jwt因为采用的加密算法RS256为非对称加密,需要public key和private key,利用私钥生成jwt,利用公钥解密jwt

扫描可以发现private.key

image-20250724170921894

public.key跟private.key在同一级目录下 访问/public.key 和 /private.key 拿到公私钥 伪造admin用户

image-20250724171250233

改为POST请求去访问

image-20250724171333963

web350

公私钥泄密之【公钥】泄密。

可以根据公钥,修改算法从 非对称算法(比如RS256) 到 对称密钥算法(HS256)
双方都使用公钥验签,顺利篡改数据
当公钥可以拿到时,如果使用对称密码,则对面使用相同的公钥进行解密
实现验签通过

访问public.key拿到公钥

js脚本

1
2
3
4
5
6
7
8
const jwt = require('jsonwebtoken');
const fs = require('fs');

var privateKey = fs.readFileSync(process.cwd()+'/public.key');
// console.log(privateKey);

var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
console.log(token)

image-20250724194805850

用伪造好的jwt去post请

image-20250724194833320