it-swarm.com.de

Kann eine Website eine HTTP-Anfrage an "localhost" senden? Wie kommt es um die domänenübergreifende Richtlinie herum?

Ich fand diese Website , die über das Beheben einer Redis-Sicherheitsanfälligkeit durch Ausnutzen derselben Sicherheitsanfälligkeit spricht.

Die betreffende Website verfügt über eine Schaltfläche "Patch me". Wenn auf Ihrem Computer ein Redis-Server ohne Kennwort ausgeführt wird, wird dieser gepatcht.

Mit anderen Worten, die Website selbst stellt eine Verbindung zum Redis-Server in Ihrem Computer her und führt einige Befehle aus.

Wenn Sie sich den Website-Code ansehen, finden Sie vorhersehbar Folgendes:

    var text = "the code to run";
    var bad = "EVAL "  + JSON.stringify(text) + " 0\r\n";
    var x = new XMLHttpRequest();
    x.open("POST", "http://localhost:6379");
    x.send(bad);

Zu meiner Überraschung funktioniert das!

Ich dachte, die domänenübergreifende Richtlinie würde dies verhindern, aber das tut es nicht.

Warum funktioniert das und wie kann ich jetzt nicht paranoid sein, dass jede Website, auf die ich gehe, den gesamten Inhalt meines Redis-Servers liest?

Es ist, weil es nur schreibt, aber nicht liest? Trotzdem kann jede Website auf der Welt meinen lokalen Redis-Server leeren /auf etwas anderes schreiben, das ohne Authentifizierung einen Port auf meinem Computer abhört.

Vermisse ich hier etwas?

15
Daniel Magliola

So beantworten Sie die Frage: Ja, eine Website kann eine HTTP-Anfrage an localhost senden. Die domänenübergreifende Richtlinie wird nicht verletzt, da die Anforderung keine domänenübergreifenden Richtlinien überschreitet. Es wird lokal bleiben. Eine Möglichkeit, domänenübergreifende Richtlinien zu vermeiden, besteht darin, das Zielopfer zu veranlassen, die HTTP-Anforderung selbst zu stellen. Somit überschreitet die Anfrage niemals Domänen.

Um Ihnen das Verständnis des von Ihnen beschriebenen Problems zu erleichtern:

Der Angriff sendet keine Daten aus und stellt auch keine Verbindung zu einem anderen Ort als dem lokalen Redis-Computer her. Es ist nicht die Website selbst, die eine Verbindung zu Ihrem Redis-Computer herstellt. Es ist , dass Sie eine Verbindung zu Ihrem Redis-Computer herstellen und clientseitigen Code/Skripte ausführen, die Sie lief durch Klicken auf den Link. Grundsätzlich gilt: Sie klicken auf Link> Link heruntergeladen und führt einen Code aus -> Code generiert eine http-Anfrage -> http-Anfrage geht von Ihrem Computer zu Ihrem Computer.

Die Sicherheitsanfälligkeit des Redis-Servers in dieser Situation ist Cross Site Request Forgery. Der Angreifer nutzt die Authentifizierung der Opfer (in diesem Fall des Besitzers des Servers), um den Angriff auszuführen.

Der Angreifer hat nicht die volle Kontrolle über den Prozess. Sie verlassen sich auf den Eigentümer des Redis-Servers, um den Code auszuführen. Nur der Eigentümer (oder eine andere Person auf dem Redis-Server) hat die Sichtbarkeit (und möglicherweise die Berechtigungs- und Vertrauensbeziehung) für den Zugriff auf 127.0.0.1 (Localhost).

Der Code kann nur Befehle ausführen, die der lokale Benutzer ausführen kann, aber nicht der Angreifer, der sie ausführt, sondern der Eigentümer, sodass keine domänenübergreifenden Richtlinien verletzt werden.

Die einzigen Personen, die von solchen Links betroffen sind, sind Personen, auf denen Redis-Server ausgeführt werden. Wenn Sie keine haben, wird der Link nichts tun. Außerdem wird es nur auf dem lokalen Redis-Server ausgeführt. Der Angreifer kann nicht wirklich auswählen, wo der Exploit stattfinden soll.

Suchen Sie nach Cross Site Request Forgery. https://en.wikipedia.org/wiki/Cross-site_request_forgery

5
meltdownmonk