Wie Du Dich ohne Passwort überall anmelden kannst – SQL-Injection

SQL Injection Steffen Lippke Hacking Series

Wäre es nicht schon eine Universal Passwort für alles zu haben?! – auch eine Passwort für fremde Konten?

Das ist mit „SQL-Injection“ möglich.

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

Now Hack I.T.

Aufgabe: „Universal-Passwort“ für ungeschützte Logins

Um was geht’s? – Thema

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 eine Variante, wie man Sicherheits-Lücken (Vulnerabilites) in einem Login finden kann.

Knappe Einordnung

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 zwar 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 sich Du Dich als Webhoster gegen eine solche Attacke absichern kannst.

Wenige Zeilen Code machen einen großen Unterschied.

DAS. Sagen die Medien.

Mit dieser SQL-Technik könnte der Angreifer sich unter der Verwendung einer Kontonummer oder einer Nutzernummer in jedes Bankkonto bzw. Nutzerkonto einloggen. Unbemerkt wäre es Ihm möglich Geld zu bewegen, so als, ob es der wahre Besitzer des Kontos machen würde.

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

Grundlagen: Wie funktioniert der Login?

Login einfach erklärt

Eine Login auf einer Webseite funktioniert nach folgendem Schema:

  1. Der Nutzer gibt seine / Ihre Creditals (Passwort und Benutzername) in die HTML-Eingabe-Felder ein
  2. Das Formular übergibt die Anmeldedaten an eine Einlog-PHP-Script bei Klick auf Anmelden
  3. Die Anmeldedaten vergleicht einen SQL-Befehl mit den Datensätzen in einer Tabelle: In dieser stehen die Liste der registrierten Nutzern der Webseite. Die Datenbank hat zwei Möglichkeiten zu antworten:
    1. Entweder hat diese einen Account und Passwort gefunden: SQL-Befehl erfolgreich – im Frontend wird eine positive Rückmeldung ausgegeben
    2. Die Datenbank findet den Account nicht oder Passwort stimmt nicht: SQL-Befehl meldet nichts zurück oder auch Fehler (Sollte dem Endnutzer unsichtbar bleiben).

Praxis – Abfragen bei Datenbanken

Ein möglicher SQL-Befehl sieht so aus:

Hack IT: SQL Statements in Login

Spurensuche: Login-Namen finden

Ich zeige Dir im nächsten Schritt ein Beispiel, wie ein normaler Login funktionieren sollte: Zuerst brauchen wir eine Namen. Diesen finden wir bei jeden Kommentar auf einer Webseite oder öffentlichen Profil.

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

Testen wir den Login-Vorgang und sehen uns an, was über das Netzwerk aus unserem Browser übertragen wird.

Blick in den Code: Parameter übertragen

Mit dem gefunden Namen melden wir uns nun an und nehmen irgendeinem Kennwort. Das Kennwort und der Benutzername überträgt der Browser mit einem POST-Parameter an ein PHP-Skript.

Wenn Du im Detail über Deinen Netzwerk-Verkehr beobachten willst, dann habe ich für Dich eine 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

loginNutzer und loginPasswort sind die Anmelde-Variabelen, die das PHP-Script erhalten hat und fügt diese in den SQL Befehl ein. Der Trick ist 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ützen 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 nutzen.

Sicherung: Encode die Eingaben

Unser Ziel ist es die Passworteingabe zu schützen. Die präparierten Strings könnte ein Skript mit einer If-Anweisung auffangen, aber der Hacker kann auch kreativer sein und noch eine paar mehr OR Iterationen einbauen.

Lösung für das Problem?

Sicherungsmaßnahme: Encoding!

Entweder verbietet bei der Auswahl des Passworts Zeichen wie ‚ oder gleich alle Sonderzeichen. Einfach ist es alle Zeichen zu einem harmlosen String zu konvertiert.

Die PHP Statements können Strings vorbereiten, encodieren und in die SQL-Abfrage 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 –

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.