Session Management and HTTP Cookies

O que é?

  • O gerenciamento de sessão permite que você não precise ficar relogando nos sites ao fechar uma aba.
  • É o processo que permite ao servidor lidar com múltiplas requisições de um mesmo usuário sem a necessidade de login constante.
  • Websites mantêm uma sessão para cada usuário logado e criam uma nova sessão a cada login.

Funcionamento

  • O servidor designa um session ID para o navegador para provar a identidade do usuário.
  • A maioria dos websites utiliza cookies para comunicar essa informação de sessão nas requisições HTTP.
  • O navegador armazena o cookie e o inclui em toda requisição para o mesmo servidor.
  • Ao efetuar o log out, o servidor invalida o cookie de sessão, impedindo seu reuso.

Token-Based Authentication

  • Diferente do gerenciamento de sessão tradicional, o sistema armazena a informação diretamente em um token.
  • Permite que os servidores deduzam a identidade decodificando o token, sem precisar manter a sessão no lado do servidor.

Riscos e Proteção

  • Risco: Possibilidade de modificar informações no token para logar como outra pessoa.
  • Prevenção: Aplicações podem encriptar ou encodar tokens para que sejam lidos apenas pela aplicação ou terceiros autorizados.
  • Integridade: Uso de assinaturas (signatures), que são strings geradas por uma chave secreta (secret key) conhecida apenas pelo servidor.

JSON Web Tokens (JWT)

Possui três componentes principais:

  1. Header: Identifica o algoritmo de assinatura (codificado em base64url-encoded).
  2. Payload: Contém informações sobre a identidade do usuário (codificado em base64url-encoded).
  3. Signature: Valida que o usuário não adulterou o token. É calculada concatenando header e payload, assinando-os com o algoritmo e a secret key.

Ataques e Vulnerabilidades

  • Bypass de Assinatura: Algumas aplicações falham ao verificar a assinatura, permitindo assinaturas inválidas ou vazias.
  • Manipulação do campo alg:
  • Atacantes podem especificar qual algoritmo usar se a aplicação não restringir o tipo.
  • O suporte à opção none permite que tokens com assinatura vazia sejam considerados válidos.
  • Troca de algoritmos (ex: mudar de RSA para HMAC para usar a chave pública como chave secreta).
  • Brute-Forcing the Key: É possível tentar “chutar” a chave se ela não for complexa o suficiente, usando o algoritmo, payload e a assinatura resultante.
  • Vazamento de Chave: Pode ocorrer através de outras vulnerabilidades como XXE ou SSRF.
  • Leitura de Informações Sensíveis: Se o token não for encriptado, qualquer pessoa pode decodificar a base64 e ler o payload. O JWT oferece integridade, mas não necessariamente confidencialidade.