SQL Injection
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
Was ist SQL-Injection?
Eine SQL-Injection ist ein Sicherheitsfehler, der Angreifern ermöglicht, Datenbankabfragen einer Anwendung zu beeinflussen. Diese Schwachstelle kann Angreifern ermöglichen, Daten anzuzeigen, zu ändern oder zu löschen, auf die sie keinen Zugriff haben sollten, einschließlich Informationen anderer Benutzer oder aller Daten, auf die die Anwendung zugreifen kann. Solche Aktionen können zu dauerhaften Änderungen an der Funktionalität oder dem Inhalt der Anwendung führen oder sogar zu einer Kompromittierung des Servers oder zu einem Denial of Service.
Erkennung von Einstiegspunkten
Wenn eine Website anfällig für SQL-Injection (SQLi) erscheint, aufgrund ungewöhnlicher Serverantworten auf SQLi-bezogene Eingaben, ist der erste Schritt, zu verstehen, wie man Daten in die Abfrage injiziert, ohne sie zu stören. Dies erfordert die Identifizierung der Methode, um effektiv aus dem aktuellen Kontext zu entkommen. Dies sind einige nützliche Beispiele:
Dann müssen Sie wissen, wie Sie die Abfrage so reparieren, dass es keine Fehler gibt. Um die Abfrage zu reparieren, können Sie Daten eingeben, damit die vorherige Abfrage die neuen Daten akzeptiert, oder Sie können einfach Ihre Daten eingeben und ein Kommentarsymbol am Ende hinzufügen.
Beachten Sie, dass diese Phase einfacher wird, wenn Sie Fehlermeldungen sehen oder Unterschiede feststellen können, wenn eine Abfrage funktioniert und wenn nicht.
Kommentare
Bestätigen mit logischen Operationen
Eine zuverlässige Methode zur Bestätigung einer SQL-Injection-Schwachstelle besteht darin, eine logische Operation auszuführen und die erwarteten Ergebnisse zu beobachten. Wenn beispielsweise ein GET-Parameter wie ?username=Peter
identische Inhalte liefert, wenn er auf ?username=Peter' oder '1'='1
geändert wird, deutet dies auf eine SQL-Injection-Schwachstelle hin.
Ebenso dient die Anwendung von mathematischen Operationen als effektive Bestätigungstechnik. Wenn der Zugriff auf ?id=1
und ?id=2-1
dasselbe Ergebnis liefert, ist dies ein Hinweis auf SQL-Injection.
Beispiele, die die Bestätigung durch logische Operationen demonstrieren:
Diese Wortliste wurde erstellt, um SQL-Injektionen auf die vorgeschlagene Weise zu bestätigen:
Bestätigung mit Timing
In einigen Fällen werden Sie keine Änderung auf der Seite bemerken, die Sie testen. Daher ist eine gute Möglichkeit, blinde SQL-Injektionen zu entdecken, die DB dazu zu bringen, Aktionen auszuführen, die einen Einfluss auf die Zeit haben, die die Seite zum Laden benötigt. Daher werden wir in der SQL-Abfrage eine Operation concatenieren, die viel Zeit in Anspruch nehmen wird:
In einigen Fällen werden die Sleep-Funktionen nicht erlaubt sein. Dann könntest du anstelle dieser Funktionen die Abfrage komplexe Operationen ausführen, die mehrere Sekunden dauern. Beispiele für diese Techniken werden separat für jede Technologie kommentiert (sofern vorhanden).
Identifizierung des Back-ends
Der beste Weg, um das Back-end zu identifizieren, besteht darin, zu versuchen, Funktionen der verschiedenen Back-ends auszuführen. Du könntest die Sleep Funktionen aus dem vorherigen Abschnitt oder diese hier verwenden (Tabelle von payloadsallthethings:
Auch wenn Sie Zugriff auf die Ausgabe der Abfrage haben, könnten Sie die Version der Datenbank ausgeben lassen.
In der Fortsetzung werden wir verschiedene Methoden zur Ausnutzung verschiedener Arten von SQL-Injection besprechen. Wir werden MySQL als Beispiel verwenden.
Identifizierung mit PortSwigger
Ausnutzung von Union Based
Erkennung der Anzahl der Spalten
Wenn Sie die Ausgabe der Abfrage sehen können, ist dies der beste Weg, um sie auszunutzen. Zunächst müssen wir die Anzahl der Spalten herausfinden, die die ursprüngliche Anfrage zurückgibt. Dies liegt daran, dass beide Abfragen die gleiche Anzahl von Spalten zurückgeben müssen. Für diesen Zweck werden typischerweise zwei Methoden verwendet:
Order/Group by
Um die Anzahl der Spalten in einer Abfrage zu bestimmen, passen Sie schrittweise die Zahl in den ORDER BY- oder GROUP BY-Klauseln an, bis eine falsche Antwort empfangen wird. Trotz der unterschiedlichen Funktionen von GROUP BY und ORDER BY innerhalb von SQL können beide identisch verwendet werden, um die Spaltenanzahl der Abfrage zu ermitteln.
UNION SELECT
Wählen Sie immer mehr Nullwerte aus, bis die Abfrage korrekt ist:
You should use null
values as in some cases the type of the columns of both sides of the query must be the same and null is valid in every case.
Datenbanknamen, Tabellennamen und Spaltennamen extrahieren
In den nächsten Beispielen werden wir den Namen aller Datenbanken, den Tabellennamen einer Datenbank und die Spaltennamen der Tabelle abrufen:
Es gibt einen anderen Weg, um diese Daten in jeder verschiedenen Datenbank zu entdecken, aber die Methodik bleibt immer gleich.
Ausnutzen von versteckten Union-basierten
Wenn die Ausgabe einer Abfrage sichtbar ist, aber eine union-basierte Injektion unerreichbar scheint, deutet dies auf das Vorhandensein einer versteckten union-basierten Injektion hin. Dieses Szenario führt oft zu einer Blindinjektion. Um eine Blindinjektion in eine union-basierte umzuwandeln, muss die Ausführungsabfrage im Backend erkannt werden.
Dies kann durch die Verwendung von Blindinjektions-Techniken zusammen mit den Standardtabellen, die spezifisch für Ihr Ziel-Datenbankmanagementsystem (DBMS) sind, erreicht werden. Um diese Standardtabellen zu verstehen, wird empfohlen, die Dokumentation des Ziel-DBMS zu konsultieren.
Sobald die Abfrage extrahiert wurde, ist es notwendig, Ihr Payload so anzupassen, dass die ursprüngliche Abfrage sicher geschlossen wird. Anschließend wird eine Union-Abfrage an Ihr Payload angehängt, um die Ausnutzung der neu zugänglichen union-basierten Injektion zu ermöglichen.
Für umfassendere Einblicke verweisen Sie auf den vollständigen Artikel, der unter Healing Blind Injections verfügbar ist.
Ausnutzen von Fehler-basiert
Wenn Sie aus irgendeinem Grund die Ausgabe der Abfrage nicht sehen können, aber die Fehlermeldungen sehen können, können Sie diese Fehlermeldungen verwenden, um Daten aus der Datenbank zu exfiltrieren. Indem Sie einem ähnlichen Ablauf wie bei der Union-basierten Ausnutzung folgen, könnten Sie es schaffen, die DB zu dumpen.
Ausnutzen von Blind SQLi
In diesem Fall können Sie die Ergebnisse der Abfrage oder die Fehler nicht sehen, aber Sie können unterscheiden, wann die Abfrage eine wahre oder eine falsche Antwort zurückgibt, da es unterschiedliche Inhalte auf der Seite gibt. In diesem Fall können Sie dieses Verhalten ausnutzen, um die Datenbank Zeichen für Zeichen zu dumpen:
Ausnutzen von Error Blind SQLi
Dies ist der gleiche Fall wie zuvor, aber anstatt zwischen einer wahren/falschen Antwort von der Abfrage zu unterscheiden, können Sie zwischen einem Fehler in der SQL-Abfrage oder nicht unterscheiden (vielleicht weil der HTTP-Server abstürzt). Daher können Sie in diesem Fall jedes Mal einen SQL-Fehler erzwingen, wenn Sie das Zeichen richtig erraten:
Ausnutzen von Zeitbasiertem SQLi
In diesem Fall gibt es keine Möglichkeit, die Antwort der Abfrage basierend auf dem Kontext der Seite zu unterscheiden. Aber Sie können die Seite länger laden lassen, wenn das erratene Zeichen korrekt ist. Wir haben diese Technik bereits zuvor verwendet, um eine SQLi-Schwachstelle zu bestätigen.
Stacked Queries
Sie können gestapelte Abfragen verwenden, um mehrere Abfragen nacheinander auszuführen. Beachten Sie, dass während die nachfolgenden Abfragen ausgeführt werden, die Ergebnisse nicht an die Anwendung zurückgegeben werden. Daher ist diese Technik hauptsächlich im Zusammenhang mit blinden Schwachstellen nützlich, bei denen Sie eine zweite Abfrage verwenden können, um eine DNS-Abfrage, einen bedingten Fehler oder eine Zeitverzögerung auszulösen.
Oracle unterstützt gestapelte Abfragen nicht. MySQL, Microsoft und PostgreSQL unterstützen sie: QUERY-1-HERE; QUERY-2-HERE
Out of band Exploitation
Wenn keine andere Ausbeutungsmethode funktioniert hat, können Sie versuchen, die Datenbank die Informationen an einen externen Host zu exfiltrieren, der von Ihnen kontrolliert wird. Zum Beispiel über DNS-Abfragen:
Datenexfiltration außerhalb des Bandes über XXE
Automatisierte Ausnutzung
Überprüfen Sie das SQLMap Cheetsheat, um eine SQLi-Schwachstelle mit sqlmap auszunutzen.
Technologiespezifische Informationen
Wir haben bereits alle Möglichkeiten besprochen, eine SQL-Injection-Schwachstelle auszunutzen. Finden Sie einige weitere Tricks, die von der Datenbanktechnologie abhängen, in diesem Buch:
Oder Sie finden eine Menge Tricks zu: MySQL, PostgreSQL, Oracle, MSSQL, SQLite und HQL in https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
Authentifizierungsumgehung
Liste zum Versuch, die Anmeldefunktionalität zu umgehen:
Login bypass ListRoh-Hash-Authentifizierungsumgehung
Diese Abfrage zeigt eine Schwachstelle, wenn MD5 mit true für Rohausgaben in Authentifizierungsprüfungen verwendet wird, wodurch das System anfällig für SQL-Injection wird. Angreifer können dies ausnutzen, indem sie Eingaben erstellen, die, wenn sie gehasht werden, unerwartete Teile von SQL-Befehlen erzeugen, was zu unbefugtem Zugriff führt.
Umgehung der Hash-Authentifizierung durch Injection
Empfohlene Liste:
Sie sollten als Benutzernamen jede Zeile der Liste verwenden und als Passwort immer: Pass1234. (Diese Payloads sind auch in der großen Liste enthalten, die zu Beginn dieses Abschnitts erwähnt wurde)
GBK Authentifizierungsumgehung
WENN ' escaped wird, können Sie %A8%27 verwenden, und wenn ' escaped wird, wird erstellt: 0xA80x5c0x27 (╘')
Python-Skript:
Polyglot-Injektion (Multikontext)
Insert Statement
Passwort eines bestehenden Objekts/Benutzers ändern
Dazu sollten Sie versuchen, ein neues Objekt mit dem Namen des "Master-Objekts" (wahrscheinlich admin im Falle von Benutzern) zu erstellen, indem Sie etwas ändern:
Benutzer mit dem Namen: AdMIn (Groß- und Kleinbuchstaben)
Benutzer mit dem Namen: admin=
SQL Truncation Attack (wenn es eine Art von Längenbeschränkung im Benutzernamen oder in der E-Mail gibt) --> Benutzer mit dem Namen: admin [viele Leerzeichen] a erstellen
SQL Truncation Attack
Wenn die Datenbank anfällig ist und die maximale Anzahl von Zeichen für den Benutzernamen beispielsweise 30 beträgt und Sie den Benutzer admin impersonieren möchten, versuchen Sie, einen Benutzernamen mit dem Namen: "admin [30 Leerzeichen] a" und ein beliebiges Passwort zu erstellen.
Die Datenbank wird überprüfen, ob der eingegebene Benutzername in der Datenbank existiert. Wenn nicht, wird sie den Benutzernamen auf die maximal erlaubte Anzahl von Zeichen (in diesem Fall auf: "admin [25 Leerzeichen]") kürzen und dann wird sie automatisch alle Leerzeichen am Ende entfernen und den Benutzer "admin" in der Datenbank mit dem neuen Passwort aktualisieren (einige Fehler könnten auftreten, aber das bedeutet nicht, dass es nicht funktioniert hat).
Weitere Informationen: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref
Hinweis: Dieser Angriff wird in den neuesten MySQL-Installationen nicht mehr wie oben beschrieben funktionieren. Während Vergleiche standardmäßig nachfolgende Leerzeichen ignorieren, führt der Versuch, eine Zeichenfolge einzufügen, die länger ist als die Länge eines Feldes, zu einem Fehler, und die Einfügung schlägt fehl. Für weitere Informationen zu dieser Überprüfung: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation
MySQL Insert zeitbasierte Überprüfung
Fügen Sie so viele ','',''
hinzu, wie Sie für notwendig halten, um die VALUES-Anweisung zu verlassen. Wenn eine Verzögerung ausgeführt wird, haben Sie eine SQL-Injection.
ON DUPLICATE KEY UPDATE
Die ON DUPLICATE KEY UPDATE
-Klausel in MySQL wird verwendet, um Aktionen anzugeben, die die Datenbank ausführen soll, wenn ein Versuch unternommen wird, eine Zeile einzufügen, die zu einem doppelten Wert in einem UNIQUE-Index oder PRIMARY KEY führen würde. Das folgende Beispiel zeigt, wie diese Funktion ausgenutzt werden kann, um das Passwort eines Administratorkontos zu ändern:
Beispiel-Payload-Injektion:
Eine Injektions-Payload könnte wie folgt erstellt werden, wobei versucht wird, zwei Zeilen in die users
-Tabelle einzufügen. Die erste Zeile ist eine Ablenkung, und die zweite Zeile zielt auf die E-Mail eines bestehenden Administrators ab, mit der Absicht, das Passwort zu aktualisieren:
Hier ist, wie es funktioniert:
Die Abfrage versucht, zwei Zeilen einzufügen: eine für
generic_user@example.com
und eine andere füradmin_generic@example.com
.Wenn die Zeile für
admin_generic@example.com
bereits existiert, wird die KlauselON DUPLICATE KEY UPDATE
ausgelöst, die MySQL anweist, das Feldpassword
der vorhandenen Zeile auf "bcrypt_hash_of_newpassword" zu aktualisieren.Folglich kann die Authentifizierung dann mit
admin_generic@example.com
unter Verwendung des Passworts, das dem bcrypt-Hash entspricht, versucht werden ("bcrypt_hash_of_newpassword" steht für den bcrypt-Hash des neuen Passworts, der durch den tatsächlichen Hash des gewünschten Passworts ersetzt werden sollte).
Informationen extrahieren
Erstellen von 2 Konten zur gleichen Zeit
Beim Versuch, einen neuen Benutzer zu erstellen, sind Benutzername, Passwort und E-Mail erforderlich:
Verwendung von Dezimal- oder Hexadezimalzahlen
Mit dieser Technik können Sie Informationen extrahieren, indem Sie nur 1 Konto erstellen. Es ist wichtig zu beachten, dass Sie nichts kommentieren müssen.
Verwendung von hex2dec und substr:
Um den Text zu erhalten, können Sie Folgendes verwenden:
Verwendung von hex und replace (und substr):
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
Routed SQL-Injection
Routed SQL-Injection ist eine Situation, in der die injizierbare Abfrage nicht diejenige ist, die eine Ausgabe liefert, sondern die Ausgabe der injizierbaren Abfrage an die Abfrage geht, die eine Ausgabe liefert. (Von Paper)
Beispiel:
WAF Bypass
No spaces bypass
Kein Leerzeichen (%20) - Bypass unter Verwendung von Alternativen für Leerzeichen
No Whitespace - Umgehung mit Kommentaren
No Whitespace - Umgehung mit Klammern
No commas bypass
No Comma - Umgehung mit OFFSET, FROM und JOIN
Generic Bypasses
Blacklist unter Verwendung von Schlüsselwörtern - Bypass unter Verwendung von Groß-/Kleinbuchstaben
Blacklist unter Verwendung von Schlüsselwörtern, nicht fallabhängig - Umgehung mit einem äquivalenten Operator
Scientific Notation WAF bypass
Eine ausführlichere Erklärung dieses Tricks finden Sie im gosecure blog. Im Grunde können Sie die wissenschaftliche Notation auf unerwartete Weise verwenden, um die WAF zu umgehen:
Bypass Column Names Restriction
Zunächst einmal beachten Sie, dass wenn die ursprüngliche Abfrage und die Tabelle, aus der Sie das Flag extrahieren möchten, die gleiche Anzahl an Spalten haben, Sie einfach Folgendes tun können: 0 UNION SELECT * FROM flag
Es ist möglich, auf die dritte Spalte einer Tabelle zuzugreifen, ohne ihren Namen zu verwenden, indem Sie eine Abfrage wie die folgende verwenden: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
, also würde dies in einer sqlinjection so aussehen:
Oder durch die Verwendung eines Comma Bypass:
Dieser Trick wurde von https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/ übernommen.
WAF-Bypass-Vorschlagstools
Weitere Anleitungen
Brute-Force-Erkennungsliste
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated