| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 浅谈JWT伪造 -> 正文阅读 |
|
[网络协议]浅谈JWT伪造 |
目录 写这篇文章时候五味杂陈,颓废了一个寒假,好像学了,但好像也没学多少,不知是放假前对自己的期待太大了,还是假期真的太放肆了,学了一扣扣皮毛东西,但是值得庆幸的是遇到了该遇到的人。希望在这个学期我们不是互相消耗,而是一起成长,完成该有的目标。 简介JWT是JSON Web Token。http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道到底是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登陆的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的的session认证。 但是这种基于session的认证是应用本身很难的得到扩展,随着不同客户端用户的的增加,独立的服务器已无法承载更多的用户,这时候session认证应用的问题就会暴露出来 一个 jwt token 由三部分组成,header、payload 与 signature,以点隔开,形如 举个栗子吧
内容header header是用来声明token的类型和签名用的算法,需要经过base64编码比如以上token得到头部经过base64解码后为 payload payload用来表示真正的token信息,也需要经过base64编码。比如上面的token的payload经过解码后为
JWT 规定了7个官方字段,供选用 iss (issuer):签发人 exp (expiration time):过期时间 sub (subject):主题 aud (audience):受众 nbf (Not Before):生效时间 iat (Issued At):签发时间 jti (JWT ID):编号 signature 将前两部分用 解码一般推荐去这个网站解码,拿上面这个例子
解密前
解密后
JWT 的安全问题1.修改算法为none 2.修改算法从RS256到HS256 3.信息泄漏 密钥泄漏 4.爆破密钥 存在的漏洞
简单无加密题目
公私钥泄露RS256 (采用 SHA-256 的 RSA 签名) 是一种非对称算法, 它使用公共 / 私钥对: 标识提供方采用私钥生成签名, JWT 的使用方获取公钥以验证签名。由于公钥 (与私钥相比) 不需要保护, 因此大多数标识提供方使其易于使用方获取和使用 (通常通过一个元数据 URL)。 如果header里面的alg是RS256,就把jwt.io中分别把公私密匙复制进去,然后替换cookie即可 密匙弱口令爆破推荐几个工具:
看见题干说是弱口令,去 jwt.io 解码 解码前
解码后发现还是 HS256 对称加密 { "alg": "HS256", "typ": "JWT" } { "iss": "admin", "iat": 1609237366, "exp": 1609244566, "nbf": 1609237366, "sub": "user", "jti": "7783263d2185ec8ea0ab6626f1991db8" } 既然题目说是弱口令我们尝试使用最简单的弱口令 123456, 成功,接下来我们只需要拿着这个密钥去生成 jwt 即可 密匙混淆攻击JWT 签名算法中,一般有两个选择,一个采用 HS256, 另外一个就是采用 RS256。 签名实际上是一个加密的过程,生成一段标识作为接收方验证信息是否被篡改的依据。 RS256 (采用 SHA-256 的 RSA 签名) 是一种非对称算法, 它使用公共 / 私钥对: 标识提供方采用私钥生成签名, JWT 的使用方获取公钥以验证签名。由于公钥 (与私钥相比) 不需要保护, 因此大多数标识提供方使其易于使用方获取和使用 (通常通过一个元数据 URL)。 另一方面, HS256 (带有 SHA-256 的 HMAC 是一种对称算法, 双方之间仅共享一个 密钥。由于使用相同的密钥生成签名和验证签名, 因此必须注意确保密钥不被泄密。 在开发应用的时候启用 JWT,使用 RS256 更加安全,你可以控制谁能使用什么类型的密钥。另外,如果你无法控制客户端,无法做到密钥的完全保密,RS256 会是个更佳的选择,JWT 的使用方只需要知道公钥。由于公钥通常可以从元数据 URL 节点获得,因此可以对客户端进行进行自动检索公钥。如果采用这种方式,从服务器上直接下载公钥信息,可以减少配置信息。 利用方法 由于 jwt 在 python 和 nodejs 的库不同,造成在这里只能自己手动生成了, 之后运行 nodejs 获取 cookie 去替换即可
so!JWT 配置应该只允许使用 HMAC 算法或公钥算法,决不能同时使用这两种算法 签名算法可被修改为 none前言: 枯燥的寒假生活中碰到这样一个有趣的题,就是这个类型,但是刚开始没接触jwt伪造的我看到这个题非常恼火。 JWT 支持将算法设定为 “None”。如果“alg” 字段设为“ None”,那么签名会被置空,这样任何 token 都是有效的。 设定该功能的最初目的是为了方便调试。但是,若不在生产环境中关闭该功能,攻击者可以通过将 alg 字段设置为 “None” 来伪造他们想要的任何 token,接着便可以使用伪造的 token 冒充任意用户登陆网站。 开始做题! 先拿到
解码 { "alg": "HS256", "typ": "JWT" } { "iss": "admin", "iat": 1609236870, "exp": 1609244070, "nbf": 1609236870, "sub": "user", "jti": "943d0b3237806659d2e205e42b319494" } 我们需要把sub改成admin,但是如果把签名算法改成none的话,jwt.io那个网站就无法生成,这个时候可以使用python生成
将生成的字符串来替换原有的 cookie 获得 flag |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 7:32:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |