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.
curl -s -G --data-urlencode "q=pen" http://app:8000/searchHier 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.
curl -s -G --data-urlencode "q=x' OR 1=1 --" http://app:8000/searchHier 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.
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.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
docker restart appHier 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.
curl -s -G --data-urlencode "q=x' OR 1=1 --" http://app:8000/searchHier 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.
docker exec app sh /tmp/app/lab-checkHier 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.