Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Fehlende Zugriffskontrolle: fremde Daten sehen

Nach dieser Lektion: Ich kann sagen, ob eine Anfrage hätte erlaubt werden dürfen.

Lektion, 55 Min.3 BefehleOWASP-Juice-Shop-Lab: ein verwundbarer Webshop zum Angreifen in der eigenen Kopie

Rechnung 1041 und Rechnung 1042

Sie bezahlen eine Rechnung online. Die Adresse der Seite endet auf 1041. Aus Neugier ändern Sie die Zahl in 1042.

Die Seite zeigt eine fremde Rechnung: Name, Anschrift, die gekauften Waren. Sie haben nichts aufgebrochen. Die Seite hat nur nie gefragt, wem die Rechnung gehört.

Die eine Regel

Warnung

Dieses Lab ist ein Shop, der absichtlich unsicher ist. Greifen Sie nur Ihre eigene, private Kopie an und nichts sonst. Sie hat keine Verbindung ins Internet. Dieselben Versuche bei einem fremden System sind eine Straftat. Das gilt auch dann, wenn Sie nichts beschädigen wollen.

Am Ende dieser Lektion

Notiz

Ich kann sagen, ob eine Anfrage hätte erlaubt werden dürfen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Authentifizierungder Nachweis, wer Sie sindein Passwort
Autorisierungdie Prüfung, was Sie tun dürfen
Rolleein benannter Satz von Rechtenadmin
Kennungeine Zahl oder ein Name, der genau einen Datensatz bezeichnetBestellung 17
Tokenein signierter Wert, den ein Browser sendet, um die Anmeldung zu zeigen
Statuscodeeine Zahl am Anfang einer Antwort, die sagt, wie es lief401

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Angemeldet sein heißt nicht berechtigt sein

Eine Website stellt zwei Fragen. Die erste betrifft die Authentifizierung: Wer sind Sie? Die zweite betrifft die Autorisierung: Dürfen Sie das?

Viele schwache Seiten stellen nur die erste. Sie wissen, dass Sie Kunde sind, und zeigen alles, was Sie verlangen, auch das, was anderen Kunden gehört.

Ein Statuscode sagt, wie es lief

Jede Antwort beginnt mit einem Statuscode. 200 heißt: Hier ist es. 401 heißt: Die Seite weiß nicht, wer Sie sind. 403 heißt: Sie weiß es, und die Antwort ist nein.

Die folgenden Runs fragen den Shop Ihres Labs ohne Anmeldung nach drei Dingen. Beobachten Sie, was er herausgibt.

Eine Seite für alle: ein Produkt

Befehl
curl -s -o /dev/null -w "%{http_code}\n" http://juice-shop:3000/api/Products/1

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine Seite für Angemeldete: die Nutzerliste

Befehl
curl -s -o /dev/null -w "%{http_code}\n" http://juice-shop:3000/api/Users

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Was der Shop bei einer Absage sagt

Befehl
curl -s http://juice-shop:3000/rest/basket/1 | grep -o "<title>[^<]*</title>"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Beispiel: die drei Antworten lesen

AnfrageStatusWas es Ihnen sagt
/api/Products/1200Ein Produkt ist öffentlich, jeder darf es lesen
/api/Users401Der Shop will wissen, wer fragt, bevor er Personen auflistet
/rest/basket/1401Ein Warenkorb ist privat, der Shop will zuerst ein Token

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine Kennung in der Adresse lässt sich ändern

Bestellungen, Warenkörbe und Rechnungen haben Nummern. Die Nummer steht oft in der Adresse. Jeder kann sie ändern.

Darum muss die Seite bei jeder Anfrage prüfen, ob dieses Konto den Datensatz besitzt oder eine Rolle hat, die ihn lesen darf. Eine Nummer, die schwer zu erraten ist, ersetzt diese Prüfung nicht.

Beispiel: ein kurzes Anfrageprotokoll

NutzerRolleAnfrageErlaubt?
lenaKundinGET /bestellungen/17 (ihre)Ja, sie besitzt sie
lenaKundinGET /bestellungen/18 (von Jonas)Nein, sie gehört ihr nicht
svenAdminGET /bestellungen/18Ja, ein Admin darf jede Bestellung lesen
jonasKundeGET /admin/nutzerNein, nur ein Admin darf das

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein häufiger Fehler

Warnung

Viele glauben, eine versteckte Schaltfläche oder ein versteckter Link schütze eine Seite. Das stimmt nicht. Ein Browser kann jede Adresse abfragen, ob ein Link darauf zeigt oder nicht. Die Prüfung gehört in den Servercode, der die Anfrage beantwortet. Verstecken Sie den Link ruhig, verlassen Sie sich aber nie darauf.

Der Server prüft jede Anfrage

Ein sicherer Handler tut drei Dinge in dieser Reihenfolge. Er stellt fest, wer fragt. Er lädt den Datensatz. Er prüft Besitzer oder Rolle und lehnt ab, wenn keins passt.

Lehnen Sie mit 403 ab. Prüfen Sie auf dem Server und an einer einzigen Stelle, damit keine Seite es vergisst.

Eine Prüfung auf Besitzer oder Admin

Code: python
def darf_lesen(nutzer, rolle, besitzer):
    if rolle == "admin":
        return True
    return nutzer == besitzer

# Ändern Sie die Namen und führen Sie den Block aus.
# Lassen Sie danach auch die Rolle "support" lesen.
print(darf_lesen("lena", "kunde", "lena"))
print(darf_lesen("lena", "kunde", "jonas"))
print(darf_lesen("sven", "admin", "jonas"))

Über dieses Lab und seinen Quellcode: OWASP-Juice-Shop-Lab: ein verwundbarer Webshop zum Angreifen in der eigenen Kopie

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.