
Pädagogische Exploit-Demonstration von CVE-2014-2323 SQL-Injection in lighttpd's mod_mysql_vhost, mit Docker-basiertem Labor für praktische Schwachstellenanalyse und Patching.
title: Ep4 - Netzwerkbezogene Schwachstelle members:
Zugehörige Schwachstelle:
CVE-2014-2323 [1] was assigned to SQL injection bug.
CVE-2014-2324 [2] was assigned to the path traversal bug.
Bestätigung: http://download.lighttpd.net/lighttpd/security/lighttpd_sa_2014_01.txt
Der anzugreifende Dienst ist Lighttpd. Es handelt sich um einen Open-Source-Webserver (BSD-Lizenz), der für Leichtigkeit und Geschwindigkeit optimiert ist. Er entstand als Proof-of-Concept für das berühmte c10k-Problem (wie man 10.000 gleichzeitige Verbindungen auf einem Server bewältigt) und erlangte damals (2003) große Popularität. Heute wird er von Whatsapp.com, Xkcd und früher auch von YouTube eingesetzt. Seine Marktposition ist, wie im Diagramm zu sehen, recht interessant:

Der Server bewältigt das Problem vieler Verbindungen durch den Einsatz asynchroner Mechanismen mittels Events (kqueue auf BSDs, epoll auf Linux), wodurch die Notwendigkeit vieler Threads reduziert wird. Das führt zu einem deutlich geringeren Speicherverbrauch und einer besseren CPU-Auslastung (eine Strategie, die auch von Nginx-Servern verwendet wird, deren Nutzung über die Jahre hinweg stark zugenommen hat):

Eine der Funktionen von lighty ist die einfache Verwaltung von virtuellen Hosts.
Hierbei handelt es sich um eine Methode, um mehrere Domainnamen auf derselben IP-Adresse zu hosten. Dies senkt die Hosting-Kosten für Unternehmen, die Websites anbieten möchten, da kein dedizierter Server pro Website erforderlich ist.
Die Technik kann IP-basiert (eine Schnittstelle pro Host) oder namensbasiert (ein Name pro Host, die Schnittstelle wird gemeinsam genutzt) sein – letzteres wird in dieser Präsentation behandelt.
Name-Based
: Verwendet den vom Client gelieferten Hostnamen, um den passenden Dienst zu identifizieren. Diese Methode hat zwei Schwierigkeiten: Komplikationen bei sicheren Sitzungen (TLS) – der Handshake muss vor der Übergabe von Headern erfolgen, die den Host angeben, was die Auswahl des richtigen Zertifikats erschwert. Eine Lösung ist die TLS-Erweiterung Server Name Indication (SNI), die es erlaubt, den Namen zu Beginn des Handshakes zu übermitteln und so das richtige Zertifikat auszuwählen. Ein zweites Problem tritt auf, wenn eine Verbindung ohne eindeutigen Host-Header versucht wird, was zu einer Unbestimmtheit des zu verwendenden Dienstes führt.
IP-Based
: Verwendet separate IPs für jede Anwendung. Der Webserver wird dann für mehrere physische (oder virtuelle) Netzwerkschnittstellen konfiguriert und antwortet entsprechend der Ziel-IP-Adresse.
*IP-Aliasing* erlaubt es, virtuelle Schnittstellen für jeden Dienst zu erstellen.
Bei einem großen Unternehmen kann die Verwaltung eines solchen Mappings je nach Anzahl der Kunden komplex werden. Lighty bietet daher, wie später gezeigt, die Möglichkeit, eine Datenbank für diesen Zweck zu nutzen.
Zuvor sehen wir, wie man einen Server „von Hand“ konfiguriert und dann Vhosting hinzufügt.
Einen einfachen lighttpd-Server vorzubereiten ist sehr einfach. Man installiert ihn und erstellt eine Konfigurationsdatei, die den zu verwendenden Port, die Behandlung bestimmter Anfragen und andere Einstellungen festlegt.
Wir können ein Beispiel für eine Konfiguration vorbereiten, die nur Anfragen für statische Dateien (.html oder .txt) entgegennimmt:
server.document-root = "/usr/lighttpd/mysite.com/"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain"
)
Stellen wir uns nun vor, wir möchten ein Geschäft aufbauen, das auf dem Verkauf von Websites basiert, und dem Käufer eine eigene Domain anbieten. Um die Kosten zu minimieren, möchten wir für jeden Kunden Vhosts erstellen. Angenommen, der Kurs „Netzwerke“ möchte drei Websites erwerben: redes.io, mac0448.io und mac5910.io. Unser Unternehmen registriert dann die Domains, die alle auf die IP unseres einzigen Servers mit einer einzigen Schnittstelle zeigen.
PS: Zur Simulation können wir die Datei /etc/hosts ändern:
172.17.0.2 redes.io
172.17.0.2 mac0448.io
172.17.0.2 mac5910.io
Um die verschiedenen Websites der Kunden von einer einzigen IP aus bedienen zu können, können wir den Server manuell konfigurieren:
server.document-root = "/usr/lighttpd/default/"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain"
)
$HTTP["host"] == "redes.io" {
server.document-root = "/usr/lighttpd/redes/"
} else $HTTP["host"] == "mac0448.io" {
server.document-root = "/usr/lighttpd/mac0448/"
} else $HTTP["host"] == "mac5910.io" {
server.document-root = "/usr/lighttpd/mac5910/"
}
Aber wie man sich vorstellen kann, kann dies problematisch werden, wenn wir viele Kunden haben und für jede Website unterschiedliche Konfigurationen bereitstellen möchten, wie bereits erwähnt.
Mit dem Modul mod_mysql_vhost können wir unseren Server mit einer mysql-Datenbank verbinden, die für dieses Mapping zuständig ist. Wir geben dann den Namen der Datenbank an, wie sie in unserem Netzwerk zu finden ist und welcher Befehl für die Suche verwendet werden soll.
server.modules = (
"mod_accesslog",
"mod_mysql_vhost"
)
mysql-vhost.db = "NOME_DO_BANCO"
mysql-vhost.user = "USUARIO"
mysql-vhost.pass = "SENHA"
(!!!!!!!!!!!!!!!)
mysql-vhost.sql = "SELECT docroot FROM domains WHERE domain='?';"
(!!!!!!!!!!!!!!!)
mysql-vhost.hostname = "HOSTNAME"
mysql-vhost.port = "PORTA"
SQL ist eine deklarative Sprache zur Verwaltung relationaler Datenbanken, die verwendet wird (...) usw.
TODO
TODO
Probleme entstehen dadurch, dass die Datenbankverwaltungssysteme, die SQL verwenden, davon ausgehen, dass die eingegebenen Befehle dem Administrator bekannt sind und von ihm ordnungsgemäß verwaltet werden. Diese Annahme trifft nicht immer zu, da Fehler in den Systemen, die mit der Datenbank interagieren, auftreten können, insbesondere im Web, wo die Benutzerinteraktion groß ist.
Das Problem mit SQL-Befehlen tritt auf, wenn die Absicht besteht, Befehle mit benutzergenerierten Texten zu erstellen, sei es ein Benutzername, ein Passwort oder andere dynamische Inhalte.
(TODO)
Wie löst man das? Escaping.