[JAVA] Lassen Sie uns die Sicherheitsanfälligkeit angreifen. (2) Öffnen Sie die Umleitung

Einführung

Was wäre der Angriff, wenn eine Webanwendung für ** Open Redirect ** anfällig wäre? Lassen Sie uns tatsächlich die offene Weiterleitung angreifen.

* In diesem Artikel wird [Webanwendung voller Fehler](http://qiita.com/tamura__246/items/7275c7406706fb0057e8) für verschiedene Sicherheitsanfälligkeiten verwendet. Und dies ist der zweite Artikel darüber, wie man es angreift und verteidigt. Den ersten Artikel finden Sie hier [http://qiita.com/tamura__246/items/6307889936d6e7c98403].

Lass uns angreifen

Bevor wir uns mit offenen Weiterleitungen befassen, wollen wir die Schwachstellen für offene Weiterleitungen angreifen.

Laden Sie die Webanwendung von [hier] herunter (https://github.com/k-tamura/easybuggy/releases) und starten Sie sie mit dem folgenden Befehl.

java -jar easybuggy.jar
  • Java wird zur Ausführung benötigt. Weitere Informationen finden Sie auf [dieser Seite](https://t246osslab.wordpress.com/2017/03/14/easybuggy-%e3%81%ae%e3%83%88%e3%83%aa%e3%82 Siehe% bb% e3% 83% 84 /).
* In diesem Artikel wird Version 1.3.6 verwendet. Das Verhalten kann sich in zukünftigen Versionen ändern.

Greifen Sie nach dem Start auf [http: // localhost: 8080](http: // localhost: 8080) zu. In der Mitte des Bildschirms unten befindet sich ein Abschnitt mit der Bezeichnung "Sicherheitsanfälligkeit".

main.png

Der zehnte von oben ist der Link "Open Redirectable Login Screen". Wenn Sie darauf klicken, wird der folgende Bildschirm angezeigt.

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

Geben Sie " admin "als Benutzer-ID und" password" als Passwort ein und klicken Sie auf die Anmeldeschaltfläche. Der folgende Bildschirm wird angezeigt.

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

Dies ist die einzige Funktion, die jedoch für das Öffnen von Weiterleitungen anfällig ist. Der Fokus liegt auf der URL. Die URL des Anmeldebildschirms, auf den Sie zum ersten Mal zugegriffen haben, lautet "http: // localhost: 8080 / openredirect / login? Goto = / uid / serverinfo.jsp". Die URL nach der Anmeldung lautet "http: // localhost: 8080 / uid / serverinfo" Es ist .jsp`. Sie können davon ausgehen, dass die Abfragezeichenfolge "goto = / uid / serverinfo.jsp" das Übergangsziel nach der Anmeldung angibt.

Bitte melden Sie sich ab und klicken Sie diesmal auf den Link unten.

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

Der gleiche Anmeldebildschirm wie zuvor wird angezeigt. Melden Sie sich erneut mit " admin "und" password" an.

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

Hast du dich angemeldet? Ich glaube, ich konnte mich anmelden, aber vorher sollte der folgende Anmeldefehlerbildschirm angezeigt worden sein.

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

Haben Sie bemerkt, dass die neu eingegebene Benutzer-ID und das Kennwort zu diesem Zeitpunkt an eine externe Site gesendet wurden?

Überprüfen Sie die Browser-URL auf dem Anmeldefehlerbildschirm. Dies ist die URL der externen Site (https: // k-tamura.github.io / openred). Obwohl der Anmeldefehlerbildschirm angezeigt wurde, war die Anmeldung tatsächlich erfolgreich, und ich wechselte zu einer externen Site mit einem Fehlerbildschirm, der dem Bildschirm dieser Webanwendung ähnelt. Nach erneuter Eingabe der Benutzer-ID und des Kennworts und Klicken auf die Anmeldeschaltfläche wurde diese zum ursprünglichen Übergangsziel umgeleitet, sodass einige Personen den Übergang zur externen Site möglicherweise nicht bemerkt haben.

Was ist offene Weiterleitung?

Auf diese Weise ist Open Redirect ein Angriff, der die Redirect-Funktion einer Webanwendung ausnutzt, um Benutzer auf eine schädliche Site zu leiten.

Der Angreifer veranlasst den Benutzer, auf einen Link wie den oben genannten zu klicken, und leitet den Benutzer unwissentlich zur Website des Angreifers weiter. Darüber hinaus können Sie wie in dieser Zeit versuchen, einen aufwändig gefälschten Anmeldefehlerbildschirm auf einer externen Site vorzubereiten und Ihre Benutzer-ID und Ihr Kennwort ("Phishing") eingeben zu lassen. Diesmal war es eine Weiterleitung von der Test-App zu meiner nicht böswilligen Website (https: // k-tamura.github.io /), aber wenn dies eine Weiterleitung vom Online-Banking zu einer böswilligen Website ist, wird es schwierig Das ist.

open_redirect.png

In einer Webanwendung, die einen Benutzer möglicherweise zu einer in einem Anforderungsparameter angegebenen URL wie dieser Webanwendung (EasyBuggy) umleiten kann, liegt möglicherweise eine Sicherheitsanfälligkeit bezüglich offener Umleitung vor.

Es ist jedoch in Ordnung, wenn Sie überprüfen, ob Ihre Webanwendung Benutzer nicht zu unerwarteten URLs umleitet. Wenn Sie zu einer beliebigen URL umleiten, ohne diese zu überprüfen, kann ein Angreifer die Anforderungsparameter neu schreiben und den Benutzer zu einer gefährlichen Site führen.

Welche Art von Implementierung

Welche Art von Implementierung ist die Anmeldefunktion, die ich dieses Mal ausprobiert habe? Schauen Sie sich den Quellcode an (https://github.com/k-tamura/easybuggy/blob/master/src/main/java/org/t246osslab/easybuggy/vulnerabilities/OpenRedirectServlet.java). Die wichtigen Teile sind:

    String gotoUrl = request.getParameter("goto");
    if (gotoUrl != null) {
        response.sendRedirect(gotoUrl);
    } else {

Es ist "sendRedirect", ohne den Wert des Anforderungsparameters "goto" zu überprüfen.

Maßnahmen zur offenen Weiterleitung

Welche Maßnahmen sollten also ergriffen werden?

Die Problemumgehung ist einfach: ** Überprüfen Sie, ob das Umleitungsziel eine geeignete URL als Übergangsziel ist **. Was Sie jedoch beachten müssen, ist **, wie der Überprüfungsprozess implementiert wird **.

Selbst wenn Sie eine URL ablehnen, die mit "http" beginnt, um Weiterleitungen zu externen Websites zu verhindern, verwenden die meisten Browser weiterhin "// k-tamura.github.io / openred" wie im obigen Beispiel. Da es als "http: // k-tamura.github.io / openred" interpretiert wird, kann nicht gesagt werden, dass es sich um eine geeignete Maßnahme handelt. Wenn die zulässigen Umleitungsziele klar aufgelistet sind, wird es als sicherer angesehen, eine Implementierung zu implementieren, die nur diese mit einer genauen Übereinstimmung überprüft, als eine Implementierung, die mit einer Teilübereinstimmung oder einem regulären Ausdruck überprüft.

Wenn das Umleitungsziel nur "/ uid / serverinfo.jsp" ist, ist es am sichersten, es auf die folgende Implementierung zu ändern.

    String gotoUrl = request.getParameter("goto");
    if ("/uid/serverinfo.jsp".equals(gotoUrl)) {
        res.sendRedirect(gotoUrl);
    } else {

Es kann jedoch besser sein, zu prüfen, ob eine solche Funktion überhaupt notwendig ist, und wenn nicht, eine andere Methode in Betracht zu ziehen.

Referenz