Sicherheitslücke beim Kantonsparlament

Im Vergangenen November stiess ich bei Recherchen auf der Seite des Grossen Rats Basel auf mehrere Sicherheitslücken. Obwohl ich die Behörden sofort informiert habe, reagierten diese nur zögerlich und einige Mängel blieben bis heute bestehen.

Path Traversal und XSS

Auf der Internetpräsenz des Grossen Rats lassen sich die Protokolle der Sitzungen abrufen. Diese sind alle in einem Verzeichnis auf dem Server abgelegt. Ein einfaches PHP Skript listet den Verzeichnisinhalt auf. Der Verzeichnispfad wird dabei als einfaches Argument in der URL angegeben. Eine Prüfung dieses Arguments fand dabei überhaupt nicht statt! Die einzige "Schutzmassnahme" war eine open_basedir Einstellung von PHP. Dabei wurde ausser Acht gelassen, dass PHP auch Zugriff auf ein Temporäres Verzeichnis benötigt. Dafür wurde /tmp gewählt, was eine äusserst schlechte Wahl ist, da man so nicht nur auf alle temporären Dateien von PHP, sondern vom ganzen Server zugreifen kann.

Bildschirmfoto /tmp Verzeichnis
Zugriff auf /tmp
Bildschirmfoto Webserver Verzeichnis
Ein weiteres Verzeichnis innerhalb des open_basedir Pfads
Bildschirmfoto open_basedir Warnung
Ein Verzeichnis ausserhalb des open_basedir Pfads

Da der eingegebene Pfad ebenfalls ungeprüft und ungefiltert wieder ausgegeben wird, war auch XSS möglich.

Bildschirmfoto XSS Lücke
XSS Lücke

Die folgenden URLs funktionierten zu diesem Zeitpunkt:

http://abstimmungen.grosserrat-basel.ch/index_archiv3_v1.php?path=/tmp
http://abstimmungen.grosserrat-basel.ch/index_archiv3_v2.php?path=/tmp
http://abstimmungen.grosserrat-basel.ch/index_archiv2_v2.php?path=/tmp
http://abstimmungen.grosserrat-basel.ch/index_archiv2_v2.php?path=%3Cscript%20%20defer=%22defer%22%3Ealert(%27xss%27)%3C/script%3E
http://abstimmungen.grosserrat-basel.ch/index_archiv3_v2.php?path=%3Cscript%20%20defer=%22defer%22%3Ealert(%27xss%27)%3C/script%3E

Im /tmp Verzeichnis können sich sensible Daten von PHP selbst oder anderen Programmen befinden. Darum erhält üblicherweise jedes Programm ein eigenes Unterverzeichnis zugeteilt und es werden nach Möglichkeit zufällige Dateinamen verwendet. Mit Zugriff auf den gesamten /tmp Verzeichnisbaum nützt dies jedoch wenig.

Fraglich ist auch, warum das Skript eine Art Versionsnummer im Dateinamen hat und warum die alten Versionen nicht entfernt wurden. Das erweckt einen chaotischen Eindruck.

Warning!

Wenn man die Hauptseite unter https://grosserrat-basel.ch/ aufruft fallen einem als erstes diverse «Warning:» Meldungen von PHP auf. Gemäss einer Antwort vom vergangenen November wird die Seite «gegenwärtig nicht mehr aktualisiert» weil die Seite auf eine neue Plattform migriert worden und es sei geplant diese alte Plattform abzuschalten. Die alte Seite mit den PHP Warnungen ist aber bis heute noch dort.

Die Warnungen sind nicht nur sehr unschön, sondern verraten wie im Fall von open_basedir auch Details über den Code und die Konfiguration des Servers.

Bildschirmfoto PHP Warnungen
Überall PHP Warnungen

Noch mehr XSS und etwas SQL

In einem Anderen Bereich der Webseite gibt es ein Suchfeld. Wenn man dort glaubt, mit den üblichen Ausdrücken gezielte Suchanfragen stellen zu können, wir überrascht sein, dass dabei die Seite kaputt geht:

http://www.grosserrat.bs.ch/de/geschaefte-dokumente/datenbank?gr_global_suchfeld=%27)&gr_kat_filter1=1
Bildschirmfoto SQL Fehler
SQL Fehler
Bildschirmfoto SQL Fehler
SQL Fehler

Auch HTML lässt sich ohne weiteres Eingeben:

http://www.grosserrat.bs.ch/de/geschaefte-dokumente/datenbank?pager_reset=1&gr_kat_tab=&gr_global_suchfeld=%22%3E%3Cscript%20defer=%22defer%22%3Ealert(%27xss%27);%3C/script%3E
Bildschirmfoto XSS Lücke
XSS Lücke

Geprüft wird auch hier: Nichts. Aber auch hier gibt es eine "Schutzmassnahme": Eine Web Application Firewall prüft offenbar gewisse Eingaben, denn einige Zeit später konnte ich genau dieses Beispiel, dass ich in meinem ersten Bericht an die Admins aufgeführt habe, nicht mehr reproduzieren. Stattdessen kam vom Server ein HTTP 403 («Forbidden») zurück.

Doch WAF Regeln lassen sich umgehen und so habe ich kurzerhand nochmal mit einer leicht abgeänderte Variante geantwortet:

http://www.grosserrat.bs.ch/de/geschaefte-dokumente/datenbank?pager_reset=1&gr_kat_tab=&gr_global_suchfeld=%22%20onmousemove=%22alert(%27xss%27)%22%3E

Der einzig wirksame Schutz wäre gewesen, die Fehler in der Suchfunktion zu beheben.

Eine Content Security Policy wird nicht verwendet.

Kein HTTPS

Von Behördenseiten erwartet man Vertrauen. Doch wie in den in diesem Beitrag aufgeführten Beispielen zu sehen ist, werden die Inhalte bis heute nicht über HTTPS ausgeliefert. Selbst auf der Joomla! Login Seite ist keine gesicherte Verbindung möglich. Übrigens scheint dort auch keine Zwei-Faktor-Authentisierung aktiviert zu sein.

Zögerliche Antwort

Die Behörde hat erst im zweiten Anlauf geantwortet. Eine Anlaufstelle für Sicherheitsprobleme gibt es keine. Auch Wochen später liessen sich einige Beispiele noch reproduzieren. Inzwischen wurden die wichtigsten Probleme offenbar behoben. Allerdings wurde nicht immer die Ursache angegangen, sondern teilweise auf eine WAF zurückgegriffen oder Funktionen ersatzlos gestrichen.
Eine Abschliessende Antwort habe ich nicht erhalten.

Update: Einige Tage nach der Veröffentlichung des Artikels hat die Behörde reagiert und weitere Fehler behoben. Es soll nun an allgemeinen Sicherheitsverbesserungen gearbeitet werden.