Inline (Queries) SQL Injection

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