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".
Der zehnte von oben ist der Link "Open Redirectable Login Screen". Wenn Sie darauf klicken, wird der folgende Bildschirm angezeigt.
Geben Sie " admin
"als Benutzer-ID und" password
" als Passwort ein und klicken Sie auf die Anmeldeschaltfläche. Der folgende Bildschirm wird angezeigt.
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.
Hast du dich angemeldet? Ich glaube, ich konnte mich anmelden, aber vorher sollte der folgende Anmeldefehlerbildschirm angezeigt worden sein.
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.
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