[JAVA] Attaquons la vulnérabilité (2) Redirection ouverte

introduction

Quelle serait l'attaque si une application Web était vulnérable à ** Open Redirect **? Attaquons en fait la redirection ouverte.

* Cet article utilise une [application Web pleine de bogues](http://qiita.com/tamura__246/items/7275c7406706fb0057e8) pour diverses vulnérabilités. Et ceci est le deuxième article sur la façon de l'attaquer et de le défendre. Le premier article peut être trouvé ici [http://qiita.com/tamura__246/items/6307889936d6e7c98403).

Attaquons

Avant de plonger dans les redirections ouvertes, attaquons les vulnérabilités de redirection ouverte.

Téléchargez l'application Web depuis ici et lancez-la avec la commande suivante.

java -jar easybuggy.jar
  • Java est requis pour s'exécuter. Pour plus d'informations, [cette page](https://t246osslab.wordpress.com/2017/03/14/easybuggy-%e3%81%ae%e3%83%88%e3%83%aa%e3%82 Voir% bb% e3% 83% 84 /).
* La version 1.3.6 est utilisée dans cet article. Le comportement peut changer dans les versions futures.

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.

main.png

Le dixième à partir du haut est le lien "Ouvrir l'écran de connexion redirigeable". Lorsque vous cliquez dessus, l'écran suivant s'affiche.

Screenshot from 2017-09-21 02-26-59.png

Entrez "ʻadmin" comme ID utilisateur et " password` "comme mot de passe, et cliquez sur le bouton de connexion. L'écran suivant s'affiche.

Screenshot from 2017-09-21 02-23-27.png

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` ".

Screenshot from 2017-09-20 20-42-46.png

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é.

Screenshot from 2017-09-20 20-42-57.png

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.

open_redirect.png

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