渗透过程中遇到的JWT简单记录及其他杂谈。

渗透过程中遇到的JWT简单记录及哈希/加密/编码的不同。

0x00 闲扯

        最近在测试app的时候,经常发现有base64编码的字符串,在解码之后发现,总是会出现jwt和HS256(HMAC-SHA256),而且最后一部分会出现乱码,所以就简单了解并记录一下。(因为了解的目的不同,所以关注点不同)

解出来像这样子:

在这里插入图片描述

0x01 什么是JWT

   JWT:json web token。
      json就是代表它是json格式的;
      web就是应用于web应用层的;
      token就是用于识别身份的。

0x02 为啥用JWT

   JWT不用存储在服务器端、可解决跨域身份验证等因素

0x03 JWT字符串的构成

JWT的组成:
       header.payload.signature(说实话,没查资料之前我都没看到有两个点点)

header:
{"typ":"JWT","alg":"HS256"}

alg: 声明加密签名所用的算法
typ: 表示对象类型

payload:
{"iss":"url","aud":"url","iat":1587704774,"nbf":1587704774,"exp":1588309574,"jti":{"id":"74088","type":"user"}}
iss?: string;    // JWT的签发者
sub?: string;   // JWT所面向的用户
aud?: string;   // 接收JWT的一方
exp?: number;   // JWT的过期时间
nbf?: number;   // 在xxx日期之间,该JWT都是可用的
iat?: number;   // 该JWT签发的时间
jti?: number;   //JWT的唯一身份标识

也可以自行定义一些key。
signature:
由header和payload哈希生成。

整个的字符串就是这样子生成的:

base64Url(header).base64Url(payload).HS256[base64Url(header)+'.'+base64Url(payload)]

(base64URL算法,和base64的区别就是,它把 Base64 中的 "+" 和 "/" 替换成了 "-" 和 "_" ,删除了 "=")

先对header和payload进行 base64Url 编码,然后用 “.” 将它们拼接起来,然后对拼接后的字符串用密钥进行SHA256哈希生成signature,然后再将其拼接在最后生成JWT。

0x04 反思总结

还好学过一些加解密,知道了测试时候不成功的原因。

      对于这样的认证信息,从理论上来说,我们除非进行长度扩展等等攻击之外,想要改动这样的信息然后进行重放数据包是很难的(谁知道会有怎样奇葩的开发呢?)。它是跟MD5类似的,这样就懂了吧!(这里取决于选取的加密方式,这里是哈希,所以没辙。)

查资料的时候,发现有几道题是有关JWT的:

[HFCTF2020]EasyLogin 好可惜没参加
[CISCN2019 华北赛区 Day1 Web2]ikun
还有个18年网鼎杯i_am_admin题目。

然后收集到了几个有用的网站:

爆破密钥的工具
在线构造JWT     知道原理后自己构造也不慢。
也可以用python的PyJWT调用函数


对于加密、哈希、编码,其实是不同的概念,偶尔说顺口了都称为加密。

加密:
加密是可逆的,可以恢复出明文。
对称加密:加密和解密用的同一个密钥,比如DES、AES;
非对称加密:用的不同密钥,比如RSA。

哈希:
哈希是不可逆的,只能通过碰撞。比如MD5和SHA家族,而SHA家族的散列值比MD5的要长,所以碰撞起来要困难一些。

编码:
可逆,不需要密钥,比如url编码、base64编码。

你可能感兴趣的:(杂项)