SQL-Injection (SQLi) – Gefahr aus der Datenbank

🔍 Was ist eine SQL-Injection?

Eine SQL-Injection (Structured Query Language Injection) ist eine Form des Angriffs auf Datenbanken über Webanwendungen. Dabei wird schädlicher SQL-Code in Eingabefelder (z. B. Login-Formulare, Registrierungsfelder, Suchfelder, URLs) eingeschleust, um vertrauliche Daten auszulesen, zu manipulieren oder sogar ganze Systeme zu kompromittieren.

Ziel ist es, die Datenbankabfragen der Anwendung zu beeinflussen – etwa um:

  • Nutzerdaten zu stehlen (z. B. Passwörter, E-Mails, Kreditkarten)

  • Daten zu ändern oder zu löschen

  • Administrationsrechte zu erlangen

  • Zugriff auf interne Systeme zu erhalten

SQL-Injection gehört zu den Top 10 Bedrohungen laut der OWASP-Liste.

🧪 Wie funktioniert eine SQL-Injection?

Ein klassisches Beispiel: Ein unsicheres Login-Formular verarbeitet folgende SQL-Abfrage:

SELECT * FROM users WHERE username = ‚$user‘ AND password = ‚$pass‘;

Wenn ein Angreifer in das Feld username Folgendes eingibt:

‚ OR ‚1‘=’1

wird daraus:

SELECT * FROM users WHERE username = “ OR ‚1‘=’1′ AND password = ‚$pass‘;

Da '1'='1' immer wahr ist, wird der Zugriff ohne gültige Zugangsdaten gewährt.

🧨 Arten von SQL-Injection

Art der SQL-Injection Beschreibung
Classic SQL-Injection Direkte Manipulation von SQL-Statements über unsichere Eingabefelder.
Blind SQL-Injection Der Server gibt keine Fehlermeldung zurück – der Angreifer erhält Infos über Zeitverzögerungen oder Logik.
Error-based SQL-Injection Angreifer provoziert SQL-Fehler, um Informationen über die Struktur der Datenbank zu erhalten.
Union-based SQL-Injection Kombination mit UNION SELECT, um zusätzliche Daten aus anderen Tabellen anzuzeigen.
Second-order SQL-Injection Schädlicher Code wird gespeichert und zu einem späteren Zeitpunkt ausgeführt.

⚠️ Mögliche Schäden durch SQL-Injection

SQL-Injection wirken sich nicht nur schädlich auf die Software aus und stellen trastische Sicherheitsprobleme für diese Systeme da. Sondern können dazu auch zu echten Image-Problemen bei Unternehmen führen, welche Aufgrund von vertrauensverlust durch SQL-Injections zurückzuführen sind. Eines der oberesten Ziele von Software-Anwendungen, sollte der Schutz von Personenbezgoenen Daten vor Missbrauch durch kriminelle Dritte sein! Dies ist aber ein ständiges Katz und Mausspiel. Nicht nur die Sicherheitstechniken werden besser, nein auch die Kriminellen werden stetig mit besserer Hardware, Software und Systemen ausgestattet.

  • Datendiebstahl (personenbezogene Daten, Passwörter, geschäftskritische Infos)

  • Manipulation oder Löschung von Daten

  • Übernahme von Benutzerkonten

  • Vollständiger Systemzugriff (z. B. über xp_cmdshell bei MSSQL)

  • Ruf- und Vertrauensverlust

  • Verstöße gegen Datenschutzgesetze (DSGVO, HIPAA etc.)

🛡️ Schutzmaßnahmen gegen SQL-Injection

  1. Prepared Statements / Parameterized Queries

    • Verwende PDO oder mysqli mit Platzhaltern:

$stmt = $pdo->prepare(‚SELECT * FROM users WHERE email = ?‘);
$stmt->execute([$email]);

  1. RMs und Frameworks verwenden

    • Frameworks wie Laravel, Symfony, Django oder Rails kapseln SQL-Anfragen sicher.

  2. Eingabedaten validieren und filtern

    • Whitelisting: Nur erlaubte Zeichen / Formate akzeptieren.

    • Blacklisting ist unsicher und nicht ausreichend.

  3. Least Privilege-Prinzip

    • Die Datenbanknutzer der Webanwendung sollten nur notwendige Rechte haben.

  4. Fehlermeldungen unterdrücken

    • Gib keine SQL-Fehlermeldungen an den Client weiter.

  5. WAF einsetzen

    • Eine Web Application Firewall kann einfache SQLi-Versuche blockieren.

🧰 Tools zum Testen und Erkennen

  • sqlmap: Automatisches Tool zur Erkennung und Ausnutzung von SQLi.

  • Burp Suite: Manuelle und automatisierte Tests.

  • OWASP ZAP: Open-Source Web Application Scanner.

  • Acunetix, Netsparker: kommerzielle Scanner für Sicherheitslücken.

🔐 Beispiel einer sicheren Umsetzung

<?php
// Verbindung zur DB herstellen (PDO)
$pdo = new PDO(‚mysql:host=localhost;dbname=webapp‘, ‚user‘, ‚pass‘);
$email = $_POST[‚email‘] ?? “;

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$stmt = $pdo->prepare(‚SELECT * FROM users WHERE email = :email‘);
$stmt->execute([‚email‘ => $email]);
$user = $stmt->fetch();
}
?>

📈 Fazit

SQL-Injection ist nach wie vor eine der gefährlichsten Schwachstellen in Webanwendungen – nicht aufgrund technischer Komplexität, sondern weil viele Websites noch immer unsichere Praktiken verwenden. Eine gut konfigurierte Anwendung mit modernen Frameworks, prepared statements und Sicherheitsbewusstsein kann SQL-Injection vollständig verhindern. Prävention ist hier viel einfacher als Schadensbegrenzung nach einem Angriff. Somit sollten sich Unternehmen immer mal wieder Ihre Software durch regelmäßige Sicherheits-Audits überprüfen lassen. Lieber frühzeitig Schwachstellen identifizieren und beheben, als im Nachgang teure Schadensbekänpfung und Ursachen Forschung zu betreiben.