Skip to content

Open Redirect

Introdução

Open Redirect é uma falha de validação de input que existe quando uma aplicação aceita inputs controlados pelo usuário, sem a sanitização adequada, que fornecem uma URL de um outro site ou aplicação externa ao contexto da aplicação original, que pode ser maliciosa ou controlada por um atacante.

Cenário Vulnerável

Digamos que em nossa aplicação, definirmos que quando um usuário entrar em uma area que é restringida para usuários logados e ele não tiver uma sessão ativa, vamos redirecioná-lo para o Login e, depois de fornecer corretamente as credenciais, deixamos ele acessar a página.

Bem, a tela de login precisa saber para onde redirecionar depois de o login finalizar, para isso, vamos usar um queryParam chamado redirectUrl. Ficaria mais ou menos assim:

  1. O cliente vai em https://company.com.br/perfil para visualizar seu perfil.

  2. A aplicação verifica que ele não está logado, então o redireciona para o login, com o parâmetro para onde deve retornar depois do login:

    https://company.com.br/login?redirectUrl=https://company.com.br/perfil
  3. O usuário insere suas credencias e efetua o login.

  4. A aplicação redireciona o usuário para a URL do parâmetro, no caso, https://company.com.br/perfil.

Agora o que aconteceria se um atacante enviasse o seguinte link para uma vítima:

https://company.com.br/login?redirectUrl=https://company.com.br/perfil

Percebeu a sutil diferença?

O atacante agora está direcionando a vítima para um site com zzz e não o original com zz, sendo este um site falso.

Com isso, ele poderia se passar pelo site oficial, onde coletaria informações adicionais, como cartões de crédito, credenciais, etc.

Este tipo de problema pode estar em diversos lugares:

// no backend depois de efetuar uma ação.
return new RedirectView(targetUrl);

Riscos

Ao permitir que nossas aplicações estejam vulneráveis a Open Redirect, tornamos possível que:

  • Usuários da aplicação serem vítimas de ataques de phishing.
  • Usuários da aplicação terem suas credenciais de acesso roubadas.
  • Exposição de informações sensíveis de usuários da aplicação.
  • A reputação da empresa ser danificada por estar associada a ataques de phishing aos clientes.
  • Aplicação de medidas legais em decorrência da exposição de dados pessoais sensíveis dos usuários.

Como Mitigar

Qualquer parâmetro que nossa aplicação recebe como um input ou variável e realiza uma navegação para ela deve possuir as seguintes validações:

URL Interna

Validar se o domínio para a qual vamos redirecionar é permitido por nossa allowlist.

Exemplo: se apenas podemos navegar para links de company.com.br ou company2.com.br, devemos validar o domínio da URL antes de realizar o redirecionamento.

// Valida se uma url string pertence a um domínio em específico.
// Exemplo:
// urlString = "https://subdomain.example.com/"
// targetDomain = "example.com"
public static boolean isValidDomain(String urlString, String targetDomain) {
try {
URI uri = new URI(urlString);
String host = uri.getHost();
if (host.startsWith("www.")) {
host = host.substring(4); // Remove 'www.'
}
return host.equalsIgnoreCase(targetDomain);
} catch (URISyntaxException e) {
return false;
}
}

URL Externa

Caso a URL em questão possa, por regra de negócio, ser externa, avisar o usuário em uma modal de confirmação que ele está sendo redirecionado para uma URL externa.

Referências