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之后,逆向太菜了,没搞出来。
相关工具: