- 1 Section
- 10 Lessons
- unbegrenzt
- Sichere Softwareentwicklung (Secure Coding)10
SQL-Injection
SQL-Injection war über zehn Jahre die Nummer-1-Schwachstelle der OWASP Top 10 und steht auch 2021 noch unter den Top 3 (A03 Injection). Sie ist einfach zu verstehen, verheerend in den Auswirkungen und in erschreckend vielen Anwendungen noch heute ausnutzbar. Das Prinzip: Nutzereingaben werden ungeprüft als Teil einer SQL-Abfrage ausgeführt – der Angreifer kontrolliert damit die Datenbankabfrage.
Das ist vergleichbar damit, jemandem einen Zettel mit der Aufschrift „Hol mir Buch 17" zu geben, und er gibt dir einen Zettel mit der Aufschrift „Hol mir Buch 17 und dazu alle Bücher, die es gibt, und außerdem lösche Buch 18" – und du befolgst es einfach, weil der Zettel wie alle anderen aussieht. Die Datenbank unterscheidet nicht zwischen legitimem SQL und injiziertem SQL: Befehl ist Befehl.
1) SQL-Injection live: das verwundbare Login
Das folgende Demo zeigt ein typisches verwundbartes Login-Formular. Gib einen normalen Nutzernamen ein, beobachte das resultierende SQL – und teste dann bekannte Angriffs-Payloads. Gefährliche Eingaben sind rot markiert, das resultierende SQL zeigt, was die Datenbank wirklich ausführt.
2) Die Lösung: Prepared Statements
Der Unterschied zwischen verwundbar und sicher ist in der Praxis oft eine einzige Code-Zeile. Bei einem Prepared Statement wird zuerst die SQL-Abfrage mit Platzhaltern an die Datenbank gesendet und kompiliert – danach werden die Nutzerwerte separat als Daten übergeben, nie als Teil des SQL-Codes. Der Angreifer kann injizieren was er will: es wird als Daten behandelt, nicht als SQL.
$user = $_POST['user'];
$pass = $_POST['pass'];
$sql = "SELECT * FROM users
WHERE user='"
. $user . "' AND
pass='" . $pass . "'";
$result = query($sql);
// Eingabe landet direkt im SQL!
$user = $_POST['user'];
$pass = $_POST['pass'];
$stmt = $pdo->prepare(
"SELECT * FROM users
WHERE user=? AND pass=?"
);
$stmt->execute([$user, $pass]);
// Eingabe = Daten, nie SQL
3) SQLi-Varianten
SQL-Injection ist kein einzelner Angriff, sondern eine Familie. Die Variante bestimmt, wie der Angreifer das Ergebnis seiner Abfrage erhält.
Zusammenfassung
SQL-Injection entsteht, wenn Nutzereingaben ungeprüft in SQL-Abfragen eingebettet werden. Angreifer können damit Daten stehlen, Authentication umgehen, Daten manipulieren oder löschen. Lösung: Prepared Statements / Parameterized Queries. ORM verwenden. Eingaben validieren. Datenbankbenutzer mit minimalen Rechten betreiben (Least Privilege). Verbunden mit: Input-Validierung und Sanitizing, OWASP A03 Injection.
