SQL-Injection-Tutorial: Lernen anhand von Beispielen
Was ist eine SQL-Injection?
SQL-Injection ist ein Angriff, der dynamische SQL-Anweisungen vergiftet, um bestimmte Teile der Anweisung auszukommentieren oder eine Bedingung anzuhängen, die immer wahr ist. Es nutzt die Designfehler schlecht gestalteter Webanwendungen aus, um SQL-Anweisungen zur Ausführung bösartigen SQL-Codes auszunutzen.
Daten sind eine der wichtigsten Komponenten von Informationssystemen. Datenbankbasierte Webanwendungen werden von der Organisation verwendet, um Daten von Kunden abzurufen. SQL ist die Abkürzung für Structured Query Language. Es wird zum Abrufen und Bearbeiten von Daten in der Datenbank verwendet.
Wie funktioniert ein SQL-Injection-Angriff?
Die Arten von Angriffen, die mithilfe der SQL-Injection durchgeführt werden können, variieren je nach Art der Datenbank-Engine. Der Angriff funktioniert auf dynamische SQL-Anweisungen. Eine dynamische Anweisung ist eine Anweisung, die zur Laufzeit mithilfe der Parameter „Passwort“ aus einem Webformular oder einer URI-Abfragezeichenfolge generiert wird.
Beispiel für eine SQL-Injection
Betrachten wir eine einfache Webanwendung mit einem Anmeldeformular. Der Code für das HTML-Formular wird unten angezeigt.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
HIER,
- Das obige Formular akzeptiert die E-Mail-Adresse und das Passwort und sendet sie dann an eine PHP Datei mit dem Namen index.php.
- Es besteht die Möglichkeit, die Anmeldesitzung in einem Cookie zu speichern. Dies haben wir aus der Checkbox „remember_me“ abgeleitet. Zum Senden von Daten wird die Post-Methode verwendet. Dies bedeutet, dass die Werte nicht in der URL angezeigt werden.
Nehmen wir an, die Anweisung im Backend zur Überprüfung der Benutzer-ID lautet wie folgt
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
HIER,
- Die obige Anweisung verwendet die Werte von
$_POST[]
Array direkt, ohne es zu desinfizieren. - Das Passwort wird mit dem MD5-Algorithmus verschlüsselt.
Wir werden den SQL-Injection-Angriff mit sqlfiddle veranschaulichen. Öffnen Sie die URL http://sqlfiddle.com/ in Ihrem Webbrowser. Sie erhalten das folgende Fenster.
Hinweis: Sie müssen die SQL-Anweisungen schreiben
Schritt 1) Geben Sie diesen Code im linken Bereich ein
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
Schritt 2) Klicken Sie auf Schema erstellen
Schritt 3) Geben Sie diesen Code im rechten Bereich ein
select * from users;
Schritt 4) Klicken Sie auf SQL ausführen. Sie sehen das folgende Ergebnis
Angenommen, Benutzerlieferungen admin@admin.sys und 1234 als Passwort. Die Anweisung, die für die Datenbank ausgeführt werden soll, wäre
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Der obige Code kann ausgenutzt werden, indem der Passwortteil auskommentiert und eine Bedingung angehängt wird, die immer erfüllt ist. Nehmen wir an, ein Angreifer gibt die folgende Eingabe in das E-Mail-Adressfeld ein.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx für das Passwort.
Die generierte dynamische Anweisung sieht wie folgt aus.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
HIER,
- xxx@xxx.xxx endet mit einem einfachen Anführungszeichen, das das String-Anführungszeichen vervollständigt
OR 1 = 1
LIMIT 1 ist eine Bedingung, die immer wahr ist und die zurückgegebenen Ergebnisse auf nur einen Datensatz beschränkt.- — ' AND … ist ein SQL-Kommentar, der den Passwortteil eliminiert.
Kopieren Sie die obige SQL-Anweisung und fügen Sie sie ein SQL FiddleFühren Sie das SQL-Textfeld wie unten gezeigt aus
Hacking-Aktivität: SQL-Inject einer Webanwendung
Wir haben eine einfache Webanwendung unter http://www.techpanda.org/ das nur zu Demonstrationszwecken anfällig für SQL-Injection-Angriffe ist. Der obige HTML-Formularcode stammt von der Anmeldeseite. Die Anwendung bietet grundlegende Sicherheit, wie z. B. die Bereinigung des E-Mail-Felds. Dies bedeutet, dass unser obiger Code nicht verwendet werden kann, um die Anmeldung zu umgehen.
Um dies zu umgehen, können wir stattdessen das Passwortfeld ausnutzen. Das folgende Diagramm zeigt die Schritte, die Sie befolgen müssen
Nehmen wir an, ein Angreifer gibt folgende Eingabe ein
- Schritt 1: Geben Sie xxx@xxx.xxx als E-Mail-Adresse ein
- Schritt 2: Geben Sie xxx') ODER 1 = 1 — ] ein
- Klicken Sie auf die Schaltfläche Senden
- Sie werden zum Dashboard weitergeleitet
Die generierte SQL-Anweisung sieht wie folgt aus
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Das Diagramm unten zeigt, dass die Anweisung erstellt wurde.
HIER,
- Die Aussage geht intelligenterweise davon aus, dass MD5-Verschlüsselung verwendet wird
- Vervollständigt das einfache Anführungszeichen und die schließende Klammer
- Fügt der Aussage eine Bedingung hinzu, die immer wahr ist
Im Allgemeinen werden bei einem erfolgreichen SQL-Injection-Angriff verschiedene Techniken wie die oben gezeigten ausprobiert, um einen erfolgreichen Angriff durchzuführen.
Andere Arten von SQL-Injection-Angriffen
SQL-Injections können mehr Schaden anrichten als nur die Anmeldealgorithmen zu umgehen. Einige der Angriffe umfassen
- Löschen von Daten
- Daten aktualisieren
- Daten einfügen
- Ausführen von Befehlen auf dem Server, die Schadprogramme wie Trojaner herunterladen und installieren können
- Exportieren wertvoller Daten wie Kreditkartendaten, E-Mails und Passwörter auf den Remote-Server des Angreifers
- Abrufen von Benutzeranmeldedaten usw.
- SQL-Injection basierend auf Cookies
- Fehlerbasierte SQL-Injection
- Blinde SQL-Injection
Die obige Liste ist nicht vollständig; Es gibt Ihnen nur eine Vorstellung davon, was SQL-Injection ist
Automatisierungstools für SQL-Injection
Im obigen Beispiel haben wir manuelle Angriffstechniken verwendet, die auf unseren umfassenden SQL-Kenntnissen basieren. Es gibt automatisierte Tools, die Ihnen helfen können, die Angriffe effizienter und innerhalb kürzester Zeit durchzuführen. Zu diesen Tools gehören
- SQLMap – http://sqlmap.org/
- JSQL-Injection – https://tools.kali.org/vulnerability-analysis/jsql
So verhindern Sie SQL-Injection-Angriffe
Eine Organisation kann die folgende Richtlinie übernehmen, um sich vor SQL-Injection-Angriffen zu schützen.
- Benutzereingaben sollten niemals vertrauenswürdig sein – Es muss immer bereinigt werden, bevor es in dynamischen SQL-Anweisungen verwendet wird.
- Gespeicherte Prozeduren - Diese können die SQL-Anweisungen kapseln und alle Eingaben als Parameter behandeln.
- Vorbereitete Stellungnahmen – Vorbereitete Anweisungen funktionieren, indem zuerst die SQL-Anweisung erstellt und dann alle übermittelten Benutzerdaten als Parameter behandelt werden. Dies hat keine Auswirkungen auf die Syntax der SQL-Anweisung.
- Reguläre Ausdrücke - Diese können verwendet werden, um potenziell schädlichen Code zu erkennen und ihn vor der Ausführung der SQL-Anweisungen zu entfernen.
- Benutzerzugriffsrechte für Datenbankverbindungen – Für gewohnte Konten sollten nur die erforderlichen Zugriffsrechte vergeben werden Verbindung zur Datenbank herstellen. Dies kann dazu beitragen, die Leistung der SQL-Anweisungen auf dem Server zu reduzieren.
- Fehlermeldungen - Diese sollten keine vertraulichen Informationen preisgeben und auch nicht angeben, wo genau ein Fehler aufgetreten ist. Einfache benutzerdefinierte Fehlermeldungen wie „Leider treten technische Fehler auf. Das technische Team wurde kontaktiert. Bitte versuchen Sie es später erneut“ können verwendet werden, anstatt die SQL-Anweisungen anzuzeigen, die den Fehler verursacht haben.
Hacking-Aktivität: Verwenden Sie Havij für SQL-Injection
In diesem praktischen Szenario verwenden wir das Havij Advanced SQL Injection-Programm, um eine Website auf Schwachstellen zu scannen.
Hinweis: Ihr Antivirus Programm kann es aufgrund seiner Natur markieren. Sie sollten es zur Ausschlussliste hinzufügen oder Ihre Antivirensoftware pausieren.
Das Bild unten zeigt das Hauptfenster für Havij
Das oben genannte Tool kann verwendet werden, um die Verwundbarkeit einer Website/Anwendung zu bewerten.
Zusammenfassung
- SQL-Injection ist ein Angriffstyp, der fehlerhafte SQL-Anweisungen ausnutzt
- Mithilfe von SQL-Injection können Anmeldealgorithmen umgangen und Daten abgerufen, eingefügt, aktualisiert und gelöscht werden.
- Zu den SQL-Injection-Tools zählen SQLMap, SQLPing, SQLSmack usw.
- Eine gute Sicherheitsrichtlinie beim Schreiben von SQL-Anweisungen kann dazu beitragen, SQL-Injection-Angriffe zu reduzieren.