JWTBP 靶场
JWT
是一种用于身份认证和授权的开发标准,通过在网络中传递加密的JSON
数据使用这种方式让传输变得安全和简单,对于渗透它是一种攻击途径,因为可以获得无限访问权限的关键,而且还被视为隐藏,例如特权升级,信息泄露,SQL
,XSS
SSRF
RCE
# 协议介绍
# 认证原理
将用户的信息加密到 Token
中, 服务器不保存任何的用户信息,只保留密匙信息,再通过特定的算法去验证 ** Token
** 认证用户身份, JWT
生成的 Token 身份验证可以替代传统的 cookie
+ session
身份验证方法。
# 基本结构
JWT
的结构由三部分组成 分别是 Header
、 Payload
、 Signature
Header
包含了 JWT 使用的算法和类型等元数据,通过使用 JSON 对象表示并使用 Base64 编码,其中包含两个字段 alg
typ
e
1 | alg:指定了使用的加密算法,常见的是HMAC RSA ECDSA等算法 |
Payload
包含了主要信息,通常使用 JSON 对象表示并使用 Base64 编码,它拥有 3 个类型的字段
注册声明 公共声明 私有声明
1 | 公共声明(Public Claims):是自定义的字段,用于传递非敏感信息,例如:用户ID、角色等 |
Signature
是使用指定算法对 Header 和 Payload 进行签名生成的,对前面的 “xxx.yyy” 用头部中声明的加密方法进行加密,用于验证 JWT 的完整性和真实性,
Signature
的生成方式通常是将 Header 和 Payload 连接起来然后使用指定算法对其进行签名,最终将签名结果与 Header 和 Payload 一起组成 JWT,Signature 的生成和验证需要使用相同的密钥,下面是一个示例 Signature
1 | 验证了上文中的描述,生成是将二者连接然后使用特定的算法对其加密签名,再组成JWT, |
加密后将 3 者连接就形成了完整的 JWT
, 第一部分是 Header
,第二部分是 Payload
,第三部分是 Signature
,注意 JWT 中的每一部分都是经过 Base64
编码的,但并不是加密的,因此 JWT
中的信息是可以被解密的
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. |
# 在线解密
# 渗透姿势
JWT 渗透爆破姿势
攻击 JWT 的一些方法
JWT 攻击手册 (附 jwt_tool 用法,爆破弱密钥等)
# 空加密算法
JWT
支持使用空加密算法,可以在 header
中指定 alg 为 None
空加密算法的设计初衷是用于调试的,但是如果某天开发人员脑阔瓦特了,在生产环境中开启了空加密算法,缺少签名算法, jwt
保证信息不被篡改的功能就失效了。攻击者只需要把 alg
字段设置为 None
,就可以在 payload
中构造身份信息,伪造用户身份
1 | { |
1 | (header+'.'+payload,去掉了'.'+signature字段) |