JWT中的安全隐患

JWT特征

JWT生成的token.连接的三段字符串组成,即{HEADER}.{PAYLOAD}.{SIGNATURE}

  • HEADER

    HEADER是对算法和token类型进行base64Url加密。如以下JSON对应的HEADEReyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9,这是token的第一部分。

    1
    2
    3
    4
    {
    "alg": "HS256",
    "typ": "JWT"
    }
  • PAYLOAD

    PAYLOAD是对传输的数据进行base64Url加密。如以下JSON对应的PAYLOADeyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTY2MTg0NDUyNiwiZXhwIjoxNjYxODQ0NTg2LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19,这是token的第二部分。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
    "iss": "WebGoat Token Builder",
    "aud": "webgoat.org",
    "iat": 1661844526,
    "exp": 1661844586,
    "sub": "tom@webgoat.org",
    "username": "Tom",
    "Email": "tom@webgoat.org",
    "Role": [
    "Manager",
    "Project Administrator"
    ]
    }
  • SIGNATURE

    SIGNATURE是对HEADERPAYLOAD的密文用.连接后,对该字符串使用HMACSHA256加密,然后再进行base64Url加密,这是token的第三部分。

攻击方式

  • 空加密算法

    JWT支持使用空加密算法,在HEADER中的alg指定为None,设置SIGNATURE为空即可。如果使用了空加密算法,任何token都可以通过验证,但需要服务器开启空加密算法。

  • 爆破密钥

    在获得token的情况下,我们已经知道了加密算法,这样就可以通过爆破的方式进行破解。但如果密钥复杂,则无法爆破成功。

  • 修改kid参数

    kid参数用于指定密钥文件,如果该变量可控,可能会导致任意文件读取和SQL注入的问题。