Zwölf Befunde, sechs Namen
Eine Firma prüft die Website eines Kunden und schreibt zwölf Befunde auf. Sie wirken unverbunden: eine Fehlerseite, ein seltsamer Link, ein Dateiname in einer Adresse.
Eine gute Prüferin liest die Liste und sieht sechs Familien. Jede Familie hat eine Ursache und eine Lösung. Diese Lektion lehrt Sie, Befunde in Familien einzuordnen.
Die eine Regel
Warnung
Dieses Lab ist eine Website, die 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 eine verwundbare Seite der Fehlerklasse zuordnen, die sie zeigt.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Fehlerklasse | eine Familie von Schwächen mit gemeinsamer Ursache | |
| Injection | getippter Text, der als Teil eines Befehls oder einer Abfrage gelesen wird | |
| Path Traversal | ein Dateiname, der aus dem vorgesehenen Ordner herausklettert | ../ |
| Offene Weiterleitung | ein Link, der Besucher an jede Adresse schickt, die man ihm gibt | |
| Eingabe | alles, was ein Besucher an eine Seite tippt oder sendet | |
| Senke | die Stelle im Programm, an der ein Wert zuletzt verwendet wird; auf Englisch Sink |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Folgen Sie der Eingabe bis zur Senke
Die meisten Fehler folgen einem Muster. Ein Wert kommt von einem Besucher. Er wandert durch das Programm. Er erreicht eine Senke, wo er verwendet wird.
Die Klasse des Fehlers hängt von der Senke ab. Stellen Sie jeder Seite eine Frage: Wo landet das, was ich tippe?
Beispiel: Senke und Klasse
| Wo der Wert landet | Fehlerklasse | Die Lösung in einer Zeile |
|---|---|---|
| In einer Datenbankabfrage | SQL-Injection | Als Parameter senden |
| In der Seite, die der Browser zeichnet | Cross-Site-Scripting | Bei der Ausgabe maskieren |
| In einem Dateinamen, den der Server öffnet | Path Traversal | Nur Namen aus einer Liste erlauben |
| In einem Befehl, den der Server ausführt | Befehls-Injection | Nie Befehle aus Text bauen |
| In einer Adresse, zu der der Besucher geschickt wird | Offene Weiterleitung | Nur eigene Adressen erlauben |
| Als Kennung ohne Prüfung des Besitzers | Fehlende Zugriffskontrolle | Jedes Mal den Besitzer prüfen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jede Klasse hinterlässt ein Zeichen in der Anfrage
Oft erkennen Sie die Klasse an einer einzigen Anfrage. Ein Dateiname mit ../ deutet auf Path Traversal. Ein Tag in einem Wert deutet auf XSS. Ein weiter=-Wert mit vollständiger Adresse deutet auf eine offene Weiterleitung.
Zum Einordnen müssen Sie nichts ausführen. Sie lesen die Anfrage und fragen, wofür der Wert gedacht ist.
Beispiel: fünf erfundene Anfragen
| Anfrage | Klasse |
|---|---|
| /ansicht?datei=../../etc/hosts | Path Traversal |
| /gruss?name=<i>Bo</i> | Cross-Site-Scripting |
| /weiter?ziel=http://andere.example | Offene Weiterleitung |
| /suche?id=5 UNION SELECT 1 | SQL-Injection |
| /werkzeug?host=a.example; cat notizen | Befehls-Injection |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Website in Ihrem Lab
Ihr Lab betreibt Mutillidae, eine Website mit absichtlich vielen Fehlern. Starten Sie sie und führen Sie diese drei Befehle der Reihe nach aus. Der erste meldet mit dem eigenen Konto des Labs an und legt die Anmeldung in einer Datei ab. Der zweite schlägt genau dieses Konto über Namen und Passwort nach. Der dritte fragt nach einem Namen, den die Seite nicht kennt. Alles drei ist normale Benutzung.
Mit dem Konto des Labs anmelden
curl -s -c jar -d "username=admin&password=adminpass&login-php-submit-button=Login" -o /dev/null -w "%{http_code} %{redirect_url}\n" "http://www/index.php?page=login.php"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Konto nachschlagen
curl -s -b jar -c jar -G "http://www/index.php" --data-urlencode "page=user-info.php" --data-urlencode "username=admin" --data-urlencode "password=adminpass" --data-urlencode "user-info-php-submit-button=View Account Details" | grep -o "[0-9]* records found"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Einen unbekannten Namen nachschlagen
curl -s -b jar -c jar -G "http://www/index.php" --data-urlencode "page=user-info.php" --data-urlencode "username=niemand" --data-urlencode "password=nichts" --data-urlencode "user-info-php-submit-button=View Account Details" | grep -o "[0-9]* records found"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 die drei Ausgaben sagen
Die erste gibt 302 und eine Adresse aus, die auf AU1 endet: Die Seite hat die Anmeldung angenommen. Die zweite gibt 1 records found aus, die dritte 0 records found.
Die Seite zählt also die Zeilen, die ihre Abfrage liefert. Damit ist sie eine Senke: Der Name, den Sie tippen, gelangt in eine Datenbankabfrage. Auf welche Klasse würden Sie sie testen? Prüfen Sie Ihre Antwort an der Tabelle oben.
Ein häufiger Fehler
Warnung
Viele glauben, eine Liste verbotener Wörter könne jede Klasse stoppen. Das stimmt nicht. Jede Klasse hat eine andere Senke und braucht die passende Lösung an ihrer eigenen Senke. Ein Filter für Script-Tags hilft bei einem Dateinamen nicht. Sichern Sie jede Senke so, wie ihre Klasse es verlangt.
Unter den meisten Klassen liegt eine Ursache
Injection, XSS, Traversal und die übrigen teilen eine Ursache. Ein Programm mischt Daten mit Anweisungen, und die nächste Schicht kann sie nicht unterscheiden.
Die Abhilfe ist jedes Mal derselbe Gedanke. Halten Sie Daten in ihrer eigenen Spur: Parameter, Maskieren, Listen erlaubter Werte. Mutillidae hat die Sicherheitsstufen 0, 1 und 5, damit Sie dieselbe Seite mit und ohne Abhilfe sehen.
Weiterführend: ein getarntes Traversal
Ein Angreifer kann jeden Punkt als %2e schreiben, aus ../ wird dann %2e%2e/. Die Regeln der Aufgabe übersehen /ansicht?datei=%2e%2e/geheim und nennen es normal.
Wenn Ihre Aufgabe besteht, kopieren Sie klassifiziere in einen eigenen Codeblock. Fügen Sie die eine Ersetzung hinzu, die es erkennt. Erklären Sie dann, warum ein echter Server die ganze Adresse einmal dekodiert, vor jeder Prüfung.