首页 > 其他分享 >JWT 安全性总结

JWT 安全性总结

时间:2023-05-20 22:32:16浏览次数:47  
标签:总结 编码 admin BASE64 JWT token 密钥 安全性

一、JWT介绍

       JWT全称为Json Web Token,简单理解为用于在客户端和服务端通过Json格式传递鉴权信息,其与Session所不同的是,JWT不需要存储在服务端,而是每次请求时客户端都会携带JWT到服务端,服务端经过计算验证,确定该JWT信息是否是合法的,从而进行鉴权。

JWT是一串BASE64编码,通过点号“.”分割成三部分,分别是Header,Claims,Signature,在https://jwt.io取一个例子,如下:

JWT 安全性总结_token

Header:header是一个JSON对象,主要描述了类型及HASH算法,类型通常为固定的JWT,而HASH算法可选,经过BASE64编码后得到,因此也可以通过BASE64解码得出具体的值;

如:{"alg":"HS256","typ":"JWT"}编码后得到:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。

Claims:Claims是一个JSON对象,有的地方也称为Payload,主要描述了JWT Token所传输的元素,默认包括:

iss(issuer):签发人/发行人

sub(subject):主题

aud(audience):用户

exp(expiration time):过期时间

nbf(Not Before):生效时间,在此之前是无效的

iat(Issued At):签发时间

jti(JWT ID):用于标识该JWT

另外,还可以再根据自身的需求,再定义其他的原因。

Claims是一个JSON对象,通过BASE64进行编码,因此该部分也可以通过BASE64进行解码。如:{"sub":"1234567890","name":"John Doe","iat":1516239022},编码后得到eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ。

Signature:这是一个签名的部分,其计算方法为:HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret) ,即header的BASE64编码、点号、Clamis的BASE64编码以及将secret作为盐值,以前面申明的HASH算法进行计算,得到的一个值,该值具有不可逆性。

      上述为JWT的简要介绍,JWT的设计是安全的,但是JWT使用不当,仍可能产生安全问题:

1、 header、claims仅进行了BASE64编码,是不能在里面存储敏感信息,否则会造成敏感信息泄露;

2、 signature部分本身是不可逆的,这是JWT安全性的保证的根本,但是若secret泄露,或者在代码中进行硬编码泄露、设置为了空密钥等,那么JWT也将不再安全,可以进行伪造;

3、 在header部分指定了signature的HASH算法,若后端程序代码在进行计算验证时不严谨,比如计算时,未包含secret,仍然会导致JWT失效;

4、 最后,signature是一个HASH值,通过加盐加强其安全性,但是若盐值不够强壮,那么使用爆破仍然会导致JWT失效。

下面通过OWASP 的WEBGOAT项目进行练习。

二、WebGoat reset votes 练习

JWT 安全性总结_Json Web Token_02

JWT 安全性总结_Json Web Token_03

使用普通用户tom进行Reset Votes操作,返回Only an admin user can reset the votes

获取access_token:

access_token=eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE2NTcxNDAyODIsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.ahvoqLbmADZGJc6Xp4OW3BIA8n6BhPUEoF6fYkjnihZS_xoQoj7wh3dQQ134NBlqv2tporwaYh07Vznfv6HxhA;

https://jwt.io/ 进行BASE64解码,如下:

HEADER:

{

  "alg": "HS512"

}

PAYLOAD:

{

  "iat": 1657140282,

  "admin": "false",

  "user": "Tom"

}

VERIFY SIGNATURE:

HMACSHA512(

  base64UrlEncode(header) + "." +

  base64UrlEncode(payload),

)

     根据前面的报错信息,需要admin用户才可以进行重置操作,这里有两种方式可以尝试,一是找到签名的密钥,然后将PAYLOAD的admin的值修改为true,然后重新生成BASE64的JWT,并且使用密钥进行签名;第二种方式是直接去掉签名。

第一种方式:

1、 通过白盒查看签名的密钥。在前面抓包可以看到请求的URL为/WebGoat/JWT/votings,方法为POST,在IDEA中去查看源码,全局搜索jwt/votings,找到如下:

JWT 安全性总结_token_04

JWT 安全性总结_Json Web Token_05

JWT 安全性总结_token_06

可以看到密钥为victory。

2、现在回到http://jwt.io,重新生成JWT,把admin的值修改为true,在密钥处填写victory,如下:

JWT 安全性总结_Json Web Token_07

3、将左右生成的JWT复制后放到BURP替换原来的值,然后发送:

JWT 安全性总结_Json Web Token_08

此时返回的信息可以看到已经重置成功。

如果我们没有通过白盒代码审计看到签名密钥呢,尝试一下不进行签名。

第二种方式:

1、 将通过BURP获取到的包中的access_token获取下来,解码:

JWT 安全性总结_token_09

2、 修改签名算法,如下:

{

  "alg": "HS512"

}

修改为:

{

  "alg": "none"

}

然后再进行BASE64编码得到ewogICJhbGciOiAibm9uZSIKfQo=,去掉后面的等号:

JWT 安全性总结_Json Web Token_10

3、 修改JWT中PAYLOAD的admin的值为true,获取编码:

eyJpYXQiOjE2NTcxNDAyODIsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ

4、 整合BASE64编码,由于我们没有进行签名,因此不需要JWT的最后一部分,但是注意,要保留最后一部分前面的“.”,如下:

ewogICJhbGciOiAibm9uZSIKfQo.eyJpYXQiOjE2NTcxNDAyODIsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ.

5、 把新获得的JWT放到BURP中进行重放,可以看到重置成功。

JWT 安全性总结_JWT_11

第三种方式:

该方式和第二种方式差不多,不用修改算法,把PAYLOAD中的admin改为True,user改为admin,然后将签名部分删掉:

JWT 安全性总结_Json Web Token_12

JWT 安全性总结_JWT_13

三、WebGoat JWT Cracking 练习

这个练习是根据要求对已知的JWT Token进行爆解,然后将其中的username字段的值修改为“WebGoat”,然后提交新的JWT Token:

JWT 安全性总结_Json Web Token_14

将JWT Token复制出来进行解析,注意这里面是带时间戳的,token的有效期只有60秒钟,内容如下:

JWT 安全性总结_JWT_15

这一点从网页上的token也可以看出来,每一60秒刷新一次,JWT Token会变化。

根据网站上的提示,到GITHUB上下载google-10000-english.txt文件,然后将JWT Token复制出来,放到hashcat中进行爆破,如下:

hashcat -m 16500 /root/Desktop/jwt -a 3 -w 3 /root/Desktop/google-10000-english.txt

JWT 安全性总结_Json Web Token_16

找到密钥为: washington

由于爆破已经花了一定的时间,导致token失效了,到百度找一个时间戳转换器,查看当前时间,然后修改token的时间到有效期内:

JWT 安全性总结_JWT_17

设置正确的时间戳,修改username的值为WebGoat,填上爆破出来的密钥:washington

JWT 安全性总结_JWT_18

将左边的token复制到网站,提交后显示成功:

JWT 安全性总结_Json Web Token_19

 

标签:总结,编码,admin,BASE64,JWT,token,密钥,安全性
From: https://blog.51cto.com/u_9652359/6318140

相关文章

  • 面向复用的软件构造技术知识点总结
    知识点概要:什么是软件复用?如何衡量“可复用性”?可复用组件的级别和形态——源代码级别的复用——模块级别的复用:类/抽象类/接口——库级别的复用:API/包——系统级别的复用:框架设计可复用的类——继承与重写——重载——参数多态与泛型编程——行为子类型和Liskov替......
  • 5.20每日总结
    今天完成了人机交互设计的课堂作业,对一个搜索软件进行了一些评价。然后对整个团队中其他团队成员完成的任务自己也进行了一些了学习,弥补了自己的一些不足,然后对其他知识进行了期末的收尾和复习总结。......
  • AT_abc_270_d 总结
    题目:AT_abc_270_d链接:洛谷,AT,vjudge题意有两个人轮流取石子,有\(n\)颗石子和长度为\(k\)的数组\(a\),每次取石子的人可以取走\(a_i\)颗石子,当然当时剩下的石子数量要$\gea_i$才行,若二人都走最优策略,那么先手可以取走都少颗棋子?数据范围:\(1\len\le10^4,1\l......
  • 又一个2W+的答题抽奖活动,复盘复盘总结总结
    又一个2W+的答题抽奖活动,复盘复盘总结总结前段时间太忙了,现在才有时间对一些活动进行复盘总结,这里先对其中一个答题抽奖活动进行复盘总结一下。遇到的一些问题、分析以及其解决方案。答题+抽奖参与者每答对一道题既可获得相对应的分数,分数进行累计达到活动规定的分数后即可参与抽奖......
  • AT_abc270_f 总结
    题意有\(n\)个岛屿,可以分别花\(x_i,y_i(1\lei\len)\)的代价在岛屿\(i\)建一个机场和港口,一个花\(z_i(1\lei\lem)\)的代价在\(a_i,b_i\)之间建一条双向道路。若\(x\)和\(y\)都有机场或港口或者有道路相连,那么\(x\)和\(y\)是联通的,问要花至少多少代价......
  • 总结一下常见String类的方法
    String常用方法intlength():返回字符串的长度:returnvalue.lengthcharcharAt(intindex):返回某索引处的字符returnvalue[index]booleanisEmpty():判断是否是空字符串:returnvalue.length==0StringtoLowerCase():使用默认语言环境,将String中的所有字符转换为小写Strin......
  • Windows Server2019网卡桥接与网卡聚合在实际工作中经验总结
    WindowsServer2019网卡桥接与网卡聚合在实际工作中经验总结1、WindowsServer2019网卡桥接与网卡聚合的区别   桥接:只是在服务器端的多个网卡进行桥接,交换机端不能做聚合,在实际工作中,桥接网卡会产MAC地址漂移,如果用MAC地址控制会产生断网故障。(注意:这是服务这边桥接,交换......
  • 背包总结
    01背包题目简介有N件物品和一个容量为V的背包,每件物品有各自的价值且只能被选择一次,要求在有限的背包容量下,装入的物品总价值最大。「0-1背包」是较为简单的动态规划问题,也是其余背包问题的基础。动态规划是不断决策求最优解的过程,「0-1背包」即是不断对第i个物品的做出......
  • 常见前端安全问题总结
    一、XSS攻击全称跨站脚本攻击,简称XSS攻击,攻击者通过在目标网站上HTML注入篡改网页来插入恶意脚本,当用户在浏览网页时获取用户的cookie等敏感信息,进一步做一些其他危害的操作。根据攻击的来源,该攻击还可以分为:1)存储型攻击:一般是在有评论功能的网站将恶意代码当作评论内容存储到......
  • Revit二次开发 知识点总结(表格)
    Revit二次开发知识点总结(表格) 宏Macro概述宏是一种程序,用来实现重复任务的自动化;宏可以执行一系列预定义的步骤,从而完成特定任务;模块是对宏的分组;实际上是一个编程项目;应用程序级的宏:可以在任何文档中使用,可以自行运行;可以独立于Revit运行;可以向Revit添加工具;......