Skip to main content

Comment prévenir les vulnérabilités de redirection ouverte dans Laravel

Écrit par
Headshot of Kevin Kimani

Kevin Kimani

feature laravel open redirect

27 décembre 2023

0 minutes de lecture

Une vulnérabilité de redirection ouverte survient lorsqu’un site Web permet à des données fournies par l’utilisateur de déterminer la destination d’une redirection, sans appliquer de mesures adéquates de validation ou de nettoyage. Pour exploiter cette vulnérabilité, un attaquant peut envoyer aux utilisateurs un lien qui semble digne de confiance et qui, lorsqu’ils cliquent dessus, les redirige vers un site Web malveillant, ce qui peut entraîner des attaques par hameçonnage ou d’autres activités malveillantes. Dans Laravel, cela se produit souvent lorsque les développeurs ne valident pas les destinations de redirection ou ne les ajoutent pas à une liste d’autorisation.

Dans cet article, vous découvrirez les vulnérabilités de redirection ouverte et comment les prévenir dans Laravel. Vous apprendrez également à utiliser Snyk pour détecter cette vulnérabilité dans votre code et vos dépendances.

Qu’est-ce qu’une vulnérabilité de redirection ouverte dans Laravel ?

Les vulnérabilités de redirection ouverte surviennent lorsque des applications Web permettent à des utilisateurs externes de définir l’URL vers laquelle ils seront redirigés. Cela se produit souvent après une action déclenchée par l’utilisateur, comme un clic sur un lien ou un bouton. Cette URL spécifiée par l’utilisateur est généralement incluse en tant que paramètre de requête dans l’URL de l’application.

Par exemple, considérons une URL vulnérable comme : http://example.com/redirect?url=http://malicious-site.com

Sans mesures adéquates de validation et de nettoyage, la méthode de redirection de Laravel peut envoyer par inadvertance les utilisateurs vers le site malveillant indiqué.

Créer une application vulnérable

Pour mieux comprendre le fonctionnement d’une vulnérabilité de redirection ouverte, créons une application vulnérable simple. Nous mettrons ensuite en œuvre des méthodes pour prévenir cette vulnérabilité.

Pour suivre ce tutoriel, vous aurez besoin des éléments suivants :

  • PHP et Composer installés sur votre machine locale.

  • Les extensions php-xml et php-curl installées sur votre machine locale.

  • Node.js et npm installés sur votre machine locale.

  • Un navigateur Web et un éditeur de code. Ce guide utilise Visual Studio (VS) Code.

Tout le code de ce tutoriel est disponible dans ce dépôt GitHub.

Une fois que tout est prêt, vous pouvez commencer à créer l’application.

Accédez à un répertoire approprié sur votre machine locale, ouvrez le dossier dans un terminal et exécutez les commandes suivantes pour installer globalement l’installateur Laravel via Composer et créer un projet Laravel :

composer global require laravel/installer

laravel new open-redirect-vulnerability-demo

Si cette commande ne fonctionne pas, utilisez composer create-project laravel/laravel open-redirect-vulnerability-demo pour créer un nouveau projet.

Dans les invites qui s’affichent dans le terminal, sélectionnez les options suivantes :

  • Souhaitez-vous installer un kit de démarrage ? : Aucun kit de démarrage

  • Quel framework de test préférez-vous ? : PHPUnit

  • Souhaitez-vous initialiser un dépôt Git ? : Non

  • Quelle base de données votre application utilisera-t-elle ? : SQLite

Une fois l’application créée, ouvrez le répertoire open-redirect-vulnerability-demo dans votre éditeur de code. Ensuite, pour créer une route présentant une vulnérabilité de redirection ouverte, ouvrez le fichier routes/web.php et remplacez la route / par le code suivant :

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

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

Assurez-vous que l’instruction use suivante figure en haut du fichier web.php :

use Illuminate\Http\Request;

Pour illustrer le fonctionnement de la vulnérabilité de redirection ouverte, démarrez le serveur avec la commande php artisan serve, puis ouvrez votre navigateur Web. Dans ce scénario, https://www.google.com/ est l’URL malveillante vers laquelle l’attaquant souhaite rediriger l’utilisateur.

Dans le navigateur, accédez à http://127.0.0.1:8000/vulnerable?redirect=https://www.google.com/ : vous serez redirigé vers https://www.google.com/.

La route /vulnerable que vous avez créée est vulnérable aux redirections ouvertes, car les entrées ne sont ni validées ni nettoyées. Plus précisément, elle récupère le paramètre de redirection dans l’URL et redirige vers la page Web indiquée sans vérifier si l’URL est sûre ni si elle appartient au domaine de l’application. Comme le code redirige aveuglément les utilisateurs vers l’URL fournie dans le paramètre de redirection, celle-ci peut être manipulée pour les inciter à visiter des sites d’hameçonnage, à télécharger des logiciels malveillants ou à participer à d’autres activités nuisibles.

Dans ce cas, l’attaquant aurait pu créer une copie du véritable site (c’est-à-dire http://127.0.0.1:8000) et, au chargement de la page, l’utilisateur croirait être sur le bon site alors que ce n’est pas le cas. Si l’utilisateur se connectait sur le site malveillant, il communiquerait sans le savoir ses identifiants à l’attaquant.

Comment prévenir une vulnérabilité de redirection ouverte dans Laravel

Les vulnérabilités de redirection ouverte sont un vecteur d’attaque courant qui peut être prévenu. Voici quelques bonnes pratiques qui peuvent vous aider :

Utiliser des redirections fixes

La mise en place de redirections fixes garantit que les utilisateurs ne peuvent être redirigés que vers des destinations de confiance prédéfinies au sein de l’application. Cette pratique réduit efficacement le risque de vulnérabilités de redirection ouverte et constitue une mesure de défense solide à mettre en œuvre.

Pour mettre en place des redirections fixes dans le code actuel, remplacez la route /vulnerable par la suivante :

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

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

Ce code limite les redirections à des routes spécifiques et fiables (c’est-à-dire des routes internes) de votre application Laravel. Cette approche empêche les attaquants de créer des URL malveillantes menant vers des destinations externes. Pour tester ce correctif, essayez d’accéder à l’URL malveillante utilisée précédemment : http://127.0.0.1:8000/vulnerable?redirect=https://www.google.com/.

Une liste d’autorisation des redirections possibles

Vous pouvez également prévenir les vulnérabilités de redirection ouverte en définissant une liste de destinations de confiance. Cette précaution permet de s’assurer que les redirections ne s’effectuent que vers des URL approuvées.

Pour mettre en œuvre cette stratégie dans ce projet Laravel, remplacez la route /vulnerable par le code suivant :

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
});

Dans ce code, vous considérez https://snyk.io/ comme une URL de redirection fiable. La valeur du paramètre de redirection dans l’URL est comparée au tableau $whitelistedDestinations. Si elle correspond à l’une des destinations de confiance, la redirection a lieu. Sinon, l’application redirige vers une page par défaut sécurisée.

Pour tester cette méthode, accédez à http://127.0.0.1:8000/vulnerable?redirect=https://www.google.com dans votre navigateur. Vous serez automatiquement redirigé vers la page d’accueil de l’application Laravel, car https://www.google.com ne figure pas dans le tableau $whitelistedDestinations. En revanche, si vous accédez à http://127.0.0.1:8000/vulnerable?redirect=https://snyk.io/, vous serez redirigé vers https://snyk.io/, puisque cette URL figure dans le tableau $whitelistedDestinations.

Interdire les redirections vers un autre domaine

Empêcher votre application de rediriger vers un autre domaine garantit que les utilisateurs restent sur le domaine de l’application, ou qu’ils sont suffisamment informés et prudents lorsqu’ils sont confrontés à des redirections potentielles en dehors de l’environnement de confiance. Cette approche renforce la sécurité globale et la confiance des utilisateurs.

Pour mettre en œuvre cette stratégie dans ce projet Laravel, remplacez la route /vulnerable par le code suivant :

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);
});

Veillez également à ajouter l’instruction use suivante en haut du fichier web.php :

use Illuminate\Http\Response;

Ce code définit une route qui accepte une URL fournie par l’utilisateur. Il ajoute le protocole http:// s’il est absent, puis vérifie si l’hôte de l’URL est localhost. Si c’est le cas, le code autorise la redirection. Sinon, il renvoie une réponse 403 Forbidden, interdisant la redirection vers un autre domaine et indiquant qu’il est interdit de rediriger vers un domaine différent.

Utiliser une extension IDE Snyk pour détecter les vulnérabilités de redirection ouverte

Si vous recherchez une solution simple pour détecter les vulnérabilités de redirection ouverte, pensez à utiliser une extension de sécurité Snyk pour IDE, comme l’extension Snyk pour Visual Studio Code. Cet outil détecte les vulnérabilités de redirection ouverte dans votre code, vous informe des vulnérabilités éventuelles (y compris de leur niveau de gravité), présente les bonnes pratiques de prévention et fournit des exemples de code que vous pouvez utiliser pour les corriger.

La prise en main de l’extension Snyk pour Visual Studio Code est simple. Commencez par installer, configurer et authentifier l’extension.

Pour voir l’extension à l’œuvre, utilisez le même code vulnérable que précédemment. Ouvrez le fichier routes/web.php et remplacez la route /vulnerable par le code suivant :

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

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

Enregistrez le fichier et sélectionnez Snyk dans la barre latérale de VS Code. Si l’analyse n’est pas déjà en cours, cliquez sur le bouton Relancer l’analyse sous Sécurité du code :

Visual Studio Code affiche une route Laravel dans web.php qui lit un paramètre de requête de redirection et renvoie une réponse de redirection, ainsi que des panneaux d’analyse Snyk.

Une fois l’analyse terminée, une liste de vulnérabilités s’affiche. Dans les résultats, développez web.php et sélectionnez Redirection ouverte. L’extension Snyk affiche alors davantage de détails sur la vulnérabilité et vous indique comment la corriger :

Snyk Code signale une vulnérabilité de redirection ouverte dans une route web.php de Laravel dans Visual Studio Code et propose une correction.

Dans le code, l’extension Snyk met également en évidence le code vulnérable. Vous pouvez le survoler pour obtenir plus d’informations sur la vulnérabilité :

Éditeur de code affichant un appel de redirection Laravel, accompagné d’un avertissement sur une vulnérabilité de redirection ouverte (CWE-601) et de conseils pour la prévenir.

Cette extension propose également Open Source Security, un outil qui vous permet de trouver et de corriger les vulnérabilités dans les bibliothèques open source de votre application. Si Snyk détecte des vulnérabilités dans vos bibliothèques open source, y compris des vulnérabilités de redirection ouverte, les résultats s’affichent dans la fenêtre de l’extension Snyk :

Visual Studio Code affiche une route Laravel qui redirige les utilisateurs vers une URL fournie par un paramètre de requête, avec les panneaux de sécurité Snyk visibles.

Conclusion

Dans cet article, vous avez découvert les vulnérabilités de redirection ouverte dans les applications Laravel et les risques qu’elles présentent, notamment les attaques par hameçonnage et la diffusion de logiciels malveillants. Vous avez également appris à remédier à cette vulnérabilité en mettant en place des redirections fixes, en autorisant uniquement certaines destinations et en interdisant les redirections vers des domaines externes. Ces stratégies renforcent considérablement la sécurité de vos applications Laravel en garantissant que les utilisateurs ne sont redirigés que vers des destinations fiables et prédéfinies.

Pour renforcer encore davantage votre sécurité, pensez à utiliser les extensions IDE Snyk. Avec Snyk, vous pouvez mieux protéger vos applications Laravel contre toutes sortes de vulnérabilités, y compris les redirections ouvertes.

L’extension Snyk pour Visual Studio Code analyse votre base de code, identifie les vulnérabilités et fournit des recommandations concrètes. Les développeurs peuvent ainsi détecter les menaces potentielles avant leur mise en production. En tirant parti de la suite complète de solutions de sécurité Snyk, les développeurs peuvent protéger leurs applications Laravel de manière proactive, garantir une protection robuste et renforcer la posture de sécurité globale de leurs projets.

Lancez-vous dans le Capture the Flag

Découvrez comment résoudre des défis Capture the Flag en regardant à la demande notre atelier virtuel d’initiation.


Lire la suite

blog feature snyk container custom base recommendations
Blog

Découvrez Evo Agentic AppSec : une sécurité au rythme du développement de l’IA

Le développement piloté par l’IA dépasse les workflows de sécurité traditionnels. L’AppSec agentique de Snyk s’appuie sur des agents de sécurité pour détecter, corriger et vérifier les vulnérabilités en continu, tandis que les équipes définissent les exigences.

blog feature ai violet
Blog

VulnBump : les agents IA peuvent-ils corriger les dépendances vulnérables sans casser le build ?

VulnBump évalue des agents IA sur 307 mises à niveau de dépendances réelles. Une correction n’est comptabilisée que si la vulnérabilité disparaît et que la compilation et les tests restent au vert.

Blog

Les modèles de pointe ont trouvé les vulnérabilités. Seul l’attaquant a trouvé les chaînes d’exploitation.

L’analyse statique a détecté les failles, mais seuls des tests d’attaque en conditions réelles ont prouvé comment elles pouvaient être enchaînées pour provoquer des compromissions. Comparaison d’Evo COS, de Claude Security et de Claude Code Security.