Stell Dir vor, Du surfst im Internet und besuchst verschiedene Webseiten. Plötzlich, ohne Dein Wissen, führt Dein Browser eine Aktion auf einer anderen Webseite aus, bei der Du eingeloggt bist. Das könnte bedeuten, dass Dein Bankkonto Geld an einen unbekannten Empfänger sendet oder dass sensible Informationen preisgegeben werden. Diese Art von Angriff nennt man Cross-Site Request Forgery, oder kurz CSRF.

Was ist ein CSRF-Angriff?

Ein CSRF-Angriff zwingt Dich, eine ungewollte HTTP-Anfrage an eine Webseite zu senden, auf der Du bereits authentifiziert bist. Der Angreifer nutzt dabei die Vertrauensstellung aus, die die Webseite gegenüber Deinem Browser hat. Hier ist eine einfache Erklärung des Angriffs:

  1. Aktive Sitzung: Du bist auf der Webseite Deiner Bank eingeloggt.
  2. Maliziöser Link: Du klickst auf einen Link in einer E-Mail oder auf einer anderen Webseite.
  3. Unbemerkte Aktion: Dieser Link führt dazu, dass Dein Browser eine Anfrage an die Bankwebseite sendet, als ob Du selbst die Aktion ausgeführt hättest, z.B. eine Überweisung.

Das perfide an CSRF ist, dass die betroffene Webseite glaubt, die Anfrage käme von Dir, da Dein Browser authentifiziert ist.

Warum sind Anti-CSRF Tokens wichtig?

Ein effektiver Schutz gegen CSRF-Angriffe sind sogenannte Anti-CSRF Tokens. Diese Tokens sind einzigartige, zufällig generierte Werte, die mit jeder Anfrage gesendet werden müssen. Ohne diese Tokens kann die Webseite nicht verifizieren, ob die Anfrage legitim ist.

Wenn ein HTML-Formular keinen Anti-CSRF Token enthält, ist es anfällig für CSRF-Angriffe. Hier ist der Grund:

  • Vorhersehbarkeit: Ohne den Token sind die URL-Formularaktionen vorhersehbar und wiederholbar.
  • Fehlende Verifikation: Die Webseite kann nicht überprüfen, ob die Anfrage tatsächlich von Dir kommt.

Wie funktioniert ein CSRF-Angriff?

Ein CSRF-Angriff funktioniert in der Regel unter den folgenden Bedingungen:

  • Aktive Sitzung: Du bist auf der Zielseite eingeloggt.
  • HTTP-Authentifizierung: Du bist über HTTP auth authentifiziert.
  • Gleiches Netzwerk: Du befindest Dich im gleichen lokalen Netzwerk wie die Zielseite.

Was kann passieren?

CSRF-Angriffe können verschiedene schädliche Aktionen auslösen:

  • Aktionen ausführen: Der Angreifer kann Aktionen auf der Zielseite mit Deinen Rechten durchführen, wie z.B. Geldüberweisungen.
  • Informationen offenlegen: Neue Techniken ermöglichen es, Informationen zu offenbaren, indem sie auf die Antwort der Zielseite zugreifen.

Besonders gefährlich wird es, wenn die Zielseite auch anfällig für Cross-Site Scripting (XSS) ist. XSS kann als Plattform für CSRF-Angriffe dienen, wodurch der Angreifer innerhalb der gleichen Ursprungsrichtlinie operieren kann.

Schütze Dich vor CSRF-Angriffen

Um Dich vor CSRF-Angriffen zu schützen, solltest Du Folgendes beachten:

  1. Verwende Anti-CSRF Tokens: Jede sicherheitskritische Anfrage sollte einen einzigartigen Token enthalten.
  2. Sei vorsichtig mit unbekannten Links: Klicke nicht auf verdächtige Links in E-Mails oder auf unbekannten Webseiten.
  3. Sichere Deine Sitzungen: Logge Dich nach der Nutzung von Webseiten immer aus, besonders bei sensiblen Diensten wie Online-Banking.

Beispiel Angriffe

Um ein besseres Verständnis für CSRF-Angriffe zu bekommen, schauen wir uns ein paar Beispiele an. Diese Beispiele sind zu Demonstrationszwecken und sollten niemals für böswillige Aktivitäten verwendet werden.

Beispiel 1: Einfache Überweisung im Bankkonto

Angenommen, Du bist bei Deiner Online-Bank eingeloggt und ein Angreifer möchte, dass Du eine Überweisung ohne Dein Wissen durchführst.

HTML der Angreifer-Webseite:

<!DOCTYPE html>
<html>
<body>
  <h1>Click here to win a prize!</h1>
  <img src="https://bankwebsite.com/transfer?amount=1000&to=12345" style="display:none;">
</body>
</html>

In diesem Beispiel wird eine unsichtbare Bildanfrage an die Bankseite gesendet, die eine Überweisung initiiert, sobald die Seite geladen wird. Dein Browser, der bei der Bankseite authentifiziert ist, führt diese Aktion aus.

Beispiel 2: Formular-basierter Angriff

Ein etwas komplexerer Angriff verwendet ein HTML-Formular, das automatisch gesendet wird.

HTML der Angreifer-Webseite:

<!DOCTYPE html>
<html>
<body onload="document.forms[0].submit()">
  <h1>Congratulations! You've won a free iPhone!</h1>
  <form action="https://bankwebsite.com/transfer" method="POST">
    <input type="hidden" name="amount" value="1000">
    <input type="hidden" name="to" value="12345">
  </form>
</body>
</html>

In diesem Beispiel wird das Formular automatisch gesendet, wenn die Seite geladen wird. Die Anfrage wird von Deinem Browser an die Bankseite gesendet, als ob Du selbst die Überweisung initiiert hättest.

Beispiel 3: Nutzung von JavaScript für AJAX-Anfragen

Ein Angreifer kann auch JavaScript verwenden, um eine CSRF-Anfrage zu erstellen.

HTML und JavaScript der Angreifer-Webseite:

<!DOCTYPE html>
<html>
<body>
  <h1>Special Offer Just for You!</h1>
  <script>
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "https://bankwebsite.com/transfer", true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.send("amount=1000&to=12345");
  </script>
</body>
</html>

Dieses Skript sendet eine POST-Anfrage an die Bankseite, die eine Überweisung durchführt. Da Dein Browser bei der Bankseite authentifiziert ist, wird die Anfrage ausgeführt.

Schutzmaßnahmen gegen CSRF

Um solche Angriffe zu verhindern, sollten Webseiten Anti-CSRF Tokens verwenden. Hier ist ein Beispiel, wie ein Anti-CSRF Token in einem Formular implementiert werden kann:

HTML-Formular mit Anti-CSRF Token:

<!DOCTYPE html>
<html>
<body>
  <form action="/transfer" method="POST">
    <input type="hidden" name="csrf_token" value="RANDOMLY_GENERATED_TOKEN">
    <input type="text" name="amount" placeholder="Amount">
    <input type="text" name="to" placeholder="Recipient">
    <button type="submit">Transfer</button>
  </form>
</body>
</html>

Server-Seite (Pseudocode):

def handle_transfer_request(request):
    # Check if CSRF token is valid
    if request.POST['csrf_token'] != get_expected_token(request.user):
        raise Exception("Invalid CSRF token")
    # Process the transfer
    amount = request.POST['amount']
    recipient = request.POST['to']
    process_transfer(request.user, amount, recipient)

Durch die Implementierung von Anti-CSRF Tokens können Webseiten sicherstellen, dass nur legitime Anfragen von authentifizierten Benutzern akzeptiert werden, wodurch die Gefahr von CSRF-Angriffen erheblich reduziert wird.

🤞 1x pro Monat unsere News, Tipps und Tutorials gebündelt direkt in dein Postfach!

Wir senden keinen Spam! Erfahre mehr in unserer Datenschutzerklärung.


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.