SQL Injection Beispiel + Verhindern {SQL + PHP im Login}

SQL-Injection Beispiele- Steffen Lippke
SQL-Injection Beispiele- Steffen Lippke

Was ist eine SQL Injection? Kann ich mich dieser Methode in jeden Account einloggen?

Ich zeige Dir, was SQL-Injection ist und wie Du Schwachstellen in (Deinen) Login finden und ausbessern kannst.

Starten wir!

Was ist eine SQL Injection?

Eine SQL-Injection ist ein Teil einer SQL-Abfrage, die ein Krimineller in eine bestehende SQL-Abfrage über Parameter einfügt. Die bestehende Abfrage ist in z. B. einer PHP-Datei gespeichert und das ausgeführte Ergebnis ist für den Angreifer verfügbar.

Durch spezielle SQL-Abfrage-Teile kann ein Angreifer eine SELECT-Anfrage in eine UPDATE oder DELETE Abfrage umwandeln, sodass er jegliche Operationen auf der Datenbank ausführen kann, solange der technische SQL-Nutzer genügend Rechte hat.

Steffen Lippke

Die speziellen Abfrage-Teile sehen auf den ersten Blick nicht aus wie einnormaler SQL-Befehl, weil diese die bestehende SQL adaptieren müssen.

Am Ende des Tutorial kannst Du Dir einen Zugang zu einem fremden Konto verschaffen, von dem Du nicht das Passwort kennen musst.

Dieses Tutorial zeigt Dir eine Variante, wie man Sicherheits-Lücken (Vulnerabilites) in einem Login finden kann.

Wie relevant ist die SQL Injection?

Bei den meisten, modernen Content Management Systemen (CMS) wie die kostenlose Blogs-Software WordPress oder Foren ist SQL-Injektion nicht mehr möglich, da die notwendigen Schutzmechanismen in den PHP-Code standardmäßig implementiert sind.

Viele (PHP-)Programmier-Anfänger vergessen bzw. kennen diese Sicherheitsmechanismen nicht und programmieren eine funktionalen, aber ungeschützten Login.

Tipp: Vulnerability Tester Pen (Pentration) Tester für SQL Injections. In diesem Tutorial zeige ich Dir nicht nur, wie Du diese Sicherheitslücke findest, sondern auch, wie Du Dich als Webhoster gegen eine solche Attacke absichern kannst.

Steffen Lippke

Wenige Zeilen Code machen einen großen Unterschied.

Dramatische Auswirkung der Injektion

Mit dieser SQL-Technik könnte der Angreifer sich unter der Verwendung einer Kontonummer oder einer Nutzernummer in jedes Bankkonto bzw. Nutzerkonto einloggen. Unbemerkt kann der Angreifer Geld bewegen, ohne dass die Bank davon etwas mitbekommt.

In 2012 hat Barclays ermittelt das 97 % der Daten-Einbrüche von SQL-Injektions stammen. Die Betrugskosten belaufen sich auf 2,7 Milliarden Euro. (Sophie Curtis

Login = Super einfach? Oder nicht?

Ein Login auf einer Webseite funktioniert nach folgendem Schema:

  1. Der Nutzer gibt seine / Ihre Credentials (Passwort und Benutzername) in die HTML-Eingabe-Felder ein
  2. Das Formular übergibt die Anmeldedaten an eine Anmelde-PHP-Script über GET oder POST Parameter mit dem Klick auf „Anmelden“
  3. Einen SQL-Befehl vergleicht die Credentials mit den Credentials mit der Tabelle der registrierten Nutzer und deren Passwörter-Hashs.
    1. Entweder hat die DB einen Account und mit dem passenden Passwort gefunden: Der SQL-Befehl war erfolgreich – Das Frontend zeigt dem Nutzer eine positive Rückmeldung an
    2. Die Datenbank findet den Account nicht oder das Passwort stimmt nicht überein: SQL-Befehl liefert keine Ergebnisse und PHP gibt den Fehler an das Frontend weiter.

Ablauf einer SQL Injection

Ein möglicher SQL-Befehl sieht so aus, wenn ein Login überprüft wird (vereinfachte Form):

SELECT * FROM accounts WHERE benutzername ='loginNutzer' AND password = 'loginPasswort'

Ich zeige Dir im nächsten Schritt ein Beispiel, wie ein normaler Login funktionieren sollte:

Zuerst brauchen wir einen Benutzernamen. Diesen finden wir bei jeden Kommentar auf einer Webseite oder in einem öffentlichen Profil.

Ein Benutzername ist schnell gefunden
Ein Benutzername ist schnell gefunden
Eine Zufällige Login Page
Eine zufällige Login Page

Schauen wir uns den Login-Vorgang und sehen uns an, indem wir das Netzwerk durch unseren Browser überwachen lassen.

Blick in den Code: Parameter übertragen

Mit dem gefundenen Namen melden wir uns an und verwenden irgendein Kennwort. Das Kennwort und der Benutzername überträgt der Browser mit einem POST-Parameter an ein PHP-Skript.

Wenn Du Deinen Netzwerk-Verkehr beobachten willst, dann habe ich für Dich ein Tutorial zur Überwachung von Internet-Traffic mit Wireshark für Anfänger vorbereitet

Die Logindaten werden mit Parametern übertragen
Die Logindaten werden mit Parametern übertragen

ATTACKE! – Universalpasswörter

f.loginNutzer und f.passwort sind die Anmelde-Variabelen, die das PHP-Script erhalten hat und fügt diese in den SQL Befehl ein. Der Trick ist es ein Passwort zu generieren, welches die Prüflogik aushebelt:

  • AND password = 'loginPasswort'
  • loginPasswort => ' OR ' '='
  • benutzername => 'loginNutzer' AND password = '' OR ' '=' '

Der eingefügte String erzeugt eine neue Bedingung, die immer erfüllt sein wird. Die Verzweigung mit OR ermöglicht, dass nur 1 Bedingung erfüllt sein muss: ' '=' '

Werfen wir einen Blick auf einen ungeschützten Login, der „veraltet“ ist.

Ein ungeschützer normaler Login der anföllig auf SQL Injection ist
Ein ungeschützer normaler Login der anfällig auf SQL Injection ist
Mit eine universal Login kann man die Login Page umgehen
Mit eine universal Login kann man die Login Page umgehen

So einfach kann man in ein Konto eindringen, welches einem nicht gehört.

Erfolg wir sind in dem Account
Erfolg wir sind in dem Account

Jetzt könnte der Eindringling. Das Passwort ändern und sich ein eigenes aussuchen, sodass der wahre Besitzer auf das Konto nicht mehr zugreifen kann.

Probiere mal diesen ungeschützten Login auf SQLzoon aus.

Hier kannst Du in den Login oben rechts Dich mit Nutzername „jake“ und als Universalpasswort ' OR ''='anmelden. Wenn Dir kein Nutzername bekannt ist, kannst Du das Universalpasswort als Nutzernamen verwenden.

Sicherung: Schutz vor Injections

Unser Ziel ist es die Parameter zu schützen.

Die präparierten Strings kann ein Skript mit einer If-Anweisung auffangen, aber der Hacker kann auch kreativer sein und mehr OR Iterationen einbauen.

Was ist die Lösung für das Problem?

Sicherungsmaßnahme: Encoding!

Verbiete bei der Auswahl des Passworts Zeichen wie Anführungszeichen oder alle Sonderzeichen. Damit der Nutzer in Zukunft sichere Passwörter mit Sonderzeichen wählen kann, nutze eine Encodierung.

Fügt jemand etwas HTML ein, sieht das nach der Konvertierung so aus:

$new = htmlspecialchars("<a href='inject'>Best</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;inject&#039;&gt;Best&lt;/a&gt;

Prepared Statements helfen dir bei der Einfügung von Parametern:

$stmt = $dbh->prepare("INSERT INTO users (name, passwordhash) VALUES (?, ?)");
$stmt->bindParam(1, $name);

und dann ein execute:

$name = 'one';
$stmt->execute();

Zum Härten der PDO-Verbindung empfehle ich noch:

$conn= new PDO('mysql:dbname=dbtest;host=232.232.231;charset=utf8', 'user23423', 'password');

$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Das PHP Script sollte immer Strings auf Inhalt prüfen (Länge, Typ, zulässige Werte), zu einem unschädlichen String encodieren und in die SQL-Abfrage über ein prepared/bindParameter einfügen.

Icons made by Gregor Cresnar from www.flaticon.com is licensed by CC 3.0 BY – Icons made by dDara from www.flaticon.com is licensed by CC 3.0 BY – Icons made by Icomoon from www.flaticon.com is licensed by CC 3.0 BY –Icons made by Those Icons from www.flaticon.com is licensed by CC 3.0 BY –


Danke fürs Lesen! Erhalte weitere Tutorials in meinem kostenlosen Newsletter.
Jeden Monat teile ich mit Dir 4 neue praxisnahe Tutorials.
Trage Deine Mail zum kostenlosen Empfang des Newsletters* ein.




Quellenangabe Bilder: Icons und SVG-Grafiken im Titelbild von Microsoft PowerPoint 2019, frei verfügbar nach EULA
*) Mit dem Abonnement des Newsletters erklären Sie sich mit der Analyse des Newsletters durch individuelle Messung, Speicherung und Analyse von Öffnungsraten und der Klickraten in Profilen zu Zwecken der Gestaltung künftig besserer Newsletter einverstanden. Sie können die Einwilligung in den Empfang des Newsletters und die Messung mit Wirkung für die Zukunft widerrufen. Mehr in der Datenschutzerklärung.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.


Jeden Monat teile ich mit den Mitgliedern
4 neue praxisnahe ausführliche Tutorials (je 1000+ Wörter).


Trage Deine Mail, damit Du
Deine Coding + Hacking Skills erweitern kannst!