JWT - JSON Web Token

Introdução

JSON Web Token ou JWT é um padrão criado para a transferência segura de dados em forma de objetos JSON. Por meio de um signed token, ele assegura a validade das informações presentes nele. Ele é mais popularmente utilizado para autorizações de login.

Uma vez que o usuário é logado em alguma aplicação, ele recebe um JWT contendo sua identificação. A partir dai, toda requisição para o servidor deverá ter junto o JWT identificando o usuário. O JWT garante que essa identificação não possa ser alterada, impedindo que agentes maliciosos realizem ações como outros usuários.

Estrutura do JWT

O JWT é composto por três partes que são separadas por ponto: header.payload.signature.

O header é um objeto JSON codificado em base64 contendo as informações sobre o tipo de token (que será o JWT) e o algoritmo de assinatura (HMAC SHA256, RSA).

O payload será outro objeto JSON codificado em base64 contendo as informações que serão transferidas entre o cliente e o servidor.

A signature será criada a partir das duas primeiras partes mais uma secret mantida no servidor, que serão passadas para algum algoritmo de hashing ou criptografia definido no header. Por exemplo, signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

Aplicação aceitando signatures arbitrárias

Bibliotecas JWT normalmente fornecem um método para verificar o token e outro para decodificá-lo. Por exemplo, a biblioteca para o Node.js jsonwebtoken tem o verify() e o decode(). Muitas vezes, os desenvolvedores podem confundir o método verify() pelo decode(), fazendo a aplicação sem checar a signature.

Aplicação aceitando tokens sem signature

O parâmetro alg do header de um JWT pode ser configurado como none. Desse jeito, se não houver uma signature no token, o token será automaticamente aceito. Servidores, geralmente, rejeitam tokens sem signature, tornando esse metódo raro de dar certo.

Brute forcing a secret

É possível fazer brute force da secret, para então falsificar JWT e ganhar acesso indevido em alguma aplicação. Para isso, pode-se usar a ferramenta hashcat: Para HMAC: hashcat -a 0 -m 16500 <jwt> <wordlist> \

Uma boa wordlist para usar nesse caso é a jwt-secrets (https://github.com/wallarm/jwt-secrets.git)

Depois de encontrar a secret correta, deve-se forjar um JWT token válido. Para fazer isso, pode-se usar a extension do BurpSuite JWT Editor ou o código python jwt_cracker.py

Artigo do PortSwigger: https://portswigger.net/web-security/jwt Site do JWT: https://jwt.io/introduction Wordlist de JWT secrets: https://github.com/wallarm/jwt-secrets.git Site para alterar JWT: https://token.dev/

Atualizado