Wie konnte das nur passieren?

Das Passwort habe ich umgehend geändert. Das Risiko ist überschaubar. Der Datenbanknutzer hatte nur Zugriffsrechte auf diese eine Datenbank, und darin war nichts geändert. Der Angreifer hätte zwar die Kontrolle über den Inhalt meiner Webseite erlangen können - es existiert eine Installation von PhpMyAdmin, die auch relativ leicht zu finden ist -, aber mehr vermutlich nicht. Es gibt keine direkte Möglichkeit, durch die Kontrolle über die Datenbank Code auf dem Server auszuführen. Diese Möglichkeit besteht nur, wenn ein Datenbanknutzer erweiterte Rechte hat (etwa die "FILE"-Berechtigung), aber das war nicht der Fall.

Stellenmarkt
  1. Data Scientist (m/f/d)
    Lidl Digital, Berlin, Neckarsulm
  2. Administrator (m/w/d) Servervirtualisierung
    WDR mediagroup digital GmbH, Köln
Detailsuche

Passiert ist Folgendes: Aus komplett anderen Gründen war der MySQL-Datenbankserver abgestürzt und für kurze Zeit offline. Das führte dazu, dass beim Verbindungsversuch zur Datenbank ein Fehler auftrat. Es müssen ein paar Dinge zusammenkommen, damit dieser Fehler auftritt und ein Passwort enthält.

PHP besitzt eine Option display_errors, mit der konfiguriert werden kann, ob Fehlermeldungen direkt angezeigt werden. Die PHP-Dokumentation empfiehlt, diese Option auf Produktivsystemen zu deaktivieren, verschweigt aber die erheblichen Risiken, die damit einhergehen. Allerdings ist display_errors standardmäßig aktiviert, wenn man die Option in der PHP-Konfiurationsdatei überhaupt nicht setzt. Das steht übrigens nicht in der Dokumentation.

Display-Errors war bewusst aktiv

Es war kein Versehen, dass display_errors aktiviert war. Ich hatte mich vor längerer Zeit bewusst dafür entschieden. Ursprünglich war die Option auf dem entsprechenden Server global deaktiviert. Ich hatte allerdings bei einem Test einer neueren PHP-Version vor einiger Zeit gemerkt, dass mehrere meiner PHP-Skripte Fehler enthielten, die durch das Abschalten der display_errors-Option unbemerkt blieben. Um das zu verhindern, hielt ich es für sinnvoller, die Anzeigen von Fehlermeldungen standardmäßig zu aktivieren. Im Rückblick war das keine gute Idee.

Golem Karrierewelt
  1. Microsoft 365 Security: virtueller Drei-Tage-Workshop
    29.06.-01.07.2022, Virtuell
  2. Azure und AWS Cloudnutzung absichern: virtueller Zwei-Tage-Workshop
    22./23.09.2022, virtuell
Weitere IT-Trainings

Eine weitere Besonderheit hier ist, dass die Fehlermeldung einen Stack Trace enthielt. Nur dadurch wurde das Passwort sichtbar. Nicht alle Fehlermeldungen von PHP enthalten Stack Traces. Für Datenbankzugriffe verwendet die Seite die objektorientierte PDO-Erweiterung von PHP (PHP Database Object). Im Fall eines Verbindungsfehlers erzeugt diese eine Exception. Exceptions können mit den Befehlen try und catch abgefangen werden. Wenn man Exceptions jedoch unbehandelt lässt, werden die Fehlermeldungen mit Stack Trace ausgegeben. Fairerweise sei hier gesagt, dass die PDO-Dokumentation eine deutliche Warnung vor diesem Szenario enthält.

MySQL produziert harmlose Fehlermeldungen

Ungewöhnlich ist hier die uneinheitliche Behandlung von Fehlern durch PHP. Als Alternative zu PDO gibt es in PHP für MySQL-Verbindungen die mysqli-API. Die verwendet keine Exceptions und die Fehlermeldungen enthalten weder Stack Traces noch Passwörter. Das erscheint mir insofern bemerkenswert, als ich in der Vergangenheit häufig Nutzern empfohlen habe, PDO mit Prepared Statements zu verwenden. Die mysqli-API unterstützt jedoch ebenfalls Prepared Statements und ist daher möglicherweise die sicherere Alternative.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 IT-Sicherheit: Wie ich mein Passwort im Stack Trace fandPHP macht es dem Nutzer zu einfach, Fehler zu machen 
  1.  
  2. 1
  3. 2
  4. 3
  5.  


Astorek 15. Apr 2017

Gibt ja eine Website, die versucht, die bekanntesten Static Website Generatoren zu...

Noppen 15. Apr 2017

Mir ist letztens das Essen angebrannt. Ich würde sagen, dass die eigene Küche...

VigarLunaris 15. Apr 2017

Was soll ich da sagen... config.py enthält die variablen Darin liegen Brent-Hashing PWs...

.:Tim:. 15. Apr 2017

Naja, an das selbstverständlichste auf Produktivsystemen hat er nicht gedacht...



Aktuell auf der Startseite von Golem.de
Retro Gaming
Wie man einen Emulator programmiert

Warum nicht mal selbst einen Emulator programmieren? Das ist lehrreich und macht Spaß - wenn er funktioniert. Wie es geht, zeigen wir am Gameboy.
Von Johannes Hiltscher

Retro Gaming: Wie man einen Emulator programmiert
Artikel
  1. Cloudgaming: Microsoft bestätigt Game-Pass-Streaming-Box
    Cloudgaming
    Microsoft bestätigt Game-Pass-Streaming-Box

    Seit Jahren gibt es Gerüchte über eine Alternative zur aktuellen Xbox-Konsolengeneration. Microsoft hat dies nun ganz konkret bestätigt.

  2. Telefónica: O2 My Prepaid M bietet künftig 15 GByte statt 6,5 GByte
    Telefónica
    O2 My Prepaid M bietet künftig 15 GByte statt 6,5 GByte

    Telefónica bietet den Smartphone-Tarif O2 My Prepaid M für einige Monate mit mehr Datenvolumen zum gleichen Preis.

  3. Betriebsräte: Apple erhöht Mindestlohn auf 22 US-Dollar
    Betriebsräte
    Apple erhöht Mindestlohn auf 22 US-Dollar

    In mehreren Apple-Store-Filialen organisieren sich Beschäftigte. Ihre Lohnforderungen gehen noch weiter.

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • Gigabyte RTX 3080 12GB günstig wie nie: 1.024€ • MSI Gaming-Monitor 32" 4K UHD günstig wie nie: 999€ • Nur noch heute: Cyber Week mit tollen Rabatten • Mindstar (u. a. AMD Ryzen 5 5600 179€, Palit RTX 3070 GamingPro 669€) • Days of Play (u. a. PS5-Controller 49,99€) [Werbung]
    •  /