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

SQL-Injection beheben: Grundlagen

Die ganze Lektion steht hier zum Lesen. Erstellen Sie ein kostenloses Konto, um sie in einem Live-Lab auszuführen.

Container-Lab8 Min. Lesezeit6 Befehle

Was du machst

SQL-Injection passiert, wenn ein Programm eine Datenbankfrage baut, indem es das, was jemand eingetippt hat, in den Text der Frage klebt. Dann kann die Person die Frage vorzeitig beenden und eine eigene schreiben. Du suchst in einem kleinen Shop, bringst seine Suchseite dazu, Dinge herauszugeben, die sie nicht herausgeben sollte, behebst die eine Codezeile, die das erlaubt, und zeigst, dass der Angriff nicht mehr funktioniert.

Die eine Regel

Warnung

In diesem Lab läuft eine Website, die absichtlich unsicher ist. Greife sie an und nichts anderes. Es ist deine eigene private Kopie ohne Weg ins Internet, niemand sonst kann also betroffen sein. Probiere das niemals bei einer Seite aus, die dir nicht gehört: Im Vereinigten Königreich ist das nach dem Computer Misuse Act 1990 eine Straftat.

Bevor du anfängst

Notiz

Drücke oben in der Leiste dieser Lektion auf Lab starten und warte, bis dort steht, dass es läuft. Der Shop ist der Dienst namens app, und das Terminal erreicht ihn unter diesem Namen. Jede Schaltfläche Ausführen tippt ihren Befehl in das Terminal deines Labs, einen nach dem anderen in derselben Sitzung. Willst du zuschauen oder eigene Befehle tippen, drücke in der Leiste auf Terminal öffnen (neuer Tab).

1. Suche im Shop

Die Suche des Shops ist eine Webadresse. curl -s ruft sie auf, und -G --data-urlencode hängt deinen Suchbegriff hinter die Adresse, wobei Anführungszeichen und Leerzeichen unschädlich gemacht werden. Die Suche nach pen gibt eine Zeile aus, Pen 1.2: den Namen und den Preis.

Befehl
curl -s -G --data-urlencode "q=pen" http://app:8000/search

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

2. Brich aus der Frage aus

Im Programm wird deine Suche zwischen zwei Anführungszeichen geklebt. Ein Anführungszeichen in deiner Suche beendet sie vorzeitig, OR 1=1 ist für jede Zeile wahr, und -- macht den Rest der Frage zu einem Kommentar. Der Shop listet sieben Produkte auf, darunter Staff discount card und Unreleased drone. Sie sind nicht im Verkauf und dürften nie gezeigt werden. Derselbe Trick mit UNION SELECT kann nach einer ganz anderen Tabelle fragen. Probiere das selbst: Der Shop hat eine Tabelle users.

Befehl
curl -s -G --data-urlencode "q=x' OR 1=1 --" http://app:8000/search

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

3. Repariere die Zeile

Das Programm liegt im Container, und die schwache Zeile ist die, die mit rows = beginnt. Sie fügt deine Suche mit + in die Frage ein. Eine parametrisierte Abfrage schickt die Frage und deine Suche getrennt an die Datenbank. Was du getippt hast, kann so immer nur ein Wert sein und nie Teil der Frage. Das ? zeigt, wo der Wert hingehört, und die Suche wird daneben übergeben. Von Hand öffnest du das Programm mit docker exec -it app vi /tmp/app/app.py und ersetzt diese Zeile (i zum Tippen, Esc und dann :wq zum Speichern). Der nächste Befehl macht dieselbe Änderung für dich, mit dieser Zeile:

rows = db.execute("SELECT name, price FROM products WHERE public = 1 AND name LIKE ?", ("%" + term + "%",)).fetchall()

4. Ändere die Zeile und starte neu

Das ersetzt genau diese eine Zeile. Der Shop liest sein Programm nur einmal beim Start, deshalb startet docker restart die neue Version. Das dauert etwa zehn Sekunden und gibt dann app aus. Steht in seinem Kasten noch, dass es läuft, warte auf app im Terminal, bevor du weitermachst.

Befehl
docker exec app sed -i 's|^    rows = .*|    rows = db.execute("SELECT name, price FROM products WHERE public = 1 AND name LIKE ?", ("%" + term + "%",)).fetchall()|' /tmp/app/app.py

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

Befehl
docker restart app

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

5. Greife noch einmal an

Derselbe Angriff wie in Schritt 2 gibt jetzt gar nichts mehr aus. Die Datenbank hat nach einem Produkt gesucht, dessen Name den ganzen Text x' OR 1=1 -- enthält, und es gibt keins.

Befehl
curl -s -G --data-urlencode "q=x' OR 1=1 --" http://app:8000/search

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

6. Prüfe, ob die normale Nutzung noch funktioniert

Eine Reparatur, die den Shop kaputt macht, ist keine Reparatur. lab-check probiert eine normale Suche, eine Suche nach Baker's (ein Produkt mit einem Anführungszeichen im Namen, bei dem das schwache Programm mit einem Datenbankfehler scheiterte), das OR und das UNION und gibt für jedes PASS oder FAIL aus. Alle vier zeigen PASS, und die letzte Zeile ist All checks pass. Drücke in der Lab-Leiste auf Lab beenden und dann auf Lab starten und führe den Befehl noch einmal aus: Deine Reparatur ist noch da, weil das Programm in einem benannten Volume liegt und die Plattform Volumes speichert.

Befehl
docker exec app sh /tmp/app/lab-check

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

Für Lehrkräfte

Tipp

Diese Lektion ist ein kleines Beispiel für eine Lektion, die in einem Lab bearbeitet wird: Die Schritte und die Schaltflächen „Ausführen“ sind die Lektion, und das Lab ist die eigene Kopie jeder lernenden Person. Nichts darin bewertet sich selbst. Die Lernenden geben den Angriff vor und nach der Reparatur ab, die letzte Ausgabe von lab-check und die Zeile, die sie geändert haben, mit einem eigenen Satz dazu, warum sie sicher ist, und Sie bewerten die Belege. Kopieren Sie die Lektion in Ihr eigenes Modul und ändern Sie sie, oder bauen Sie mit dem Menü Lab im Lektionseditor eine neue.

Über dieses Lab und seinen Quellcode: SQL-Injection-Lab: eine schwache Shop-Suche angreifen, die Abfrage reparieren und die Reparatur belegen

Sie unterrichten eine Klasse? Weisen Sie diese Lektionen Ihren Lernenden zu, mit Bewertung und einem Lab für jede lernende Person.