ctfshow_JWT(Web345-350)

发布时间 2023-08-11 20:46:38作者: Icfh

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区域即可

image-20230715234525830

image-20230715234448707

web350

JWT verify的相关说明:https://github.com/auth0/node-jsonwebtoken

image-20230716120555442

给定token和key检查是否valid,同时如果有callback将会调用

所以合法的token,在于签名是否合法,而并不取决于之前的签名采用什么样的算法,因为使用何种算法的信息也存在于给定的jwt中

所以只要将公钥修改为对称,然后伪造session

总结

  1. session和JWT的关系?

session是客户端的会话信息,是一种实体信息。

JWT是一种编码形式。

  1. JWT的相关攻击面
  • 修改JWT中的字段信息,绕过验证
  • 猜测弱密钥、爆破弱密钥,从而伪造签名
  • 修改签名算法,公钥改对称、对称改None