> For the complete documentation index, see [llms.txt](https://stacked-rwx.gitbook.io/public/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://stacked-rwx.gitbook.io/public/web-security/explorando-bypass-de-autenticacao-jwt-atraves-de-assinatura-nao-verificada.md).

# Explorando bypass de autenticação JWT através de assinatura não verificada

## O que é JWT? <a href="#id-0a30" id="id-0a30"></a>

O JWT é um padrão utilizado para compartilhar informações, isso inclui dados confidenciais, a partir de um token que identifica um usuário autenticado em uma sessão.

<figure><img src="/files/K4FSpsKcFeZwp8bOZxg4" alt=""><figcaption></figcaption></figure>

Podemos observar a estrutura do JWT divida em três partes.

**Header:** Aqui é possivel observar as informações em objeto JSON como: algoritmo que está sendo usado e o tipo do token. Todos os dados são codificados em base64url.

**Payload:** Aqui é possível observar as informações sobre o usuário.

**Signature:** Aqui é onde ocorre todo processo de verificação da integridade do JSON e pela criptografia hash. É uma forma de evitar mudanças feitas de forma maliciosa.

## **Como funciona um ataque JWT?** <a href="#id-9b61" id="id-9b61"></a>

O ataque consiste em enviar informações modificadas para o servidor, caso esteja vulnerável, é possível escalonar privilégios e obter dados de outros usuários. Lembrando que é recomendável o uso do proxy, burp suite é um deles.

Em relação ao porquê ele ocorre, justamente se deve ao uso incorreto do JWT na aplicação. Juntamente a isto, as várias especificações que o JWT possui, sendo eles o JWS (JSON WEB SIGNATURE) e o JWE (JSON WEB ENCRYPTION) são flexíveis, o que consequentemente pode resultar em vulnerabilidades acidentalmente por parte dos desenvolvedores, sendo essas falhas responsáveis pela verificação incorreta da assinatura.

(Resumindo, o problema ocorre pela má verificação da assinatura do token.)

## Ataque de bypass de autenticação JWT através de assinatura não verificada <a href="#de2a" id="de2a"></a>

Para sabermos como essa vulnerabilidade ocorre na prática, irei utilizado o laboratório do Portswigger.

<figure><img src="/files/ZIoCimSTorApy7iMHZ4T" alt=""><figcaption></figcaption></figure>

Ao acessar o laboratório, nos deparamos com um blog. Clicando em “My account”, nós seremos redirecionados até a página de login.

<figure><img src="/files/5UQfVinnY4bRfurzZGcW" alt=""><figcaption></figcaption></figure>

O usuário é “wiener” e a senha é “peter” para que possamos logar. Nesse momento, vamos até o nosso proxy do burp suite para que possamos interceptar todas as requisições durante o login.

<figure><img src="/files/FIgB62qVTiDeJjkJBPod" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/JMSPZJSvlDGHYPHpWDbZ" alt=""><figcaption></figcaption></figure>

Pronto, a nossa primeira requisição foi interceptada pelo Burp Suite. Agora clicando em forward, vamos poder observar qual será a próxima requisição que será feita.

<figure><img src="/files/4R51RO9QevYdx2d5kw5g" alt=""><figcaption></figcaption></figure>

Encontrando a requisição certa, vamos enviá-la para o Repeater.

<figure><img src="/files/9RHwpHk1VWOOfUjvLH0m" alt=""><figcaption></figcaption></figure>

Bem, eu utilizo uma extensão chmada JWT Editor que vocês podem encontrar no BAPP Store do Burp Suite ou clicando [aqui](https://portswigger.net/bappstore/26aaa5ded2f74beea19e2ed8345a93dd). Clicando em SEND, podemos notar que o nosso login foi efetuado.

<figure><img src="/files/njWDc3ALbN80znnXxHiT" alt=""><figcaption></figcaption></figure>

Vejam agora o token presente no cookie, é ele que vamos explorar. Clicando em “JSON Web Token”, podemos pegar as melhores informações sobre o token.

<figure><img src="/files/G2XpC0Cm8SIe1okyIG6T" alt=""><figcaption></figcaption></figure>

Observem que o token está com cores diferentes a cada ‘.’, o que quer dizer que cada parte colorida está sendo referenciado por uma estrutura do token.

\- A parte vermelha é o header;\
\- A parte rosa é o payload;\
\- A parte azul é a signature;

Observando um pouco abaixo, podemos notar que o header e o payload foram decodados e algumas informações forem exibidas. A nossa missão é escalarmos para o usuário administrator.

Para isso, vamos até o payload e vamos mudar o “sub”: “wiener” para “sub”: “administrator”.

Antes:

<figure><img src="/files/CvTqgRsvCw8Q4XpKK48L" alt=""><figcaption></figcaption></figure>

Depois:

<figure><img src="/files/X47LfJWss9YA1UshI3pW" alt=""><figcaption></figcaption></figure>

Agora clique em SEND e obtenha um redirect (302).

<figure><img src="/files/UZ40hCfPq6VMyxUjD5PK" alt=""><figcaption></figcaption></figure>

Voltando até RAW, modifique o url com “id=wiener” para “id=administrator” e veja o resultado!

<figure><img src="/files/mWZT7b0pcpea866tzoYV" alt=""><figcaption></figcaption></figure>

Sucesso! Depois de logado como administrador, a nossa missão é deletar o usuário Carlos. Para isso, vamos até “/admin” e vamos procurar pelo usuário Carlos.

<figure><img src="/files/M4cLy1fk2sy8kkKMyB4n" alt=""><figcaption></figcaption></figure>

Copiando o caminho passado dentro do href=””, conseguiremos deletar o usuário Carlos.

<figure><img src="/files/89b7Cb0DoZhfRjkFMmyM" alt=""><figcaption></figcaption></figure>

Yeah, laboratório resolvido!

<figure><img src="/files/wXv9AT56Oy7ESmH9y9zA" alt=""><figcaption></figcaption></figure>

Obrigado por ler até aqui.<br>
