Skip to main content

Como prevenir vulnerabilidades de redirecionamento aberto no Laravel

Escrito por
Headshot of Kevin Kimani

Kevin Kimani

feature laravel open redirect

27 de dezembro de 2023

0 minutos de leitura

Uma 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:

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:

composer global require laravel/installer

laravel new open-redirect-vulnerability-demo

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:

Route::get('/vulnerable', function (Request $request) {
   // Get the 'redirect' parameter from the query string
   $redirectUrl = $request->input('redirect');

   // Perform the redirect
   return redirect($redirectUrl);
});

Verifique se a declaração use a seguir está no início do arquivo web.php:

use Illuminate\Http\Request;

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:

Route::get('/', function () {
   return view('welcome');
})->name('home');

Route::get('/vulnerable', function (Request $request) {
   return redirect()->route('home');
});

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:

Route::get('/vulnerable', function (Request $request) {
   // Define trusted redirect destinations
   $whitelistedDestinations = [
   	'https://snyk.io/',
   ];

   // Get the 'redirect' parameter from the params
   $redirectUrl = $request->input('redirect');

   // Check if the input URL is in the whitelist
   if (in_array($redirectUrl, $whitelistedDestinations)) {
   	// Perform the redirect
   	return redirect($redirectUrl);
   }

   // Handle invalid redirects, for example:
   return redirect('/'); // Redirect to a safe default page
});

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:

Route::get('/vulnerable', function (Request $request) {
   $inputUrl = $request->input('redirect');

   // Prepend the protocol if missing
   if (!parse_url($inputUrl, PHP_URL_SCHEME)) {
   	$inputUrl = 'http://' . $inputUrl;
   }

   $parsedInputUrl = parse_url($inputUrl);

   // Check if the URL is valid and has a host component
   if ($parsedInputUrl && array_key_exists('host', $parsedInputUrl) && $parsedInputUrl['host'] === 'localhost') {
   	return redirect()->to($inputUrl);
   }

   // Disallow redirect with a 403 Forbidden status code
   return response('Forbidden: Cannot redirect to another domain', Response::HTTP_FORBIDDEN);
});

Além disso, adicione a declaração use a seguir no início do arquivo web.php:

use Illuminate\Http\Response;

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:

Route::get('/vulnerable', function (Request $request) {
   // Get the 'redirect' parameter from the query string
   $redirectUrl = $request->input('redirect');

   // Perform the redirect
   return redirect($redirectUrl);
});

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:

O Visual Studio Code mostra uma rota web.php do Laravel que lê um parâmetro de consulta de redirecionamento e retorna uma resposta de redirecionamento, ao lado de painéis de análise do Snyk.

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:

O Snyk Code no Visual Studio Code sinaliza uma vulnerabilidade de redirecionamento aberto em uma rota web.php do Laravel e sugere uma correção.

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:

Editor de código exibindo uma chamada de redirecionamento do Laravel, com um alerta sobre uma vulnerabilidade de redirecionamento aberto (CWE-601) e orientações para evitá-la.

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:

O Visual Studio Code exibe uma rota do Laravel que redireciona usuários para uma URL fornecida por um parâmetro da solicitação, com painéis de segurança do Snyk visíveis.

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.


Leia mais

blog feature snyk container custom base recommendations
Blog

Conheça o Evo Agentic AppSec: segurança que acompanha o ritmo do desenvolvimento com IA

O desenvolvimento impulsionado por IA está avançando mais rápido do que os fluxos de trabalho de segurança tradicionais. O AppSec agentivo da Snyk usa agentes de segurança para encontrar, corrigir e verificar vulnerabilidades continuamente, enquanto as pessoas definem os critérios.

blog feature ai violet
Blog

VulnBump: agentes de IA conseguem corrigir dependências vulneráveis sem quebrar o build?

O VulnBump testa agentes de IA em 307 atualizações reais de dependências. Uma correção só é considerada válida se eliminar a vulnerabilidade e mantiver o build e os testes funcionando.

Blog

Modelos de ponta encontraram as vulnerabilidades. Só o atacante encontrou as cadeias.

A análise estática encontrou as falhas, mas só os testes de ataque em aplicações ativas provaram como elas poderiam ser encadeadas para causar invasões. Uma comparação entre Evo COS, Claude Security e Claude Code Security.