Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JWT在CTF中的问题

JWT在CTF中的问题

作者头像
字节脉搏实验室
发布于 2020-04-25 05:54:51
发布于 2020-04-25 05:54:51
6.1K00
代码可运行
举报
运行总次数:0
代码可运行

0x00、知识点:

JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案

它的构成:第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

类似于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

header

jwt的头部承载两部分信息:

  • 声明类型,这里是jwt
  • 声明加密的算法 通常直接使用 HMAC SHA256

完整的头部就像下面这样的JSON

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  'typ': 'JWT',
  'alg': 'HS256'
}

然后将头部进行Base64加密构成了第一部分.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

payload

载荷就是存放有效信息的地方。这些有效信息包含三个部分。

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明

标准中注册的声明 (建议但不强制使用) :

  • iss: jwt签发者
  • sub: jwt所面向的用户
  • aud: 接收jwt的一方
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间
  • nbf: 定义在什么时间之前,该jwt都是不可用的.
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

公共的声明

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可进行解码.

私有的声明

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息。

定义一个payload:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "sub": "1234567890",
  "name": "purplet",
  "admin": true,
  "secretid": 1
}

然后将其进行base64加密,得到Jwt的第二部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ew0KICAic3ViIjogIjEyMzQ1Njc4OTAiLA0KICAibmFtZSI6ICJwdXJwbGV0IiwNCiAgImFkbWluIjogdHJ1ZSwNCiAgInNlY3JldGlkIjogMQ0KfQ

signature

jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

  • header (base64后的)
  • payload (base64后的)
  • secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。加密方式如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);

var signature = HMACSHA256(encodedString, 'secret');

最后将这三部分用.连接成一个完整的字符串,构成了最终的jwt。

0x01 、Node的JWT库的空加密缺陷

以下内容学习基于两道CTF题。

虎符CTF的WEB(easy_login)

该题开始是一个登录框,经过随意注册一个用户后,再进行登录后提示没有权限登录,这一点我们直接就可以猜测出是要求admin用户登录,然后我们在注册处利用BP抓包放包后可以看到有一串JWT的字符、

并且在登录时也会发现该JWT字符会作为身份验证部分与用户名、密码一起通过POST方法表单传递到后端进行验证。所以可以想到JWT的伪造,同时结合题目的描述与node有关,学习到node

的JWT库的空加密缺陷问题。对普通用户的JWT进行base64解码如下

解题:

首先注册登陆采用jwt认证,但是jwt的实现很奇怪,逻辑大概是,注册的时候会给每个用户生成一个单独的secret_token作为jwt的密钥,通过后端的一个全局列表来存储,登录的时候通过用户传过来的secretid取出对应的secret_token来解密jwt,如果解密成功就算登陆成功。

然而,node 的jsonwebtoken库存在一个缺陷,也是jwt的常见攻击手法,当用户传入jwt secret为空时 jsonwebtoken会采用algorithm none进行解密。

因为服务端 通过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var secret = global.secretlist[secretid];
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 jwt.verify(req.cookies.token,secret);

解密,我可以通过传入不存在的id,让secret为undefined,导致algorithm为none,然后就可以通过伪造jwt来成为admin

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pip3 install pyjwt
import jwt

token = jwt.encode({"secretid":"","username":"admin","password":"123456","iat":1587367857},algorithm="none",key="").decode(encoding='utf-8')

print(token)

因为我们知晓了JWT的原理,所以也可以直接对内容进行base64编码, 可以根据其node的JWT缺陷将secretid置为空,所以构造以下payload

{"alg":"HS256","typ":"JWT"}.{"secretid":"","username":"admin","password":"123456","iat":1587367857}.

对其直接进行base64加密后,注意“点”不要加密同时最后不要拼接第三段,用户名和密码写上构造的admin/123456,抓登陆包。

即可登录,获得flag

0x02、JWT-cookie伪造

[CISCN2019 华北赛区 Day1 Web2]ikun

该题我只对JWT部分进行记录

注册普通用户登录后首先可以看到有1000元

而按照题目要求需要购买lv6,它的价格又十分昂贵,抓包后看到有discount参数,尝试将其改的特别小,使我们能够购买成功。成功购买后但是出现

这就很明显需要我们越权进行登录,查看cookie此时可以看到一段JWT

看到JWT长度较短,所以可以考虑利用工具将JWT的第三段密钥爆破出来

工具链接如下:

https://github.com/brendan-rius/c-jwt-cracker

爆破密钥

知道密钥后,我们就可以任意构造JWT了,利用在线网站:https://jwt.io/

这样就实现了admin用户身份的伪造,将所得内容替换回去(可以利用火狐插件EditThisCookie),最终即可以admin用户身份登录。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 字节脉搏实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET Core 集成JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
Echo_Wish
2023/11/30
3890
ASP.NET Core 集成JWT
什么是JWT(JSON WEB TOKEN)
转自于:http://www.jianshu.com/p/576dbf44b2ae
莫问今朝
2018/08/31
1.1K0
什么是JWT(JSON WEB TOKEN)
token的使用及原理
说起JWT,我们应该来谈一谈基于token的认证和传统的session认证的区别。
IT云清
2019/01/22
5.2K0
聊一聊分布式会话的解决方案
解决方案如下:统一将用户信息存入redis中,从redis中去获取登录的用户信息,这样就可解决分布式session了
小熊学Java
2023/07/16
4510
聊一聊分布式会话的解决方案
还不会用JWT?咱们通过单点登录来熟悉下
JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案之一,今天我们一起来揭开它神秘的面纱!
程序员小跃
2020/05/18
1K0
还不会用JWT?咱们通过单点登录来熟悉下
读懂JWT的使用,你就会用PHP如何实现了
什么是JWT JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。
友儿
2022/09/11
9930
什么是JWT?
JSON Web Token (JWT) 是一个开源标准(RFC 7519),它定义了一种紧凑且自完备的方法用于在各参与方之间以JSON对象传递信息。以该种方式传递的信息已经被数字签名,因而可以被验证并且被信任。JWT既可以使用盐(secret)(HMAC算法)进行签名,也可以使用基于RSA/ECDSA算法的公钥/秘钥对进行签名。
Steve Wang
2022/04/13
9680
什么是JWT?
彻底搞懂JWT,看这篇就够了!
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分
架构师修炼
2020/09/24
1.6K0
彻底搞懂JWT,看这篇就够了!
什么是JWT的Token认证机制?
我们用JWT首先要知道什么是JWT? JSON Web Token(JWT)是一个非常轻巧的规范。 这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
用户9006224
2022/12/21
9360
安全攻防 | JWT认知与攻击
JWT是JSON web Token的缩写,它是为了在网络应用环境间传递声明而执行的一种基于JSON的开放式标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的业务逻辑所必须声明信息,该token也可被直接用于认证,也可用作加密。
安全小王子
2021/03/16
6.4K0
解释一下什么是前后端分离的核心 JWT
这份登录信息,会在传递的时候,无状态的传递给浏览器,告诉其保存为cookie。以便下次的时候,告诉那个用户。
mySoul
2020/06/02
6780
JSON WEB TOKEN (JWT)
JSON WEB TOKEN简称为JWT,是一个基于JSON的开放标准,用于通信双方之间传递安全信息的简洁的、URL安全的表述性声明规范,经常用于身份验证。
WindRunnerMax
2020/08/27
5580
DRF JWT认证(一)
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
HammerZe
2022/05/09
4640
DRF JWT认证(一)
微服务网关和Jwt令牌 入门学习!
对于微服架构的项目,不同的微服务会有不同的网络地址, 外部客户端可能需要调用多个服务的接口才能完成一个业务需求, 如果让客户端直接与各个微服务通信,会有以下的问题:
Java_慈祥
2024/08/06
2700
微服务网关和Jwt令牌 入门学习!
JWT登录信息加密
对于传统的单点登录系统,使用cookie和session的方式存储用户登录信息,但是对于安全性要求较高的企业–金融企业,就需要对用户的信息进行加密存储,防止客户信息泄露。
MiChong
2020/09/24
9270
JWT原理构成与使用(带案例简单易懂)[通俗易懂]
现在,前端与后端分处不同的域名,这就涉及到跨域访问数据的问题,因为浏览器的同源策略,默认是不支持两个不同域间相互访问数据,而我们需要在两个域名间相互传递数据,这时我们就要为后端添加跨域访问的支持。
全栈程序员站长
2022/11/07
9680
JWT原理构成与使用(带案例简单易懂)[通俗易懂]
基于JWT的Token认证机制实现
​JSONWebToken(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
名字是乱打的
2022/05/13
5000
基于JWT的Token认证机制实现
手把手带你使用JWT实现单点登录
JWT(英文全名:JSON Web Token)是目前最流行的跨域身份验证解决方案之一,今天我们一起来揭开它神秘的面纱!
潘志的技术笔记
2024/07/02
3950
手把手带你使用JWT实现单点登录
Spring Security 之 JWT介绍
Json Web Token 简称JWT,是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递JSON对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥来签名,防止被篡改。
阿提说说
2022/11/18
4840
Spring Security 之 JWT介绍
面试官:JWT Token的原理是啥?
是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。
小锟哥哥
2022/05/10
7070
面试官:JWT Token的原理是啥?
相关推荐
ASP.NET Core 集成JWT
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验