JWT漏洞

JWT

原理

JWT(JSON Web Token)是一种用于在网络应用之间传递信息的开放标准(RFC 7519),它通过数字签名来验证数据的完整性和来源。JWT通常被用作身份验证和授权机制,允许用户在不同系统之间传递安全可靠的信息。

一个JWT由三部分组成,分别是Header(头部)、Payload(载荷)和Signature(签名),它们使用.分隔开。具体结构如下:

xxxxx.yyyyy.zzzzz
  1. Header:头部包含了关于该JWT的元数据,通常包括两部分:令牌的类型(比如"JWT")和所使用的签名算法(比如HMAC SHA256或RSA)。
  2. Payload:载荷包含了要传递的数据,可以包括用户的身份信息、权限等。Payload可以包含一些预定义的声明(registered claims),也可以包含一些自定义的声明(public claims)。
  3. 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漏洞

  1. 缺乏机密性
  2. 插入操作绕过授权
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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值