当前位置: 首页 > news >正文

渗透测试之json_web_token(JWT)

JSON Web Tokens

JWT官方文档:https://www.jwt.io/introduction#what-is-json-web-token

JSON Web Token (JWT) 是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息,以 JSON 对象的形式。这些信息可以被验证和信任,因为它经过数字签名。JWT 可以使用密钥(使用 HMAC 算法)或 RSA 或 ECDSA 的公钥/私钥对进行签名。

了解JWT: https://blog.csdn.net/weixin_65211978/article/details/126894056

创建和验证 JWT token

注意:使用的秘钥需要相对复制,否则容易被破解

python

pip install PyJWT  # 安装 jwt 
import jwt
# jwt加密 (payload 数据, 秘钥信息, 加密算法)
jwt.encode({'username': 'admin'}, 'admin', algorithm='HS256')  
# jwt解密 (JWT Token, 秘钥, 加密算法)
jwt.decode(self.get_cookie("jwt_demo").encode('utf-8'), jwt_secret, algorithms=['HS256'])  

在这里插入图片描述

java

https://blog.csdn.net/weixin_44494373/article/details/113173326

  1. 导入maven
    <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
    <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
    </dependency>
  2. 生成 Token
    public static String tokens(Map<String, Object> claims, String secretKey, int millisecond, String jwtIssuer, String jwtAud) {//获取当前的时间Calendar calendar = Calendar.getInstance();Date date = new Date(System.currentTimeMillis());calendar.setTime(date);//向后退后秒数calendar.add(Calendar.MILLISECOND, millisecond);Date endTime = calendar.getTime();JwtBuilder builder = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, secretKey).setClaims(claims).setIssuedAt(new Date()).setExpiration(endTime).setIssuer(jwtIssuer).setAudience(jwtAud);return builder.compact();}
  3. 解密验证
    public static Claims parse(String jwt, String secretKey) throws JwtExpireException, JwtVerifyException , JwtNotExistException{Claims claims = null;try {claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();} catch (ExpiredJwtException expiredJwtException) {throw new ExpiredJwtException("token过期");} catch (JwtException jwtException) {throw new JwtException("JWT验证错误");} catch (IllegalArgumentException illegalArgumentException) {throw new IllegalArgumentException("Token为空");}return claims;}

    php

    https://blog.csdn.net/Crazy_shark/article/details/142147246

    <?phpclass JWT
    {private static $secretKey = 'your_secret_key'; // 加密使用的秘钥private static $algo = 'HS256';  // 使用的算法/*** 生成JWT* * @param array $payload 数据负载* @return string*/public static function generateJWT($payload){// 1. 生成header$header = json_encode(['alg' => self::$algo, 'typ' => 'JWT']);$base64Header = self::base64UrlEncode($header);// 2. 生成payload$base64Payload = self::base64UrlEncode(json_encode($payload));// 3. 生成signature$signature = hash_hmac('sha256', "$base64Header.$base64Payload", self::$secretKey, true);$base64Signature = self::base64UrlEncode($signature);// 4. 组合JWT$jwt = "$base64Header.$base64Payload.$base64Signature";return $jwt;}/*** 验证JWT* * @param string $token JWT令牌* @return array|bool 如果验证成功返回payload,否则返回false*/public static function verifyJWT($token){// 1. 拆分JWT$parts = explode('.', $token);if (count($parts) !== 3) {return false;}list($base64Header, $base64Payload, $base64Signature) = $parts;// 2. 解码Header和Payload$header = json_decode(self::base64UrlDecode($base64Header), true);$payload = json_decode(self::base64UrlDecode($base64Payload), true);$signature = self::base64UrlDecode($base64Signature);// 3. 验证签名$expectedSignature = hash_hmac('sha256', "$base64Header.$base64Payload", self::$secretKey, true);if (!hash_equals($signature, $expectedSignature)) {return false;}// 4. 验证过期时间if (isset($payload['exp']) && $payload['exp'] < time()) {return false;}return $payload;}/*** Base64URL编码* * @param string $data* @return string*/private static function base64UrlEncode($data){return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');}/*** Base64URL解码* * @param string $data* @return string*/private static function base64UrlDecode($data){return base64_decode(strtr($data, '-_', '+/'));}
    }
    

    说明:

    1. 生成 JWT:

      使用 generateJWT($payload) 方法生成 JWT。
      header 包含签名算法信息(这里使用 HS256),payload 包含用户信息或其他声明。
      用 hash_hmac(‘sha256’) 方法签名生成的 JWT。

    2. 验证 JWT:

      使用 verifyJWT($token) 方法验证 JWT。
      验证签名是否正确,以及 payload 中是否设置了过期时间(可选)。

    3. Base64 编码/解码:

      使用 base64UrlEncode() 和 base64UrlDecode() 实现 URL 安全的 Base64 编码。

JWT Token 破解

jwt 破解关键在于获取到对应的秘钥,如果秘钥较为简单可以直接使用密码字典进行破解。现介绍以下几种秘钥破解工具

jwt-tool

是一个由python编写的,用于验证、伪造、扫描和篡改 JWT(JSON Web Tokens)的工具包,该工具包包含了一下功能:

  • 测试已知漏洞
  • 检查令牌的有效性
  • 扫描配置错误或已知弱点
  • 模糊测试声明值以引发意外行为
  • 测试密钥/文件/公钥/JWKS 密钥的有效性
  • 通过高速字典攻击识别弱密钥
  • 伪造新的令牌头部和有效载荷内容,并使用密钥或通过其他攻击方法创建新签名
  • 时间戳篡改
  • RSA 和 ECDSA 密钥生成及重建(从 JWKS 文件)

特点:速度快

安装:
git clone https://github.com/ticarpi/jwt_tool  # 从github克隆工具
python3 -m pip install -r requirements.txt  # 安装相关依赖

首次运行时,工具会生成一个配置文件、一些工具文件、日志文件以及一套不同格式的公钥和私钥。

使用方法:

python3 jwt_tool.py <JWT> 将验证令牌并列出头部和载荷的值。
python3 jwt_tool.py <JWT> -T 篡改现有令牌,更改令牌中 header 和 payload 的信息,根据提示进行相关修改
python3 jwt_tool.py <JWT> -C -p pass.txt 根据提供的字典识别弱秘钥
python3 jwt_tool.py <JWT> -V -pk public.pem 验证令牌,需要提供额外的参数/文件(此处提供 PEM 格式的公钥)

c-jwt-cracker

一个用 C 语言编写的多线程 JWT 暴力破解工具。如果你非常幸运或者拥有强大的计算能力,这个程序应该能找到 JWT 令牌的秘密密钥,从而让你伪造有效的令牌。

特点:无需字典,破解速度慢

安装:
git clone https://github.com/brendan-rius/c-jwt-cracker  # 从github克隆代码
apt-get install libssl-dev  # 安装 libssl-dev
make  # 手动编译 
运行:
/jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIifQ.rDR715B_5LxTmmxeU2pTXEP_6EaWKq2U50jFXIKeY9Y

在这里插入图片描述

运行完成后可得到秘钥

编码新的JWT Token

  1. 打开网站 https://www.bejson.com/jwt/
  2. 使用原有的 JWT Token 解码出 HeaderPayload
  3. 将工具解析出来的秘钥填写在右侧秘钥栏中
  4. 点击编码按钮获得新的 JWT Token
    在这里插入图片描述
http://www.dtcms.com/a/596774.html

相关文章:

  • c加加聊天室项目
  • Buck电路中的自举电容取值计算
  • 媒体门户网站建设方案个人网页的内容
  • 从抽象符号到现实应用:图论的奥秘
  • 雷池 WAF 免费版实测:企业用 Apache 搭环境,护住跨境电商平台
  • Flutter .obx 与 Rxn<T>的区别
  • C++中的线程同步机制浅析
  • wordpress为什么被墙西安网站seo
  • 网站程序和空间区别电商平台是干什么的
  • 机器学习探秘:从概念到实践
  • 日志易5.4全新跨越:构建更智能、更高效、更安全的运维核心引擎
  • 百度网站名片搜索引擎技术包括哪些
  • Memcached flush_all 命令详解
  • 深入探索嵌入式Linux开发:从基础到实战
  • Java复习之范型相关 类型擦除
  • android6适配繁体
  • Python | 掌握并熟悉列表、元祖、字典、集合数据类型
  • 电子电气架构 --- SOA与AUTOSAR的对比
  • 福田做商城网站建设哪家服务周到中山百度网站推广
  • 【c++】手撕单例模式线程池
  • DNS主从服务器练习
  • 云游戏平台前端技术方案
  • 当前MySQL端口: 33060,可被任意服务器访问,这可能导致MySQL被暴力破解,存在安全隐患
  • Android开发-java版学习笔记第四天
  • C#WEB 防重复提交控制
  • Linux:systemd服务之.service文件(二)
  • 24_FastMCP 2.x 中文文档之FastMCP服务端认证:构建完整的 OAuth 服务器详解
  • Linux:认识Systemd服务(一)
  • Python编程实战 - Python实用工具与库 - 爬取并存储网页数据
  • 网站建设中字样图片wordpress首页调用文章数量