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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Authentifizierung | der Nachweis, wer Sie sind | ein Passwort |
| Autorisierung | die Prüfung, was Sie tun dürfen | |
| Rolle | ein benannter Satz von Rechten | admin |
| Kennung | eine Zahl oder ein Name, der genau einen Datensatz bezeichnet | Bestellung 17 |
| Token | ein signierter Wert, den ein Browser sendet, um die Anmeldung zu zeigen | |
| Statuscode | eine Zahl am Anfang einer Antwort, die sagt, wie es lief | 401 |
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
curl -s -o /dev/null -w "%{http_code}\n" http://juice-shop:3000/api/Products/1Hier 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
curl -s -o /dev/null -w "%{http_code}\n" http://juice-shop:3000/api/UsersHier 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
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
| Anfrage | Status | Was es Ihnen sagt |
|---|---|---|
| /api/Products/1 | 200 | Ein Produkt ist öffentlich, jeder darf es lesen |
| /api/Users | 401 | Der Shop will wissen, wer fragt, bevor er Personen auflistet |
| /rest/basket/1 | 401 | Ein 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
| Nutzer | Rolle | Anfrage | Erlaubt? |
|---|---|---|---|
| lena | Kundin | GET /bestellungen/17 (ihre) | Ja, sie besitzt sie |
| lena | Kundin | GET /bestellungen/18 (von Jonas) | Nein, sie gehört ihr nicht |
| sven | Admin | GET /bestellungen/18 | Ja, ein Admin darf jede Bestellung lesen |
| jonas | Kunde | GET /admin/nutzer | Nein, 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
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"))