理论基础
-
什么是Token
Token全称JSON Web Token,又简称JWT,是一种用于身份验证和授权的开放标准。它是一种轻量级的、基于JSON的令牌,可以在客户端和服务器之间传递信息。JWT由三部分组成:header(头部).payload(载荷).signature(签证),形似如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IlJvY2siLCJhZG1pbiI6dHJ1ZX0. FgWU4K2h_NpZsfb9FxJcsmKRb3dNNlIgDeuD4onIx4A
其中header和payload部分由base64 URL编码进行编码,JWT Signature部分可以使用 HMAC 算法或使用 RSA 的公钥/私钥对进行签名。JWT的优点包括可扩展性、可靠性和安全性。
简单的说,JWT就是通过数字签名的方式,以JSON对象为载体的开发标准,可以在不同的服务终端之间安全的传输信息。
详细介绍:CSDN-JWT详解
-
Token伪造漏洞
Token伪造,顾名思义通过伪造JWT,以特定账户的身份欺骗系统完成验证。Token伪造是一类漏洞的统称,可以是最简单的弱密钥爆破,也可以是其他高危漏洞,但无论类型如何变化,都是基于Token进行攻击并对其身份认证功能产生威胁。常见的关于Token漏洞如下:
- CVE-2015-2951:alg=none签名绕过漏洞
- CVE-2016-10555:RS / HS256公钥不匹配漏洞
- CVE-2018-0114:Key injection漏洞
- CVE-2019-20933 / CVE-2020-28637:Blank password漏洞
- CVE-2020-28042:Null signature漏洞
- JWKS欺骗
- “kid”注射
- 跨服务中继攻击
- 弱密钥
- ……
- Token漏洞防御
- 避免在令牌中直接传输用户的敏感数据以及系统内部的关键参数。
- 若使用对称加密算法,应使用强密钥提高秘钥破解的难度。
- 若使用非对称加密算法,应在服务端增加已授权算法的白名单,限制签名算法类型,防止密钥混淆攻击。
- 严格验证并过滤从用户端接收的数据,例如kid、jku等关键参数,防止因没有对参数进行正确校验而产生的安全风险。
- 在Payload字段中增加一些业务上的字段,用于校验。
实践学习
漏洞环境以Pilot靶场为例:下载地址与部署教程
-
使用任意账号登录,并抓包。这里以账号密码
pilot/123456
为例: -
在响应包中获得Token值。返回WEB页面,点击身份认证按钮并抓包:
-
可以成功验证登录账号身份为
pilot
。 -
修改参数
username
为管理员账号admin
,尝试伪造身份: -
提示Token过期或错误,说明Token信息与
username
参数传入的值不匹配,无法验证admin
身份。 -
复制Token值至Token爆破工具jwtcracker,尝试爆破密钥:
-
获得Token密钥为“1”,通过JWT官方网站伪造Token:
-
复制修改后的Token,替换身份认证API中的Token值,再次验证:
-
通过修改Token,成功伪造身份为
admin
。