Après le démarrage, accédez à [http: // localhost: 8080](http: // localhost: 8080). Il y a une section intitulée «Vulnérabilité» au milieu de l'écran ci-dessous.
Le dixième à partir du haut est le lien "Ouvrir l'écran de connexion redirigeable". Lorsque vous cliquez dessus, l'écran suivant s'affiche.
Entrez "ʻadmin" comme ID utilisateur et "
password` "comme mot de passe, et cliquez sur le bouton de connexion. L'écran suivant s'affiche.
C'est la seule fonctionnalité, mais elle est vulnérable aux redirections ouvertes. L'accent est mis sur l'URL. L'URL de l'écran de connexion auquel vous avez accédé pour la première fois est http: // localhost: 8080 / openredirect / login? Goto = / uid / serverinfo.jsp
, et l'URL après la connexion est http: // localhost: 8080 / uid / serverinfo C'est .jsp
. Vous pouvez deviner que la chaîne de requête goto = / uid / serverinfo.jsp
spécifie la destination de la transition après la connexion.
Veuillez vous déconnecter et cliquer sur le lien ci-dessous cette fois.
http://localhost:8080/openredirect/login?goto=%2f%2f%6b%2d%74%61%6d%75%72%61%2e%67%69%74%68%75%62%2e%69%6f%2f%6f%70%65%6e%72%65%64
Le même écran de connexion qu'avant s'affiche. Connectez-vous à nouveau avec "ʻadmin" et "
password` ".
Vous êtes-vous connecté? Je pense que j'ai pu me connecter, mais avant cela, l'écran d'erreur de connexion suivant aurait dû être affiché.
Avez-vous remarqué que l'ID utilisateur et le mot de passe réintroduits ont été envoyés à un site externe à ce moment-là?
Regardez l'URL du navigateur sur l'écran d'erreur de connexion. C'est l'URL du site externe (https: // k-tamura.github.io / openred
). Bien que l'écran d'erreur de connexion ait été affiché, la connexion a réussi et j'étais en train de passer à un site externe avec un écran d'erreur similaire à l'écran de cette application Web. Après avoir saisi à nouveau l'ID utilisateur et le mot de passe et cliqué sur le bouton de connexion, il a été redirigé vers la destination de transition d'origine, de sorte que certaines personnes peuvent ne pas avoir remarqué la transition vers le site externe.
Qu'est-ce que la redirection ouverte?
De cette manière, la redirection ouverte est une attaque qui exploite la fonction de redirection d'une application Web pour diriger les utilisateurs vers un site malveillant.
L'attaquant amène l'utilisateur à cliquer sur un lien comme celui ci-dessus et dirige sans le savoir l'utilisateur vers le site de l'attaquant. De plus, comme cette fois, vous pouvez essayer de configurer un écran d'erreur de connexion usurpé sur un site externe pour saisir votre identifiant d'utilisateur et votre mot de passe ("phishing"). Cette fois, il s'agissait d'une redirection de l'application d'essai vers mon site non malveillant (https: // k-tamura.github.io /
), mais s'il s'agit d'une redirection de la banque en ligne vers un site malveillant, ce sera difficile C'est.
Une vulnérabilité de redirection ouverte peut exister dans une application Web qui a la capacité de rediriger un utilisateur vers une URL spécifiée dans un paramètre de requête, telle que cette application Web (EasyBuggy).
Cependant, vous pouvez vérifier que votre application Web ne redirige pas les utilisateurs vers des URL inattendues. Si vous redirigez vers une URL arbitraire sans la vérifier, un attaquant peut réécrire les paramètres de la requête et conduire l'utilisateur vers un site dangereux.
Quel genre de mise en œuvre
Quel type d'implémentation est la fonction de connexion que j'ai essayée cette fois? Jetez un œil au code source (https://github.com/k-tamura/easybuggy/blob/master/src/main/java/org/t246osslab/easybuggy/vulnerabilities/OpenRedirectServlet.java). Les parties importantes sont:
String gotoUrl = request.getParameter("goto");
if (gotoUrl != null) {
response.sendRedirect(gotoUrl);
} else {
C'est sendRedirect
sans valider la valeur du paramètre de requête goto
.
Mesures pour la redirection ouverte
Alors, quel genre de mesures faut-il prendre?
La solution de contournement est simple: ** Vérifiez si la destination de la redirection est une URL appropriée comme destination de la transition **. Cependant, vous devez faire attention à ** comment implémenter le processus de vérification **.
Même si vous rejetez une URL commençant par " http
"dans le but d'interdire les redirections vers des sites externes, la plupart des navigateurs utiliseront toujours" // k-tamura.github.io / openred
" comme dans l'exemple ci-dessus. Puisqu'il est interprété comme "" http: // k-tamura.github.io / openred` ", on ne peut pas dire qu'il s'agit d'une mesure appropriée. Si les destinations de redirection qui peuvent être autorisées sont clairement répertoriées, il est considéré plus sûr d'implémenter une implémentation qui ne vérifie que cela avec une correspondance exacte qu'une implémentation qui vérifie avec une correspondance partielle ou une expression régulière.
Si la destination de la redirection est uniquement / uid / serverinfo.jsp
, il est plus sûr de la modifier avec l'implémentation suivante.
String gotoUrl = request.getParameter("goto");
if ("/uid/serverinfo.jsp".equals(gotoUrl)) {
res.sendRedirect(gotoUrl);
} else {
Cependant, il peut être préférable de se demander si une telle fonction est vraiment nécessaire en premier lieu, et sinon, d'envisager une autre méthode.
référence