Bild von Authentifizierung mittels http-Formularen

18. Okt 2023

Authentifizierung mittels http-Formularen

Ein Leitfaden

Die Sicherheit von Webanwendungen ist heutzutage von entscheidender Bedeutung, insbesondere wenn es um die Authentifizierung geht. Um unser Wissen zu den Sicherheitsthemen in Webanwendungen zu erweitern, haben wir an einem spannenden zweitägigen Workshop teilgenommen, der von Urs Müller und Mischa Bachmann von der Firma Compass Security geleitet wurde.

In diesem Blogbeitrag werden wir uns ausführlich mit dem Thema Authentifizierung mittels http-Formularen beschäftigen. Dabei werden wir uns insbesondere auf die damit verbundenen Sicherheitsrisiken und die besten präventiven Massnahmen konzentrieren. Darüber hinaus können Sie sich auf zwei weitere Beiträge freuen, in denen wir die speziellen Authentifizierungskonzepte JWT (Json Web Token) und OAuth (Open Authorization) genauer unter die Lupe nehmen werden.

Authentifizierung mit http-Forms

Zuallererst möchten ich darauf hinweisen, dass es neben der Authentifizierung mittels http-Formularen auch andere Methoden wie die Basic- oder die Digest-Authentifizierung gibt. Allerdings wird ein Grossteil, aufgrund von Sicherheitsbedenken, nicht mehr für öffentlich zugängliche Applikationen empfohlen.

Bei der Authentifizierung mittels http-Formularen gibt der Benutzer seine Anmeldedaten in einem http-Formularen auf der Webseite ein. Die Übermittlung dieser Daten an den Server geschieht danach im Klartext. Um sicherzustellen, dass diese Daten geschützt sind, ist es somit von entscheidender Bedeutung, dass die Kommunikation über TLS (Transport Layer Security) verschlüsselt wird. Dies gewährleistet nicht nur den Schutz der Anmeldedaten, sondern ermöglicht auch im begrenzten Umfang die Überprüfung, ob die Verbindung mit dem richtigen Server hergestellt wurde.

Die Entwicklung einer sicheren Login-Implementierung, basierend auf http-Formularen, ist äusserst komplex, da es viele Fehlerquellen gibt. Aus diesem Grund empfehle ich, wenn möglich, eine vorhandene und bekannte Login-Lösung zu verwenden, die bereits gründlich getestet wurde und bei der Fehler schnell behoben werden. Falls man dennoch eine eigene Login-Lösung entwickeln möchte, sollte man auf folgende Punkte achten.

Enumeration Angriff

Ein häufig unterschätztes Sicherheitsrisiko ist der Enumeration-Angriff, bei dem ein Angreifer versucht, eine Liste gültiger Benutzernamen zu erhalten. Auch wenn eine solche Liste allein noch kein Problem darstellt, kann ein Angreifer mit validen Benutzernamen effizienteres Social Engineering betreiben und so erfolgreich Zugriff auf Konten erlangen. Das Passwort ist die einzige Unbekannte, was es einfacher macht, gültige Anmeldeinformationen zu finden, im Vergleich zur Erratung des Passworts und eines gültigen Benutzernamens. Deshalb ist es wichtig, dass beim Login neutrale Fehlermeldungen verwendet werden, wie "Benutzername oder Passwort ist inkorrekt". Dies sollte nicht nur für fehlgeschlagene Anmeldungen gelten, sondern auch für den Erstellungsprozess neuer Konten. Zudem sollten sogenannte Timing-Angriffe vermieden werden, bei denen ein Unterschied in der Antwortzeit zwischen dem Fall, in dem das Passwort falsch ist, und dem Fall, in dem der Benutzer unbekannt ist, besteht.

 

Beispiel wie das Login auf Facebook Login-Page ein Enumeration Angriff zulassen würde. (Ausprobiert und Fotografiert am 07.2023)

Passwort Brutforcing und Passwort Spraying Angriffe

Um ein gültiges Passwort zu erhalten, versucht ein Angreifer mit Social Engineering den Benutzer zu manipulieren und seine Login-Daten preiszugeben. Wenn das nicht gelingt, führt der Angreifer Brute-Force Angriffe durch, um das richtige Passwort zu finden und Zugang zum Konto zu erhalten. Um sich vor solchen Angriffen zu schützen, empfehlen wir, den Benutzer nach einer bestimmten Anzahl von fehlgeschlagenen Anmeldeversuchen zu sperren. Diese Sperre kann entweder für eine bestimmte Zeitdauer oder bis zur Passwortrücksetzung des Benutzers gelten. Um solche Angriffe weniger offensichtlich zu machen, kann es sein, dass der Angreifer zu einem Passwort-Spraying Angriff wechselt. Bei diesem wird ein Passwort mit vielen Benutzernamen probiert, auch hier mit der Hoffnung, eine valide Anmelde Information zu finden. Bei beiden Angriffen kommen viele fehlgeschlagene Anmeldeversuche von wenigen IP-Adressen, daher ist es auch sinnvoll, eine temporäre IP-Sperre zu implementieren.

Logout

Eine wichtige Sicherheitsmassnahme ist es zudem, alle aktiven Sitzungen eines Benutzers zu beenden, wenn er sich abmeldet. Wenn ein Login über verschiedene Geräte hinweg möglich ist, sollten zumindest alle Sitzungen auf einem bestimmten Gerät geschlossen werden. Es ist wichtig, dass der Benutzer nach dem Abmelden nicht automatisch in anderen Tabs oder Fenstern angemeldet bleibt. Dies gewährleistet die Sicherheit, da der Benutzer ordnungsgemäss abgemeldet ist. Dies ist speziell kritisch wenn der Benutzer sich auf einem öffentlichen Gerät angemeldet hatte.

Passwörter speichern

Auch beim Speichern von Passwörtern ist es ratsam, wenn möglich keine eigene Lösung zu implementieren, sondern eine bewährte Library oder einen Service zu verwenden. Falls es dennoch erforderlich ist, das Passwort selbst zu speichern, sollte sichergestellt werden, dass das Passwort niemals im Klartext abgespeichert wird. Stattdessen sollte das Passwort als "salted hash" gespeichert werden. Dabei wird ein für jedes Passwort zufällig generierter Wert (Salt) dem Passwort hinzugefügt und beides gehasht. Dadurch wird verhindert, dass man erkennt, welche Benutzer dasselbe Passwort verwenden, und es ist auch nicht möglich, vorberechnete Hash-Werte zu verwenden, um das Passwort zurückzuschliessen. Der verwendete Hash-Algorithmus sollte für Passwörter geeignet sein.

import bcrypt
password = b"Compass"
hash = bcrypt.hashpw(password, bcrypt.gensalt())
hash
>>> b'$2b$12$OC1xKNMGbZ9028UzIDWpSOtjzpbfXngh8l04jP.JM7vzLjN60v3V6'
hash = bcrypt.hashpw(password, bcrypt.gensalt())
hash
>>> b'$2b$12$8NOCSKm0Q2IeY1wFpwoN0.PbedKwPb66XF.CNhNj5Yoyead/f0jcC'
bcrypt.checkpw(b'Kompass', hash)
>>> False
bcrypt.checkpw(b'Compass', hash)
>>> True

Hier sehen sie die Verwendung des bcrypt Passwort-Hashing Algorithmus in Python. Das Salt für das hashen wird mit bcrypt.gensalt() generiert. Wie man sehen kann gibt es trotz verwenden des gleichen Passworts zwei Komplet unterschiedliche Hashes.

Zwei-Faktor-Authentifizierung

Um das Risiko durch gestohlener Passwortinformationen zu minimieren, bietet sich die Implementierung einer 2-Faktor-Authentifizierung an. Bei dieser Methode wird der Benutzer nach der Eingabe seines Passworts aufgefordert, sich über einen zusätzlichen Faktor zu authentifizieren. Häufig erfolgt dies durch den Versand eines Codes per E-Mail oder SMS an den Benutzer. Durch die Verwendung dieses zusätzlichen Sicherheitsfaktors wird die Sicherheit erheblich erhöht. Allerdings ist es wichtig zu betonen, dass selbst die 2-Faktor-Authentifizierung keine vollständige Sicherheit gewährleisten kann, wie das genannte Beispiel verdeutlicht.

 

Phishing-Website, um an die Login Daten zu kommen und um die 2-Faktor-Authentifizierung zu umgehen. Der Angriff basiert auf einem Man in the Middle Angriff bei dem der Angreifer die Login Seite der Ziel Webseite imitiert und so den Benutzer dazu bringt, die Login und die 2-Faktor-Authentifizierung Informationen auf der gefälschten Seite einzugeben. Diese verwendet der Angreifer dann, um sich Zugang beim der echten Webseite zu verschaffen.
Diese Methode des Phishing funktioniert auch, wenn die 2-Faktor-Authentifizierung über einen separaten Kanal läuft.

Fazit

Es ist von entscheidender Bedeutung, bei der Entwicklung von Authentifizierungssystemen, alle Sicherheitsaspekte sorgfältig zu berücksichtigen. In dem man bewährte Sicherheitspraktiken berücksichtigt, kann man die Gefahr eines erfolgreichen Angriffes minimieren. Wichtig ist auf jeden Fall, dass Anmeldungs-Information nur über TLS-Verschlüsselten Verbindungen versendet werden. Es ist sehr wahrscheinlich, dass man bei einer eigenen Umsetzung eine spezielle Situation übersehen und dadurch eine Sicherheitslücke einbauen könnte. Deshalb ist es ratsam, bekannte und gut getestete Bibliotheken zur Verwaltung von Anmeldeinformationen zu verwenden. Stelle sicher, dass diese Bibliotheken regelmässig aktualisiert werden, damit immer die neueste Version mit geschlossenen Sicherheitslücken verwendet wird. Weitere Schutzmechanismen, wie der Sperrung nach fehlgeschlagenen Anmeldeversuchen und die Verwendung von 2-Faktor-Authentifizierung, stellen eine zusätzliche Schutzschicht dar, die die Gefahr eines erfolgreichen Angriffs weiter senkt.


Schliessen
Stamp Icon-Print Icon-Clear
S
M
L
XL
XXL