JWTBP 靶场

JWT 是一种用于身份认证和授权的开发标准,通过在网络中传递加密的 JSON 数据使用这种方式让传输变得安全和简单,对于渗透它是一种攻击途径,因为可以获得无限访问权限的关键,而且还被视为隐藏,例如特权升级,信息泄露, SQL , XSS SSRF RCE

# 协议介绍

# 认证原理

将用户的信息加密到 Token 中, 服务器不保存任何的用户信息,只保留密匙信息,再通过特定的算法去验证 ** Token ** 认证用户身份JWT 生成的 Token 身份验证可以替代传统的 cookie + session 身份验证方法。

# 基本结构

JWT 的结构由三部分组成 分别是 HeaderPayloadSignature

Header 包含了 JWT 使用的算法和类型等元数据,通过使用 JSON 对象表示并使用 Base64 编码,其中包含两个字段 alg typ e

1
2
3
4
5
6
7
8
9
alg:指定了使用的加密算法,常见的是HMAC RSA ECDSA等算法

typ(type):指定了JWT的类型,通常为JWT

{
"alg": "HS256",
"typ": "JWT"
}

Payload 包含了主要信息,通常使用 JSON 对象表示并使用 Base64 编码,它拥有 3 个类型的字段

注册声明 公共声明 私有声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
公共声明(Public Claims):是自定义的字段,用于传递非敏感信息,例如:用户ID、角色等

私有声明(Private Claims):是自定义的字段,用于传递敏感信息,例如密码、信用卡号等

注册声明(Registered Claims):预定义的标准字段,包含了一些JWT的元数据信息,例如:发行者、过期时间等


{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}

sub表示主题,name表示名称,iat表示JWT的签发时间

Signature 是使用指定算法对 Header 和 Payload 进行签名生成的,对前面的 “xxx.yyy” 用头部中声明的加密方法进行加密,用于验证 JWT 的完整性和真实性,

Signature 的生成方式通常是将 Header 和 Payload 连接起来然后使用指定算法对其进行签名,最终将签名结果与 Header 和 Payload 一起组成 JWT,Signature 的生成和验证需要使用相同的密钥,下面是一个示例 Signature

1
2
3
4
5
6
7
8
9
10
11
12
13
验证了上文中的描述,生成是将二者连接然后使用特定的算法对其加密签名,再组成JWT,
secret是验证和加密的密匙

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

---------------------------------------------------------------------------

HMACSHA256: 使用HMACSH256算法进行加密签名

header和payload都是经过Base64编码过后
(base64UrlEncode(header) + "." +base64UrlEncode(payload),secre


加密后将 3 者连接就形成了完整的 JWT , 第一部分是 Header ,第二部分是 Payload ,第三部分是 Signature ,注意 JWT 中的每一部分都是经过 Base64 编码的,但并不是加密的,因此 JWT 中的信息是可以被解密的

1
2
3
4
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5

# 在线解密

# 渗透姿势

JWT 渗透爆破姿势

攻击 JWT 的一些方法

JWT 攻击手册 (附 jwt_tool 用法,爆破弱密钥等)

# 空加密算法

JWT 支持使用空加密算法,可以在 header 中指定 alg 为 None

空加密算法的设计初衷是用于调试的,但是如果某天开发人员脑阔瓦特了,在生产环境中开启了空加密算法,缺少签名算法, jwt 保证信息不被篡改的功能就失效了。攻击者只需要把 alg 字段设置为 None ,就可以在 payload 中构造身份信息,伪造用户身份

1
2
3
4
5
6
7
8
9
10
11
{
"alg" : "None",
"typ" : "jwt"
}

{
"user" : "Admin"
}

生成的完整token为
ew0KCSJhbGciIDogIk5vbmUiLA0KCSJ0eXAiIDogImp3dCINCn0.ew0KCSJ1c2VyIiA6ICJBZG1pbiINCn0

1
(header+'.'+payload,去掉了'.'+signature字段)

# 工具爆破 JWT