当前位置: 首页 > news >正文

JWT介绍及演示

JWT

介绍

cookie(放在浏览器)

cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的

session(放在服务器)

session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。

session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

token

在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式。

以下几点特性会让你在程序中使用基于Token的身份验证

  1. 无状态、可扩展

  2. 支持移动设备

  3. 跨程序调用

  4. 安全

jwt(json web token)

image-20231208174146988

JWT(JSON Web Token)由三部分组成:头部(Header)、载荷(Payload)、签名(Signature)。

头部(Header):头部通常由两部分组成,算法类型和令牌类型。

​ 算法类型:指定用于生成签名的算法,例如 HMAC、RSA 或者 ECDSA。

​ 令牌类型:指定令牌的类型,常见的是 JWT。

头部使用 Base64Url 编码表示,并作为整个 JWT 的第一部分。头部的一个示例:

{

“alg”: “HS256”,none

“typ”: “JWT”

}

载荷(Payload):载荷存储了有关用户或实体的声明和其他有关信息。

​ 声明:如用户 ID、角色、权限等信息。

​ 注册声明:包含一些标准的声明(比如发行人、过期时间等)和一些自定义的声明。

载荷也使用 Base64Url 编码表示,并作为整个 JWT 的第二部分。载荷的一个示例:

{

“sub”: “1234567890”,

“name”: “John Doe”,

“iat”: 1516239022

}

签名(Signature):签名是对头部和载荷进行签名的结果,用于验证 JWT 的完整性和真实性。

​ 签名生成方式:将头部和载荷进行 Base64Url 编码后拼接在一起,然后使用指定的加密算法(如 HMAC、RSA)进行签名,将生成的签名添加到 JWT 中。

头部

alg

是说明这个JWT的签名使用的算法的参数,常见值用HS256(默认),HS512等,也可以为None。HS256表示HMAC SHA256。

typ

说明这个token的类型为JWT

payload

image-20231208174325991

签名

服务器有一个不会发送给客户端的密码(secret),用头部中指定的算法对头部和声明的内容用此密码进行加密,生成的字符串就是JWT的签名

通信流程

image-20231208174249484

环境

使用webgoat靶场

使用以下代码拉取环境

java -jar webgoat-server-8.1.0.jar --server.port=8888 --server.address=10.4.7.138

访问该网址进入靶场

http://10.4.7.138:8888/WebGoat/login

本文打的靶场为jwt tokens

image-20231208163922218

4

此处点票点到8

image-20231208164109569

用户为jerry

点击垃圾桶后显示只有admin用户才可以

此处开启bp抓包,

找到刚才发送的post请求包

image-20231208164513479

发给repeater

可以看到这一串jwt

image-20231208164557693

使用jwt.io

将刚才jwt粘贴进去

可以看到右边解码的结果

image-20231208164706930

此处需要将加密方式改为none,admin改为true

使用base64编码完成

image-20231208164907152

image-20231208164943957

去掉等号将结果粘过去到一起

image-20231208165013539

最终使用header和payload部分,包含点

ewogICJhbGciOiAibm9uZSIKfQ.ewogICJpYXQiOiAxNzAyODg5MDQ3LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJKZXJyeSIKfQ.

替换bp中原始部分

发包即可成功

image-20231208165143747

回到网页重新看一下,发现操作完成变成1

image-20231208165221743

5

将它提供的jwt放进去看看

image-20231208171544816

将jwt写入一个文本文件

eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTcwMjAyNjAwNywiZXhwIjoxNzAyMDI2MDY3LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19

另一个为字典文件

victory
secret1
business
washington

然后使用工具进行爆破

hashcat -m 16500 2.txt -a 3 -w 2 1.txt --force

其中

-m 16500 这里的16500对应的就是jwt的token爆破;

-a 3 代表蛮力破解

-w 3 可以理解为高速破解,就是会让桌面进程无响应的那种高速

2.txt为jwt

1.txt为字典

爆破得到密钥

image-20231208173014689

修改截至时间和username

image-20231208173237853

然后粘贴过去再将密钥换成刚刚爆破出来的

最后得到

eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTcwMjAyNzkwNywiZXhwIjoxNzAyMDMzNTUwLCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IldlYkdvYXQiLCJFbWFpbCI6InRvbUB3ZWJnb2F0Lm9yZyIsIlJvbGUiOlsiTWFuYWdlciIsIlByb2plY3QgQWRtaW5pc3RyYXRvciJdfQ.3IMBgQVgvJzL1m7nE3XLXdfF--ja1ouXcjLNdKqvw5g

然后提交jwt即可

image-20231208174005244

7

image-20231208165810892

第七关要求以tom的身份付款

并且给了日志信息提示,可以看到jwt

image-20231208165948663

粘贴过来可得

image-20231208170042238

会发现这个到期时间已经过期了

image-20231208170249353

这个时间格式是unix纪元时间

使用在线工具获取现在的时间戳,然后base64

image-20231208170625616

eyJhbGciOiJIUzUxMiJ9.ewogICJpYXQiOiAxNTI2MTMxNDExLAogICJleHAiOiAxNzAyMDI2MzYxLAogICJhZG1pbiI6ICJmYWxzZSIsCiAgInVzZXIiOiAiVG9tIgp9.

将该字段的值更改为新的jwt过后即可完成

image-20231208171003749

http://www.lryc.cn/news/258212.html

相关文章:

  • Android Studio新版UI介绍
  • 基于ssm应急资源管理系统论文
  • K8S学习指南(9)-k8s核心对象init pod
  • 以太坊:前世今生与未来
  • vue3若依框架,在页面中点击新增按钮跳转到新的页面,不是弹框,如何实现
  • 【大模型】800万纯AI战士年末大集结,硬核干货与音乐美食12月28日准时开炫
  • linux配置python环境
  • 【教程】app备案流程简单三部曲即可完成
  • C++使用vector创建二维数组并指定大小
  • Spring支持哪几种事务管理类型,Spring 的事务实现方式和实现原理是?
  • 书-二分查找找某个数字p155
  • 【NLP】RAG 应用中的调优策略
  • Android-Framework 默认隐藏导航栏,添加控制显示属性
  • 【AIGC】Midjourney高级进阶版
  • C语言学习----指针和数组
  • 学习Node.js与Webpack总结
  • JAVA基础知识:泛型
  • 【WinRAR】为什么右键没有压缩选项?
  • 数据云:数据基础设施的一小步,数字经济的一大步
  • 极兔速递查询,极兔速递单号查询,筛选出指定派件员的单号
  • 条款25:考虑写出一个不抛出异常的swap函数
  • linux 中crontab 定时任务计划创建时间文件夹示例
  • 欣赏动态之美,不如欣赏C语言实现动态内存管理之美 ! ! !
  • from pycocotools.coco import COCO报错
  • CentOS服务自启权威指南:手动启动变为开机自启动(以Jenkins服务为例)
  • 第二百零一回 介绍一个三方包open_settings
  • iview Table实现跨页勾选记忆功能以及利用ES6的Map数据结构实现根据id进行对象数组的去重
  • 【Spring 源码】 贯穿 Bean 生命周期的核心类之 AbstractAutowireCapableBeanFactory
  • 漏洞复现-某友UFIDA NC系统某接口未授权访问漏洞(附漏洞检测脚本)
  • 树莓派5安装opencv