zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    php连接mysql的三种方式和预处理下的sql注入
    报错注入原理学习
    学习BurpSuite半自动化盲注和一些小总结
    django项目实战
    docker出题和编写dockerfile
    Django零基础到项目实战
    爬虫之某古诗词网站
    [学习笔记] 左偏树入门
    [学习笔记] 自适应Simpson算法
    [题解向] [Luogu P2029]跳舞
  • 原文地址:https://www.cnblogs.com/ophxc/p/13647605.html
Copyright © 2011-2022 走看看