O que realmente significa decodificar um JWT
Decodificar um JWT significa extrair o cabeçalho e a carga útil, que são codificados apenas em Base64URL, para revelar o algoritmo, os metadados e as declarações dentro do token. Esse processo faz não verificar sua autenticidade. Qualquer pessoa pode decodificar um JWT, mas apenas verificando a assinatura determina se o token é confiável. Essa distinção é essencial para autenticação segura e testes de penetração.

Como a decodificação de JWT funciona internamente
Um JSON Web Token consiste em:
css
header.payload.signature Tanto o cabeçalho quanto a carga útil são objetos JSON codificados em Base64URL. Por exemplo:
json
// Cabeçalho
{
"alg": "HS256",
"typ": "JWT"
}
// Carga útil
{
"nome de usuário": "admin",
"role": "SuperUser"
}
A decodificação manual requer apenas operações Base64URL:
python
importar base64, json
def decode_part(segment):
acolchoado = segmento + "=" * (-len(segmento) % 4)
return json.loads(base64.urlsafe_b64decode(padded))
cabeçalho, carga útil, _ = token.split(".")
print(decode_part(header))
print(decode_part(payload))
Isso demonstra uma verdade fundamental sobre segurança: A decodificação de JWT não implica confiança. A verificação legítima requer a verificação da assinatura, do emissor, do público, da expiração e do algoritmo de assinatura.

Ferramentas populares para decodificar tokens JWT
| Ferramenta | Força | Link |
|---|---|---|
| JWT.io | Decodificação em tempo real, experimentos rápidos | https://jwt.io |
| Decodificador de SuperTokens | Interface de usuário limpa e amigável ao desenvolvedor | https://supertokens.com/jwt-encoder-decoder |
| Depurador de token Auth0 | Verificação de nível empresarial | https://auth0.com/docs/tokens |
| PyJWT | CLI + biblioteca Python | https://pyjwt.readthedocs.io |
| jwt-decode (JS) | Decodificador leve no lado do navegador | https://www.npmjs.com/package/jwt-decode |
Exemplos de ataques JWT no mundo real vistos em pentests
A decodificação de JWT torna-se perigosa quando os invasores a combinam com falhas de assinatura, segredos fracos e validação insegura. Veja a seguir os cenários de ataque que aparecem com frequência em compromissos reais.
"alg: none" Bypass de assinatura
As bibliotecas mais antigas aceitavam JWTs não assinados:
json
{
"alg": "none",
"typ": "JWT"
}
Os invasores podem remover totalmente a assinatura e se autenticar sem o segredo.
Força bruta secreta fraca (HS256)
Os desenvolvedores costumam usar segredos como:
nginx
segredo
admin123
senha
Os invasores usam o Hashcat:
css
hashcat -a 0 -m 16500 token.hash wordlist.txt
Algoritmo Confusão (RS256 → HS256)
O atacante:
- Altera o algoritmo de
RS256paraHS256 - Usa a chave pública do servidor como um segredo HMAC
- Forja tokens válidos que concedem funções de administrador
Esse continua sendo um dos ataques JWT mais impactantes já descobertos.

Roubo de token via XSS
Se os JWTs forem armazenados em localStorageos invasores podem roubá-los:
javascript
<script>
fetch("" + localStorage.token);
</script>
Configuração incorreta do CORS que leva à exposição do token
Se as políticas CORS permitirem curingas, as solicitações do navegador podem vazar cookies JWT para domínios controlados por invasores.
Ataques de repetição em tokens móveis de longa duração
Os atacantes extraem tokens de:
- armazenamento local não criptografado
- dispositivos com root
- caches inseguros
A repetição pode ignorar totalmente a MFA.
Código de verificação e decodificação de JWT em vários idiomas
Node.js
javascript
const jwt = require("jsonwebtoken");
const decoded = jwt.verify(token, PUBLIC_KEY, {
algoritmos: ["RS256"],
emissor: "auth.example.com",
público-alvo: "example.com"
});
console.log(decoded);
Ir
ir
token, err := jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) {
return []byte("secret"), nil
})
Ferrugem
ferrugem
let decoded = decode::(
token,
&DecodingKey::from_secret(secret.as_ref()),
&Validation::new(Algorithm::HS256)
);
Fluxo de trabalho de decodificação manual de JWT para pentesters
Durante os pentests, a decodificação do JWT é revelada:
- privilégios armazenados em texto simples
- ausente
expouiat - algoritmo mal configurado
- dados confidenciais na carga útil
- possíveis vetores de escalonamento de privilégios
É assim que os testadores identificam falhas no controle de acesso e escalonam funções.
Decodificador manual de JavaScript (sem biblioteca)
javascript
função decode(seg) {
seg = seg.replace(/-/g, "+").replace(/_/g, "/");
seg += "=".repeat((4 - seg.length % 4) % 4);
return JSON.parse(atob(seg));
}
Cadeias de ataque JWT avançadas (cenários da equipe vermelha)
JWT + IDOR → Aquisição total da conta
Fluxo:
- decodificar JWT
- mudança
"sub": "501"para"sub": "1" - assinar novamente ou ignorar a assinatura
- atingir o ponto de extremidade privilegiado
- Aumentar privilégios
Essa cadeia aparece quase semanalmente nas avaliações de empresas.
JWT + personificação de microsserviço
Uma validação interna fraca permite que os invasores se façam passar por serviços:
- acessar dados de faturamento
- modificar permissões de usuário
- ler filas de mensagens
- contornar gateways de API
Práticas recomendadas de defesa (Equipe azul)
Aplicação rigorosa do algoritmo
python
jwt.decode(token, key, algorithms=["RS256"])
Segredos fortes para HS256
Gerar usando:
perl
openssl rand -hex 32
Validar reivindicações padrão
exp
iss
aud
nbf
Armazenar JWT em cookies HttpOnly
Atenua o roubo de tokens XSS.
Implementar o rodízio de chaves
Use o JWKS para gerenciamento de chaves distribuídas:
Análise de segurança da JWT integrada ao Penligent.ai
Os sistemas de autenticação modernos geralmente usam dezenas de microsserviços, cada um com sua própria lógica JWT. A revisão manual torna-se lenta e propensa a erros. Penligent.aiuma plataforma inteligente de testes de penetração, integra a análise de JWT diretamente em seus fluxos de trabalho de segurança automatizados.
Penligent.ai realiza:
- verificações de validação de assinatura
- Detecção de segredos fracos usando cracking híbrido CPU/GPU
- detecção de incompatibilidade de algoritmos
- testes de manipulação de reclamações
- simulações de abuso de replay e refresh-token
- Varredura de vazamento de tokens em pacotes JS
- correlação de endpoints para detectar validação inconsistente de JWT
Ele também reconstrói cadeias de exploração, como:
- Confusão de chaves RS256 → HS256
- IDOR via adulteração
submarinoreivindicação - escalonamento de privilégios por meio de
funçãocampos
Para aplicativos de grande porte, essa análise automatizada de JWT reduz drasticamente a carga de trabalho manual e, ao mesmo tempo, revela vulnerabilidades que as ferramentas tradicionais geralmente deixam passar.
Matriz abrangente de ataque e defesa do JWT
| Ataque | Descrição | Exemplo | Defesa |
|---|---|---|---|
| alg: nenhum | Remove a assinatura | Campo de assinatura vazio | Rejeitar JWTs não assinados |
| RS→HS Confusão | Chave pública usada como segredo HMAC | Token de administrador forjado | Aplicar o algoritmo |
| Segredo fraco | Força bruta HS256 | "password123" secret | Chave aleatória de 32 bytes |
| Reclamações adulteradas | Modificar função/sub | "Função "admin | Autorização no lado do servidor |
| Roubo de XSS | JS rouba JWT | localStorage.token | Cookies HttpOnly |
| Ataque de repetição | Token de reutilização | Aplicativos móveis | TTL curto, rotação |
| Tokens internos vazados | Representação de serviço | Microsserviços | mTLS, JWKS, escopos |
Considerações finais
Decodificar um JWT é apenas o começo. A verdadeira segurança vem da verificação de assinaturas, da aplicação de algoritmos rigorosos, da validação de declarações, da rotação de chaves e do armazenamento seguro de tokens. Os aplicativos modernos dependem muito da autenticação baseada em tokens, o que torna a correção do JWT uma parte crucial da postura de segurança.
Ao combinar práticas sólidas de engenharia com plataformas de segurança automatizadas, como Penligent.aiCom o sistema de autenticação da Microsoft, as organizações podem identificar rapidamente configurações incorretas, evitar ataques de escalonamento de privilégios e garantir que seus sistemas de autenticação sejam resistentes a técnicas modernas de adversários.
