SQL Injection Überblick
SQL Injection Überblick
Dieses SQL-Injection-Spickzettel enthält Beispiele für nützliche Syntax, die Sie verwenden können, um
führen Sie eine Vielzahl von Aufgaben aus, die häufig bei SQL-Injection-Angriffen auftreten.
String-Verkettung
Sie können mehrere Strings zusammenfügen, um einen einzelnen String zu erstellen.
Oracle foo||bar
Microsoft 'foo'+'bar'
PostgreSQL foo||bar
MySQL 'foo' 'bar' [Beachten Sie den Abstand zwischen den beiden Strings]
VERKETTEN('foo','bar')
Teilstring
Sie können einen Teil eines Strings von einem bestimmten Offset mit einer bestimmten Länge extrahieren. Beachten Sie, dass
Der Offset-Index ist 1-basiert. Jeder der folgenden Ausdrücke gibt die Zeichenkette zurückba.
Oracle SUBSTR('foobar', 4, 2)
Microsoft SUBSTRING('foobar', 4, 2)
PostgreSQ SUBSTRING('foobar', 4, 2)
L
MySQL SUBSTRING('foobar', 4, 2)
Comments
Sie können Kommentare verwenden, um eine Abfrage zu kürzen und den Teil der ursprünglichen Abfrage zu entfernen.
das folgt Ihrem Eingabefeld.
Oracle --Kommentar
Microsoft --Kommentar
/*Kommentar*/
PostgreSQL --comment
/*Kommentar*/
MySQL #comment
-- Kommentar[Hinweis den Raum nach dem doppelten Bindestrich]
/*comment*/
Datenbankversion
Sie können die Datenbank abfragen, um ihren Typ und ihre Version zu bestimmen. Diese Informationen sind nützlich.
bei der Formulierung komplizierterer Angriffe.
Datenbankinhalt
Sie können die Tabellen auflisten, die in der Datenbank existieren, und die Spalten, die diese Tabellen enthalten.
enthalten.
Bedingte Fehler
Sie können eine einzelne boolesche Bedingung testen und einen Datenbankfehler auslösen, wenn die Bedingung erfüllt ist.
wahr.
Sie können batchweise Abfragen verwenden, um mehrere Abfragen nacheinander auszuführen. Beachten Sie, dass während
Die folgenden Abfragen werden ausgeführt, die Ergebnisse werden jedoch nicht an die Anwendung zurückgegeben.
Daher ist diese Technik hauptsächlich im Zusammenhang mit blinden Schwachstellen von Nutzen, bei denen Sie können
Verwenden Sie eine zweite Abfrage, um eine DNS-Abfrage, einen bedingten Fehler oder eine Zeitverzögerung auszulösen.
Hinweis
Mit MySQL können gebatchte Abfragen typischerweise nicht für SQL-Injection verwendet werden. Allerdings ist dies
ist gelegentlich möglich, wenn die Zielanwendung bestimmte PHP- oder Python-APIs verwendet, um
Mit einer MySQL-Datenbank kommunizieren.
Zeitverzögerungen
Sie können eine Zeitverzögerung in der Datenbank verursachen, wenn die Abfrage verarbeitet wird. Die folgende
will cause an unconditional time delay of 10 seconds.
Oracle dbms_pipe.receive_message(('a'),10)
Microsoft WARTEN SIE AUF VERZÖGERUNG '0:0:10'
Bedingte Zeitverzögerungen
Sie können eine einzelne boolesche Bedingung testen und eine Zeitverzögerung auslösen, wenn die Bedingung wahr ist.
SQL-Injection kann manuell durch die Verwendung eines systematischen Sets von Tests gegen jede
Einstiegspunkt in der Anwendung. Dies umfasst typischerweise:
Einreichen des einfachen Anführungszeichens' und nach Fehlern oder anderen Anomalien suchen.
Einreichen einer SQL-spezifischen Syntax, die den Basiswert (ursprünglichen Wert) des
Eingangspunkt und zu einem anderen Wert und suchen nach systematischen Unterschieden im
resultierende Anwendungsantworten.
Submitting Boolean conditions such as ODER 1=1undODER 1=2, undsuchen nach
Unterschiede in den Antworten der Anwendung.
Übermittlung von Payloads, die entwickelt wurden, um Zeitverzögerungen auszulösen, wenn sie innerhalb eines SQL ausgeführt werden.
Abfrage und Suche nach Unterschieden in der benötigten Zeit für die Antwort.
Einreichen von OAST-Payloads, die darauf ausgelegt sind, eine Out-of-Band-Netzwerkinteraktion auszulösen, wenn
ausgeführt innerhalb einer SQL-Abfrage und Überwachung aller resultierenden Interaktionen.
Bei SQL-Injection zweiter Ordnung (auch als gespeicherte SQL-Injection bekannt) wird die Anwendung
nimmt Benutzereingaben aus einer HTTP-Anfrage entgegen und speichert sie zur späteren Verwendung. Dies geschieht normalerweise
indem die Eingabe in eine Datenbank eingegeben wird, aber an dem Punkt, an dem die
Daten werden gespeichert. Später, wenn eine andere HTTP-Anfrage bearbeitet wird, ruft die Anwendung ab
Die gespeicherten Daten und integriert sie auf unsichere Weise in eine SQL-Abfrage.
SQL-Injektion zweiter Ordnung tritt häufig in Situationen auf, in denen Entwickler sich bewusst sind von
SQL-Injektionsanfälligkeiten und so die sichere Handhabung der ursprünglichen Platzierung der Eingabe in
die Datenbank. Wenn die Daten später verarbeitet werden, gelten sie als sicher, da sie
zuvor sicher in die Datenbank eingegeben. An diesem Punkt wird die Daten bearbeitet in einer
unsichere Weise, da der Entwickler fälschlicherweise annimmt, dass sie vertrauenswürdig ist.
Datenbankspezifische Faktoren
Einige Kernfunktionen der SQL-Sprache sind auf die gleiche Weise implementiert.
beliebte Datenbankplattformen und so viele Möglichkeiten, SQL zu erkennen und auszunutzen
injection vulnerabilities work identically on different types of database.
Es gibt jedoch auch viele Unterschiede zwischen gängigen Datenbanken. Diese bedeuten
dass einige Techniken zur Erkennung und Ausnutzung von SQL-Injektionen unterschiedlich funktionieren auf
verschiedene Plattformen. Zum Beispiel:
SQL-Injection-Spickzettel
String query = "SELECT * FROM produkte WHERE kategorie = '" + input + "'";
Statement statement = [Link]();
ResultSet resultSet = [Link](abfrage);
Dieser Code kann leicht so umgeschrieben werden, dass die Benutzereingabe nicht stört.
mit der Abfragestruktur:
Damit eine parametrische Abfrage effektiv SQL-Injection verhindern kann, muss der String, der
Im Abfrage verwendete Werte müssen immer konstante harter Werte sein und dürfen niemals enthalten.
variable Daten aus beliebigen Ursprüngen. Lassen Sie sich nicht verleiten, von Fall zu Fall zu entscheiden, ob ein
Datenelement ist vertrauenswürdig und weiterhin String-Verkettung innerhalb der Abfrage verwenden für
Fälle, die als sicher gelten. Es ist allzu leicht, Fehler über die möglichen zu machen.
Ursprung der Daten oder für Änderungen in anderem Code, die Annahmen über die Daten verletzen.
beeinträchtigt.