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
Links Úteis
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