Mittwoch, 31. August 2011


Topthema

Donnerstag, 25. Oktober 2007 | Topthema

About Security #128: CSRF: Ausnutzung und Gegenmaßnahmen

(Link zum Artikel: http://www.entwickler.de/php/kolumnen/038892)
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share

Bei einem Angriff über Cross-Site Request Forgery (CSRF) gibt es für den Angreifer mehrere Möglichkeiten, den CSRF-Request so in den Browser eines Benutzers einzuschleusen, dass er ohne weiteres Zutun des Benutzers abgeschickt wird.

Wie wird der CSRF-Request eingeschleust?

Es gibt außer den in About Security #127 genannten Beispielen eine ganze Reihe weiterer Möglichkeiten, einen Benutzer einen HTTP-Request abschicken zu lassen, ohne dass der wie im ersten Beispiel aktiv einen Link anklicken muss. Das Laden einer präparierten Webseite reicht.

N E U ! Security aktuell
Täglich aktuelle Security-Infos!

Der Parameter [CSRF-URL] in den folgenden Beispielen könnte z.B. die Form
http://www.opfer.example/pfad/zum/skript?aktion=boeses
haben.

  • HTML:
    • <img src="[CSRF-URL]">
    • <script src="[CSRF-URL]">
    • <iframe src="[CSRF-URL]">
  • JavaScript:
    • Image-Objekt:
      <script>
      var foo = new Image();
      foo.src = "[CSRF-URL]";
      </script>
    • XMLHttpRequest:
      Mit dem XMLHttpRequest-Request kann auch ein POST-Request ausgelöst werden. Von [CSRF-URL] müssen die Parameter abgetrennt werden: [URL] ist im Folgenden 'http://www.opfer.example/pfad/zum/skript', und [CSRF] ist 'aktion=boeses'.
      <script>
      var post_data = '[CSRF]';
      var xmlhttp = new XMLHttpRequest();
      xmlhttp.open("POST", '[URL]');
      xmlhttp.onreadystatechange = function () {
      if (xmlhttp.readyState == 4) {
      // nichts tun, wir wollen ja nicht auffallen
      }
      };
      xmlhttp.send(post_data);
      </script>
  • Flash
    Amit Klein hat beschrieben, wie mit Flash beliebige HTTP-Header gesendet werden können: 'Forging HTTP request headers with Flash' (Korrektur dazu). Dabei kann insbesondere auch der Referer-Header gefälscht werden.

Außerdem gibt es etliche weitere Möglichkeiten, einen Webbrowser zum Absenden eines HTTP-Requests zu bewegen. Entsprechende Angriffe sind auch nicht auf Webseiten und Webbrowser beschränkt. Jedes Dokumentenformat, das Skripting erlaubt, kann für einen Angriff ausgenutzt werden. Insbesondere also z.B. E-Mails oder Multimediadateien.

Erkennen von CSRF

Ein Webanwendung ist immer dann über CSRF angreifbar, wenn Aktionen über einen statischen URL (GET-Request) oder einen statischen POST-Request ausgeführt werden können, also ein Request, der sich im Laufe der Zeit nicht ändert. Als einfacher Test, ob die eigene Anwendung verwundbar ist oder nicht, können die betroffenen Seiten durchgegangen und alle Requests über einen Proxy wie z.B. Paros aufgezeichnet werden. Später wird das Ganze wiederholt und die aufgezeichneten Requests werden miteinander verglichen. Bleiben die GET- und POST-Requests gleich, ist die Anwendung verwundbar. Änderungen von Cookie-Werten sind unerheblich, da die Cookies vom Webbrowser bei jedem Request automatisch mitgeschickt werden, unabhängig davon, ob er vom Benutzer oder automatisch ausgelöst wurde.

Verhindern von CSRF

Zwei oft genannte Gegenmaßnahmen sind wirkungslos: Das Prüfen des Referer Headers und das ausschließliche Verwenden von POST-Request. Der Referer kann über Flash (s.o.) und XMLHttpRequests gefälscht werden. Ein POST-Request ist zwar etwas schwerer zu fälschen als der nur aus einem Link bestehende GET-Request, mit etwas JavaScript-Code oder einem einfachen XMLHttpRequest kann aber auch ein gefälschter POST-Request abgeschickt werden.

About Security: Die komplette Serie

Eine häufige Schwachstelle sind in diesem Zusammenhang auch Webanwendungen, die nicht darauf achten, wie sie die Daten übermittelt bekommen. Wird z.B. in PHP ['Parameter'] verwendet, kann ein Angreifer die Daten per GET-Request schicken, auch wenn das eigentlich verwendete Formular sie per POST-Request senden würde. Sollen nur Daten aus POST-Requests angenommen werden, muss das durch explizites Verwenden von ['Parameter'] getan werden.

Als wirksame Gegenmaßnahme kann jedes Formular mit einem individuellen, zufällig erzeugten Token versehen werden. Nur Requests mit einem gültigen Token werden ausgeführt. Dadurch kann der Angreifer dem Opfer keinen vorbereiteten gültigen Request unterschieben, sondern muss erst das aktuelle Token ausspähen. In Verbindung mit einer XSS-Schwachstelle in der eigenen Webanwendung oder evtl. einer Schwachstelle im Browser ist aber auch das Ausspähen des Tokens möglich. Sessions sollten daher so kurz wie möglich sein, um das Zeitfenster für einen Angriff zu minimieren. Bei potenziell gefährlichen Aktionen sollte eine Nachfrage ("Aktion ... wirklich ausführen?") oder sogar eine erneute Passwortabfrage erfolgen.

Wichtig ist, dass das Token nicht vorhersagbar ist. Bei einem mit ausreichender Wahrscheinlichkeit vorhersagbaren Token kann der Angreifer einfach mehrere Requests mit möglicherweise passenden Tokens vorbereiten und dem Opfer unterschieben. Der Request mit gültigen Tokens wird vom Server ausgeführt, die anderen verworfen. Ob die präparierte Webseite (oder was sonst für den Angriff verwendet wird) einen oder mehrere vorbereitete CSRF-Requests enthält, ist für den Angriff egal.

Soviel vorerst zu CSRF. In der nächsten Folge geht es erneut um Cross-Site Scripting.

Wenn Sie Fragen oder Themenvorschläge haben, können Sie diese gerne an die angegebene E-Mail-Adresse senden oder im Security-Forum einbringen!

Carsten Eilers

About Security – Übersicht zum aktuellen Thema "Sichere Webanwendungen – Cross-Site Request Forgery"

Kommentare

Folgende Links könnten Sie auch interessieren