Die häufigste Lücke in Kundenportalen findet kein Scanner
Ein Kundenportal. Eine echte Nutzerin, ordnungsgemäß angemeldet, öffnet eines ihrer Dokumente. Die Adresse lautet etwa /api/dokumente/4187.
Sie ändert die Zahl. 4186. Und sieht den unterschriebenen Vertrag eines anderen Unternehmens.
Es ist der erste Punkt der OWASP-Liste für APIs, er heißt Broken Object Level Authorization, und wir finden ihn in einem guten Teil der Portale, zu denen man uns ruft.
Warum kein Scanner ihn findet
Weil es technisch keinen Fehler gibt. Das Programm tut genau, worum es gebeten wurde: es wurde nach Dokument 4186 gefragt und liefert Dokument 4186. Es stürzt nicht ab, gibt keine Warnung aus, antwortet mit 200.
Ein automatisches Werkzeug sucht bekannte Muster: ungefilterte Eingaben, alte Versionen, falsche Konfigurationen. Es kann nicht wissen, dass dieses Dokument nicht dem gehört, der es anfragt, denn diese Information steckt in Ihrem Geschäftsmodell, nicht im Code.
Wie sie versehentlich entsteht
So:
if (!benutzer_angemeldet()) {
return null;
}
return db()->zeile('SELECT * FROM dokumente WHERE id = ?', [$id]);
Eine Prüfung gibt es, und es ist die, die alle erwarten: ohne Anmeldung kein Zugang. Aber die Frage, die die letzte Zeile beantwortet, lautet „gibt es Dokument 4186?“, nicht „gehört Dokument 4186 dem, der es anfragt?“.
Wie sie geschlossen wird
$benutzer = benutzer_angemeldet();
if (!$benutzer) {
return null;
}
return db()->zeile(
'SELECT * FROM dokumente WHERE id = ? AND kunde_id = ?',
[$id, $benutzer->kunde_id]
);
Die Korrektur fügt keine Prüfung hinzu: sie nimmt die Möglichkeit, eine zu vergessen.
Solange die Berechtigung ein if neben der Abfrage ist, wird früher oder später jemand eine neue Abfrage ohne dieses if schreiben — vielleicht in zwei Jahren, vielleicht ein anderer Dienstleister. In die Abfrage hineingelegt, lässt sich die falsche Frage gar nicht mehr stellen.
Und es gibt einen nützlichen Nebeneffekt: wer eine zufällige Zahl ausprobiert, bekommt eine 404 und erfährt nicht einmal, dass diese Zahl zu irgendetwas gehört.
Wie Sie es bei sich prüfen
Es braucht eine Person, zwei Testkonten und eine halbe Stunde. Öffnen Sie etwas mit dem ersten Konto, nehmen Sie die Adresse und probieren Sie sie mit dem zweiten. Sehen Sie das Dokument des ersten, haben Sie sie gefunden.
Man muss nicht technisch sein, um diesen Test zu machen. Man muss ihn nur machen.
$ ls ./journal --altri
Als Nächstes lesen
Kundenportal: wann es sich lohnt und wann es Verschwendung ist
Non è una questione di dimensione dell'azienda. È una questione di quante volte alla settimana rispondi alla stessa domanda.
Was kostet Sie eine Anfrage? Wissen Sie es nicht, geben Sie blind aus
Il conto è una divisione. Il difficile non è farla: è avere i due numeri giusti, e quasi nessuno ce li ha.
Ein Angebot vor dem Prototyp ist eine Wette
Perché chiediamo di costruire le schermate principali prima di dire quanto costa tutto il resto — e perché conviene anche a chi paga.
