jwt攻击手段

jwt

秘钥泄漏/敏感文件泄漏

在一些配置文件被我们可查的情况下,包括各种文件读取,源码泄漏,此时伪造身份就变得很容易了。

空加密算法

对于明文的加密算法通常为HS256,在jwt中分为三个部分,以点分割

=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZWNyZXRpZCI6MSwidXNlcm5hbWUiOiJ0ZXN0IiwicGFzc3dvcmQiOiJ0ZXN0IiwiaWF0IjoxNTk5NzIzNTg0fQ.7vusJvfKRNY8Or2KnUCEoJhKfseOM6-RyAwgLw3WrLU

在第一部分header这里:

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

JWT支持使用空加密算法,只要我们在header中指定alg这个参数为None

{
    "alg" : "None",
    "typ" : "jwt"
}

此时这个加密算法就不存在,那么这个加密秘钥就没用了。

const token = jwt.sign({secretid, username, password}, secret, {algorithm: 'HS256'});
关于KID的修改
kid也是jwt header中的一个可选参数,作用就是指定加密算法的密钥。  

当kid变得可控的时候,就优惠出现很多安全的问题,例如:

任意文件读取:kid如果从文件读取,在服务端上没有做任何的限制的时候,那么kid就可能读取到别的文件,就例如/etc/passwd。 

sql注入:当kid从数据库当中获取,那么可能存在着sql注入。   
修改RSA加密算法为HMAC

在JWT中,除了HS256代表的HMAC还有RSA等加密方式,即RS256。

HMAC是密钥相关的哈希运算消息认证码,他是使用相同的密钥对传输信息进行加解密。

RSA则是一种非对称加密算法,使用私钥加密明文,公钥解密密文。  

这种攻击方式的利用就是

JWT传输过程中使用RSA算法,用私钥进行了加密,最后公钥进行了解密验证。

私钥我们可能搞不到,但是公钥我们可能可以搞到。

此时改一下加密方式:

{                                   {
    "alg" : "RS256",  ---->>>>>     "alg" : "HS256",
    "typ" : "jwt"                      "typ" : "jwt"
}                                    }

此时HMAC被服务端判断,这个时候服务端按照HMAC的方式自动使用公钥进行解密验证。

爆破

jwt可以进行爆破,前几天的DDCTF第一道题就是强制的爆破,可惜后面拿到了client之后,逆向太菜了,没搞出来。

相关工具:

https://github.com/brendan-rius/c-jwt-cracker

原文地址:https://www.cnblogs.com/ophxc/p/13647605.html