freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

jwt学习随笔
2023-07-22 14:14:00
所属地 黑龙江省
jwt全称json web token,顾名思义json格式的web令牌。我用几个关键词知识点将其概括:
  • json格式
  • 用户信息加密到token里
  • 服务器不保存任何用户信息
  • 服务器只保存密钥信息
  • 通过使用特定加密算法验证token
  • 通过token验证用户身份信息
  • 基于token的身份验证可以代替cookie,session身份验证方法
  • 由三部分组成header.payload.signature
header:

header部分有两个常见的字段:
alg:alg用来声明使用的是哪种加密算法:一般来说,rsa和hmac算法最为常见。在这个字段里rsa会写作rs256,而hmac通常写作hs256。
typ:声明类型为jwt。
header一般来说长这个样子:

{
    "alg" : "rs256"
    "typ" : "jwt"
}
payload:

payload中的数据一般是为用户数据和声明一些权限的数据。
如下:

{
    "user_role" : "jack" //当前登录用户
    "iss" : "administrator" //该token的签发人
    "iat" : 1573440582, //该token的签发时间
    "exp" : 1573940267, //过期时间
    "nbf" : 1573440582, //该时间前不接受处理该token
    "domain" : "baidu.com" //面向的用户为baidu
    "jti" : "dff4214121e83057655e10bd9751d657" //Token唯一标识
}
signature:



signature翻译过来的意思为签名,它的功能是保护token的完整性。

生成方法:
签名=用alg中指定的加密算法将header和payload加密
signature = HMAC-SHA256(base64urlEncode(header) + '.' + base64urlEncode(payload), secret_key)

一个完整的jwt为:
header.payload.signature
其中header和payload是由base64url加密,而signature是由alg中的指定算法加密。

攻击方式:

  1. 通过修改加密算法进行攻击
    1. 将alg字段设置为none以及将signature置为空
    2. 将rsa加密算法修改为hmac加密算法
  2. 爆破密钥
  3. 修改参数
    1. 修改kid
      1. 任意文件读取
      2. sql注入
      3. 命令注入
    2. 修改jku或x5u
  4. 信息泄露

攻击手法大概就是这些:
1-1.将alg字段设置为none以及将signature置为空:这种方法一开始是用于调试,不过也有可能开发人员疏忽造成这种漏洞,这种疏忽就是开发人员在生产环境中开启了空加密算法,也就是缺少加密算法,不对加密算法进行校验,jwt失去了它保证信息不被篡改的功能。从而达到了攻击者伪造身份的目的。
1-2.将rsa加密算法修改为hmac加密算法:hmac为对称加密算法,公钥私钥用同一个。而rsa为非对称加密算法,公钥和私钥不为同一个(私钥加密明文,公钥解密密文)。在这两种算法中,都是使用私钥进行加密,只有拿到了加密时使用的私钥,才可能伪造token。
所以相比于rsa的私钥来说,hmac的的私钥通过信息收集更容易得到。
如果一个token是由rsa加密的,但是你通过抓包,然后修改其中的alg参数为hmac,并将信息收集来的hmac的私钥对token进行签名,然后发送到服务器端,服务器端可能会把该token认为成是通过rsa私钥加密来的,从而使用rsa的公钥对其解密。从而达到了伪造身份的目的。
2.爆破密钥:有几个条件:知道加密算法是哪种,一个已经签名过的jwt,密钥不能太复杂。所以条件比较苛刻。
3-1.修改kid:kid是header中的一个可选参数,全称key id,用于指定加密算法的密钥,因为这个参数可以由用户输入,所以会有安全问题。
3-1-1.任意文件读取:因为kid是一个可以读取路径的参数,所以如果后端为对该参数进行过滤,可能导致该漏洞。
3-1-2.sql注入:kid可以从数据库中读取数据,通过构造sql注入的payload也可能导致该漏洞。
3-1-3.命令注入:如果后端使用的是ruby,在读取密钥的时候使用了open函数,则可能存在该漏洞。
3-2.修改jku或x5u:这两个的用法跟kid类似。
4.信息泄露:payload部分是base64url编码,相当于明文,可能会泄露敏感信息。

# web安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者