jwt介绍
对json格式的信息采取的一种编码
JWT:Json web token
由两个点分隔成三个部分,分别为:
-
Header
-
Payload
-
Signature:
如果在Header部分声明的签名算法为HS256,以及服务器约定使用的密钥为secret
那么签名使用的算法一般为为:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload)+secret)
当然这个签名算法也可以是None
ctfshow题目
可以观察到这边的cookie均采用JWT格式
典型:×××.×××.×××
web345
没有签名,可以直接修改为admin
web346
有签名,但是key为空,可以伪造一个没有签名的session
web347
有key但是为弱密钥123456
web348
有key,可以使用c-jwtcrack脚本爆出来key
web349
这次的签名采用了公钥RS256
这个public目录就离谱,可以直接读public.key和private.key
这也是NodeJS项目的基础知识,public是可访问的目录,所以直接访问private.key就可以
注意下public.key和privtae.key的格式:
操作:直接将文件拖到cyberchef的secretkey区域即可
web350
JWT verify的相关说明:https://github.com/auth0/node-jsonwebtoken
给定token和key检查是否valid,同时如果有callback将会调用
所以合法的token,在于签名是否合法,而并不取决于之前的签名采用什么样的算法,因为使用何种算法的信息也存在于给定的jwt中
所以只要将公钥修改为对称,然后伪造session
总结
- session和JWT的关系?
session是客户端的会话信息,是一种实体信息。
JWT是一种编码形式。
- JWT的相关攻击面
- 修改JWT中的字段信息,绕过验证
- 猜测弱密钥、爆破弱密钥,从而伪造签名
- 修改签名算法,公钥改对称、对称改None