** jwt (json(JavaScript Object Notation 一种轻量级的数据格式) web token),使用json格式的token。**
jwt数据格式
JWT(JSON Web Token)由三部分组成:头部(Header)、载荷(Payload)、签名(Signature)。
头部(Header)
头部作为整个jwt的第一部分,通常由算法类型和令牌类型组成,使用base64url编码表示
算法类型:指定用于生成签名的算法,例如RSA、ECDSA等
令牌类型:指定令牌的类型,常见的是jwt
例如:
{
"alg": "HS256" (算法类型)
"typ": "JWT" (令牌类型)
}
alg:说明此JWT签名使用的算法参数,当alg的值为none时,说明此jwt没有指定算法类型,这通常会导致签名失效,可以被攻击者任意伪造JWT
typ: 说明这个token类型为JWT
载荷(payload)
载荷作为JWT的第二部分,通常包含三部分标准中注册的声明、公共的声明、私有的声明,使用base64url编码表示。
声明:用户id、角色、权限等信息
注册声明:含一些标准的声明(比如发行人、过期时间等)和一些自定义的声明。
例如
{
"sub": "1234666690",
"name": "John Doe",
"iat": 1516239022,
"exp":2222222222(距离 Unix元年(1970年1月1日0时0分0秒 )的时间)
}
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp:jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
签名(Signature)
签名是对头部和载荷进行签名的结果,用于验证 JWT 的完整性和真实性。
将头部和载荷进行 Base64Url 编码后拼接在一起,然后使用指定的加密算法(如 HMAC、RSA)进行签名,将生成的签名添加到 JWT 中。
jwt安全
- 未加密的令牌: JWT可以选择加密(JWE)或不加密(JWS)。在不加密的情况下,令牌的内容是以Base64编码的形式呈现,因此容易被解码。如果敏感信息存储在未加密的JWT中,攻击者可能能够轻松获取这些信息。
- 过期令牌: JWT包含一个过期时间(exp)字段,用于指定令牌的有效期。如果开发人员没有适当处理过期令牌,攻击者可能会利用过期的令牌进行未经授权的访问。
- 令牌篡改: JWT中的信息是以Base64编码的形式进行签名的,但并没有加密。这使得攻击者可以查看和修改令牌的内容。为了防止篡改,开发人员应使用签名算法,并在验证时确保签名正确。
- 安全算法选择不当: JWT支持多种签名算法,如HS256、RS256等。选择弱签名算法或者在密钥管理上出现问题可能导致签名被破解,从而让攻击者伪造有效的JWT。
- 令牌滥用: 如果JWT被窃取,攻击者可能会滥用该令牌访问被授权的资源。为了减轻这种风险,开发人员可以考虑使用https和其他安全措施来保护令牌传输的过程。
- 未考虑令牌刷新机制: 如果令牌支持刷新机制,攻击者可能尝试获取刷新令牌,从而无限期地保持其访问权限。令牌刷新机制应该谨慎设计,以避免安全漏洞。
jwt官网
以WebGoat靶场为例。
启动 (建议使用kali虚拟机)
java -jar webgoat-server-8.1.0.jar --server.port=8888 --server.address=10.4.7.135
访问靶场
注册新用户登录
JWT tokens第四关(未加密的令牌,令牌篡改)
此关卡为伪造jwt token将用户投票全部清空
选择一个用户身份
打开bp抓包, 点击删除 提示我们只有admin用户才可以删除
重发送抓取到的数据包 在cookie信息里看到了JWT数据格式
到jwt官网解码 可以看到算法类型为HS512 显示admin用户false
将算法类型改为none false改为true
替换掉原来的payload和header
将原来的JWT替换为修改后的jwt 再次发送 可以看到已经成功将重置投票了
前端页面修改后的效果
第七关(令牌泄露,令牌篡改)
此关卡为盗用Tom用户的身份进行付款
点击提交购物 提示我们没有JWT令牌
点击提示 发现了一个JWT令牌
解码 发现有个过期的exp
按照第四关思路 将算法类型修改为none 将exp时间修改为未过期时间
通过在线时间戳转换工具转换
修改后的jwt令牌
BP抓取提交购物的信息
将伪造好的JWT令牌放到Authorization(授权)字段里,成功提交
第五关(爆破已泄露的JWT令牌签名)
通关要求:将userame字段Tom修改为WebGoat
由于此处加密类型不支持修改为none 所以我们需要爆破出JWT的密钥
爆破秘钥
hashcat -m 16500 jwt.txt -a 3 -w 2 1.txt --force
-m 16500 这里的16500对应的就是jwt的token爆破;
-a 3 代表蛮力破解
-w 3 可以理解为高速破解,就是会让桌面进程无响应的那种高速
jwt.txt 题目要求破解的token保存的文件
1.txt 密码字典
爆出来的密钥 washington
修改签名,按照要求将用户名修改为WebGoat 同样注意修改exp时间
将构造好的JWT放到题目里 成功通关
版权归原作者 雪里温柔 所有, 如有侵权,请联系我们删除。