JWT
原理
JWT(JSON Web Token)是一种用于在网络应用之间传递信息的开放标准(RFC 7519),它通过数字签名来验证数据的完整性和来源。JWT通常被用作身份验证和授权机制,允许用户在不同系统之间传递安全可靠的信息。
一个JWT由三部分组成,分别是Header(头部)、Payload(载荷)和Signature(签名),它们使用.
分隔开。具体结构如下:
xxxxx.yyyyy.zzzzz
- Header:头部包含了关于该JWT的元数据,通常包括两部分:令牌的类型(比如"JWT")和所使用的签名算法(比如HMAC SHA256或RSA)。
- Payload:载荷包含了要传递的数据,可以包括用户的身份信息、权限等。Payload可以包含一些预定义的声明(registered claims),也可以包含一些自定义的声明(public claims)。
- Signature:签名部分由对Header和Payload的编码后的字符串以及一个密钥组成,通过指定的算法生成。签名用于验证消息的完整性和来源,确保信息在传输过程中没有被篡改。
<?php
// 引入依赖库
require 'vendor/autoload.php';
use Firebase\JWT\JWT;
// 密钥
$key = 'your_secret_key';
// 载荷(Payload)
$payload = array(
"user_id" => 123,
"username" => "john_doe"
);
// 生成 JWT
$jwt = JWT::encode($payload, $key);
echo "生成的 JWT:$jwt\n";
// 验证 JWT
try {
$decoded = JWT::decode($jwt, $key, array('HS256'));
print_r((array) $decoded);
} catch (Exception $e) {
echo '验证失败:' . $e->getMessage();
}
?>
JWT的工作流程通常如下:
- 用户进行身份验证后,服务器生成JWT并返回给用户。
- 用户在后续请求中将JWT放在请求头中或作为参数传递给服务器。
- 服务器接收到JWT后,验证签名并解析Payload,从中获取用户信息和权限。
- 服务器根据Payload中的信息进行授权操作,允许或拒绝用户的请求。
JWT漏洞
- 缺乏机密性
- 插入操作绕过授权
https://authlab.digi.ninja/
base64解密,md5解密
具体实现方式
1、算法为none
2、算法修改
3、签名失败问题
4、暴力破解
5、密钥泄露
6、令牌刷新
攻击思路
首先找到需要JWT鉴权后才能访问的页面,如个人资料页面,将该请求包重放测试:
1)未授权访问:删除Token后仍然可以正常响应对应页面
2)敏感信息泄露:通过JWt.io解密出Payload后查看其中是否包含敏感信息,如弱加密的密码等
3)破解密钥+越权访问:通过JWT.io解密出Payload部分内容,通过空加密算法或密钥爆破等方式实现重新签发Token并修改Payload部分内容,重放请求包,观察响应包是否能够越权查看其他用户资料
4)检查Token时效性:解密查看payload中是否有exp字段键值对(Token过期时间),等待过期时间后再次使用该Token发送请求,若正常响应则存在Token不过期
5)通过页面回显进行探测:如修改Payload中键值对后页面报错信息是否存在注入,payload中kid字段的目录遍历问题与sql注入问题
JWT漏洞利用工具
1、jwt_tool(git clone https://github.com/ticarpi/jwt_tool)
可以用来验证、伪造和破解JWT令牌。
2、jwt-cracker
该工具仅限于单一的签名算法(HS256) ,如果提供了不同的签名算法,则无法进行操作
https://github.com/lmammino/jwt-cracker
3、c-jwt-cracker
同样是暴力破解 JWT 私钥的工具。
了不同的签名算法,则无法进行操作
https://github.com/lmammino/jwt-cracker
3、c-jwt-cracker
同样是暴力破解 JWT 私钥的工具。
https://github.com/brendan-rius/c-jwt-cracker