Como prevenir vulnerabilidades de redirecionamento aberto no Laravel
Kevin Kimani
27 de dezembro de 2023
0 minutos de leituraUma vulnerabilidade de redirecionamento aberto ocorre quando um site permite que dados fornecidos pelo usuário determinem o destino de um redirecionamento sem aplicar medidas adequadas de validação ou sanitização. Para explorar essa vulnerabilidade, um invasor pode enviar aos usuários um link aparentemente confiável que, ao ser clicado, os redireciona para um site malicioso, podendo levar a ataques de phishing ou outras atividades nocivas. No Laravel, isso costuma acontecer quando os desenvolvedores não validam os destinos dos redirecionamentos nem os incluem em uma lista de permissões.
Neste artigo, você vai conhecer melhor as vulnerabilidades de redirecionamento aberto e descobrir como preveni-las no Laravel. Você também vai aprender a usar o Snyk para detectar essa vulnerabilidade no seu código e nas dependências.
O que é uma vulnerabilidade de redirecionamento aberto no Laravel
As vulnerabilidades de redirecionamento aberto ocorrem quando aplicações web permitem que usuários externos definam uma URL para a qual serão redirecionados. Isso geralmente acontece após uma ação do usuário, como clicar em um link ou botão. Essa URL especificada pelo usuário costuma ser incluída como um parâmetro de consulta na URL da aplicação.
Por exemplo, considere uma URL vulnerável como: http://example.com/redirect?url=http://malicious-site.com
Sem as medidas adequadas de validação e sanitização, o método de redirecionamento do Laravel pode enviar os usuários, sem querer, para o site malicioso especificado.
Crie uma aplicação vulnerável
Para entender melhor como funciona uma vulnerabilidade de redirecionamento aberto, vamos criar uma aplicação vulnerável simples. Depois, você vai implementar métodos para prevenir essa vulnerabilidade.
Para acompanhar o tutorial, você precisa do seguinte:
As extensões
php-xmlephp-curlinstaladas na sua máquina.Node.js e npm instalados na sua máquina.
Um navegador web e um editor de código. Este guia usa o Visual Studio (VS) Code.
Todo o código deste tutorial está disponível neste repositório do GitHub.
Com tudo pronto, é hora de começar a criar a aplicação.
Acesse um diretório adequado na sua máquina, abra a pasta em um terminal e execute os comandos a seguir para instalar globalmente o instalador do Laravel pelo Composer e criar um novo projeto Laravel:
Se esse comando não funcionar, use composer create-project laravel/laravel open-redirect-vulnerability-demo para criar um novo projeto.
Nos prompts exibidos no terminal, selecione as seguintes opções:
Gostaria de instalar um kit inicial?: Nenhum kit inicial
Qual framework de testes você prefere?: PHPUnit
Gostaria de inicializar um repositório Git?: Não
Qual banco de dados sua aplicação usará?: SQLite
Depois de criar a aplicação, abra o diretório open-redirect-vulnerability-demo no seu editor de código. Em seguida, para criar uma rota com uma vulnerabilidade de redirecionamento aberto, abra o arquivo routes/web.php e substitua a rota / pelo código a seguir:
Verifique se a declaração use a seguir está no início do arquivo web.php:
Para mostrar como funciona a vulnerabilidade de redirecionamento aberto, execute o servidor com o comando php artisan serve e abra o navegador. Neste cenário, https://www.google.com/ é a URL maliciosa para a qual o invasor quer redirecionar o usuário.
No navegador, acesse http://127.0.0.1:8000/vulnerable?redirect=https://www.google.com/. Você será redirecionado para https://www.google.com/.
A rota /vulnerable que você criou é vulnerável a redirecionamento aberto porque não há validação nem sanitização dos dados de entrada. Mais especificamente, ela recupera o parâmetro de redirecionamento da URL e redireciona para a página especificada sem verificar se a URL é segura ou pertence ao domínio da aplicação. Como o código redireciona os usuários sem verificar a URL fornecida no parâmetro de redirecionamento, ela pode ser manipulada para induzi-los a visitar sites de phishing, baixar malware ou se envolver em outras atividades nocivas.
Nesse caso, o invasor poderia ter criado uma cópia do site verdadeiro (ou seja, http://127.0.0.1:8000) e, quando a página fosse carregada, o usuário pensaria estar no site correto, quando na verdade não estaria. Se o usuário fizesse login no site malicioso, forneceria suas credenciais ao invasor sem saber.
Como prevenir uma vulnerabilidade de redirecionamento aberto no Laravel
A vulnerabilidade de redirecionamento aberto é um vetor de ataque comum que pode ser prevenido. Veja a seguir algumas boas práticas que podem ajudar:
Use redirecionamentos fixos
A implementação de redirecionamentos fixos garante que os usuários só possam ser redirecionados para destinos confiáveis e predefinidos dentro da aplicação. Essa prática reduz efetivamente o risco de vulnerabilidades de redirecionamento aberto e é um mecanismo de defesa robusto que deve ser implementado.
Para implementar redirecionamentos fixos no código atual, substitua a rota /vulnerable pelo seguinte:
Com esse código, você restringe os redirecionamentos a rotas específicas e confiáveis (ou seja, rotas internas) da sua aplicação Laravel. Essa abordagem impede que invasores criem URLs maliciosas que levam a destinos externos. Para testar a correção, tente acessar a URL maliciosa usada anteriormente: http://127.0.0.1:8000/vulnerable?redirect=https://www.google.com/.
Uma lista de permissões para possíveis redirecionamentos
Outra forma de prevenir vulnerabilidades de redirecionamento aberto é definir uma lista de destinos confiáveis. Essa medida preventiva ajuda a garantir que os redirecionamentos ocorram somente para URLs aprovadas.
Para implementar essa estratégia neste projeto Laravel, substitua a rota /vulnerable pelo código a seguir:
Neste código, você considera https://snyk.io/ uma URL de redirecionamento confiável. O valor do parâmetro de redirecionamento na URL é validado em relação ao array $whitelistedDestinations. Se corresponder a algum dos destinos confiáveis, o redirecionamento é realizado. Caso contrário, a aplicação redireciona para uma página padrão segura.
Para testar esse método, acesse http://127.0.0.1:8000/vulnerable?redirect=https://www.google.com no navegador. Você será redirecionado automaticamente para a página inicial da aplicação Laravel, pois https://www.google.com não está no array $whitelistedDestinations. Porém, se você acessar http://127.0.0.1:8000/vulnerable?redirect=https://snyk.io/, será redirecionado para https://snyk.io/, pois esse endereço está no array $whitelistedDestinations.
Impeça redirecionamentos para outros domínios
Impedir que sua aplicação redirecione para outro domínio garante que os usuários sejam direcionados somente para páginas dentro do domínio da aplicação ou recebam informações adequadas para agir com cautela diante de possíveis redirecionamentos para fora do ambiente confiável. Essa abordagem reforça a segurança geral e a confiança dos usuários.
Para implementar essa estratégia neste projeto Laravel, substitua a rota /vulnerable pelo código a seguir:
Além disso, adicione a declaração use a seguir no início do arquivo web.php:
Este código define uma rota que recebe dados do usuário na forma de uma URL. Ele acrescenta o protocolo http:// se estiver faltando e, em seguida, verifica se o host da URL é localhost. Se for, o código permite o redirecionamento. Caso contrário, retorna uma resposta 403 Forbidden, impede o redirecionamento para outro domínio e exibe uma mensagem informando que redirecionar para um domínio diferente não é permitido.
Use uma extensão do Snyk para IDE para detectar vulnerabilidades de redirecionamento aberto
Se você procura uma solução simples para detectar vulnerabilidades de redirecionamento aberto, experimente uma extensão de segurança do Snyk para IDE, como a extensão do Snyk para Visual Studio Code. Essa ferramenta detecta vulnerabilidades de redirecionamento aberto no seu código, informa sobre as vulnerabilidades encontradas (incluindo o nível de segurança), apresenta boas práticas de prevenção e oferece exemplos de trechos de código que você pode usar para corrigi-las.
É fácil começar a usar a extensão do Snyk para Visual Studio Code. Primeiro, instale, configure e autentique a extensão.
Para ver a extensão em ação, use o mesmo código vulnerável de antes. Abra o arquivo routes/web.php e substitua a rota /vulnerable pelo seguinte:
Salve o arquivo e selecione Snyk na barra lateral do VS Code. Se a verificação ainda não estiver em execução, clique no botão Verificar novamente em segurança de código:

Quando a verificação terminar, uma lista de vulnerabilidades será exibida. Nos resultados, expanda web.php e selecione Open Redirect. Você verá que a extensão do Snyk exibe mais detalhes sobre a vulnerabilidade e mostra como corrigi-la:

No código, a extensão do Snyk também destaca o trecho vulnerável. Passe o cursor sobre ele para obter mais informações sobre a vulnerabilidade:

A extensão também oferece Open Source Security, uma ferramenta que ajuda você a encontrar e corrigir vulnerabilidades nas bibliotecas de código aberto da sua aplicação. Se o Snyk encontrar vulnerabilidades nessas bibliotecas, incluindo vulnerabilidades de redirecionamento aberto, os resultados serão exibidos na janela da extensão do Snyk:

Conclusão
Neste artigo, você aprendeu tudo sobre vulnerabilidades de redirecionamento aberto em aplicações Laravel e os riscos que elas representam, incluindo ataques de phishing e distribuição de malware. Você também aprendeu a lidar com essa vulnerabilidade usando métodos como a implementação de redirecionamentos fixos, a inclusão de destinos permitidos em uma lista e o bloqueio de redirecionamentos para domínios externos. Essas estratégias aumentam significativamente a segurança das suas aplicações Laravel, garantindo que os usuários sejam redirecionados apenas para locais confiáveis e predefinidos.
Se você quer reforçar ainda mais a segurança, experimente as extensões do Snyk para IDE. Com o Snyk, você pode proteger ainda mais suas aplicações Laravel contra vários tipos de vulnerabilidade, incluindo redirecionamentos abertos.
A extensão do Snyk para Visual Studio Code verifica sua base de código, identifica vulnerabilidades e oferece orientações práticas para que os desenvolvedores detectem possíveis ameaças antes que elas cheguem à produção. Com a ampla gama de soluções de segurança do Snyk, os desenvolvedores podem proteger proativamente suas aplicações Laravel, garantir uma proteção robusta e reforçar a postura geral de segurança dos projetos.
Comece a resolver desafios de Capture the Flag
Aprenda a resolver desafios de Capture the Flag assistindo ao nosso workshop virtual introdutório sob demanda.



