Anmerkung techn. Support

0x02 - zeitbasierte Attacken und das fehlende »(int)«

Freitag
14.06.2024, 11:11 Uhr
Autor:
vgf
veröffentlicht unter:
Im Januar sind die Seiten unserer Nordthüringer Onlinezeitungen auf einen neuen Server umgezogen. „Mehr Bums“ war die Grundidee. Wenn etwas Wichtiges passierte, sollten die Seiten nicht mehr gleich in die Knie gehen. Den ersten Härtetest (Kommunal- und Europawahlen) hatte die neue Technik bestanden, dafür hatten wir ein paar Tage später wieder einen unerklärlichen Totalausfall...

Etwas Matrix. (Foto: vgf) Etwas Matrix. (Foto: vgf)

Bei den Zugriffen auf unsere Seite kann man drei große und eine kleine Gruppe unterscheiden:

Leser
Die lieben Leser. Der beste Anteil. Aktuell generiert diese Gruppe ca. 4.5 Millionen Seitenaufrufe im Monat alleine über die Nordhäuser Seite, unsere „nnz“. Das ergibt ca. 150.000 Seitenaufrufe am Tag. Eigentlich kein Problem für den Web-Server, die Ausnahmen waren bis zum Umzug besondere Ereignisse, wie z.B. Wahlen, Brände, Bombenfunde und dergleichen mehr. Alles gut zu handhaben, wären da nicht die „Crawler“.

Crawler, die Erste
Sogenannte Crawler, übersetzt heißt das buchstäblich „Krabbler“, sind Software-Programme, die das Internet automatisiert durchsuchen. Dabei analysieren und indizieren sie Inhalte von Websites wie Texte und Bilder oder auch Videos. Für uns von Bedeutung sind „Krabbler“ von Google und anderen Suchmaschinen. Aktuell erfolgen 40 % aller Verweise auf unsere Seiten über eine Suchmaschine.

In Summe schätze ich mal, dass ein Drittel aller Zugriffe auf unsere Seite automatisiert, durch Suchmaschinen erfolgen. Somit hätten wir weitere 4,5 Millionen Seitenaufrufen im Monat. Auch das ist eigentlich kein Problem für den Web-Server, wäre da nicht noch die andere Art von „Crawlern“.

Crawler, die Zweite
Besonders KI-Firmen durchforsten seit dem vergangenen Jahr das Netz und „füttern“ in schier unersättlichem Hunger ihre Systeme mit Bildern und Texten. Wie die Suchmaschinen-Crawler indizieren sie hierbei alles, was sie irgendwie lesen können, haben aber im Gegensatz zu den Suchmaschinen keinerlei Nutzen für uns. Von der KI bekommen wir keine Besucher.

Diese Crawler sind auch deutlich aggressiver als Suchmaschinen-Crawler. Sie erzeugen häufig viele Zugriffe in kurzer Zeit und halten sich selten an definierte Regeln zum Indizieren unserer Seiten. Stichwort hierbei »robots.txt«. In dieser Datei kann man grob festlegen, was indiziert werden darf und was nicht, die KI-Krabbler ignorieren diese Vorgaben gerne und oft.

Diese Besuche erzeugen aktuell etwa ein weiteres Drittel unserer Zugriffe. Macht alles zusammen in Summe ca. 13,5 Million Seitenaufrufe pro Monat.
Auch das muss noch kein Problem für den Web-Server sein, wären da nicht noch die „die bösen Jungs“ und damit nähern wir uns der Crux der ganzen Sache.

Die bösen Jungs – gezielte Angriffe
Bis vor kurzem habe ich immer zu Peter Stefan Greiner gesagt, die wollen nichts von uns konkret, wir sind irgend ein Ziel im Internet. Das läuft alles automatisiert. Beim letzten Mal haben wir die Angriffe mit einer Schrotflinte verglichen, ein bestimmtes Ziel gibt es nicht, wir bekommen beim Generalangriff auf das Netz aber wie alle anderen auch immer mal ein paar Körner ab.

Diese Meinung muss ich nun revidieren. Aktuell laufen, fast täglich nachvollziehbar, gezielte Versuche, unser Datenbanksystem auszuspionieren bzw. Zugriff darauf zu erlangen. Besonders perfide sind hierbei zeitbasierte Attacken über die von uns genutzten MySQL-Datenbank.

Zeitbasierte Attacken in MySQL
Zeitbasierte Attacken können genutzt werden, um grundlegende Informationen zu einer Datenbank zu ermitteln oder das Vorhandensein einer Schwachstelle ausfindig zu machen.

Vereinfacht dargestellt, wenn es gelingt, eine Zeitverzögerung über ein Formular oder eine URL einzubringen, hat der Angreifer die Möglichkeit geschaffen, der Datenbank eine „Ja/Nein“-Frage zu stellen. Die Antwort des Datenbanksystems hängt von diesem Zeitfaktor ab und kann mitunter ungewöhnlich lang ausfallen. Daraus kann ein Angreifer ermitteln, ob die Antwort „Ja“ oder „Nein“ war und sich weiterführende Informationen erschließen. Über wiederholte Anfragen wird so die Datenbankstruktur Schritt für Schritt „ausgeforscht".

Diese Verzögerungen führen, wenn wir sie nicht rechtzeitig bemerken und durch technische Maßnahmen verhindern, zum Zusammenbuch des Web-Servers.

Wie können aber nun solche Abfragen bis in zur Datenbank gelangen? Die Antwort ist einfach: Da hat jemand (ich) bei der Programmierung etwas übersehen!

Ein Beispiel: Immer wenn Sie einen Kommentar abgeben wollen, wird als erstes geprüft ob Sie angemeldet sind. Falls das nicht der Fall ist, wird die Artikelnummer (eine Zahl) in der so genannten „Session-Datenbank“ gespeichert und Sie werden vorerst zum Login-Formular weitergeleitet. Nach erfolgtem Login wird die Artikelnummer gelesen und Sie können einen Kommentar zum Ausgangsartikel abgeben.

Der Datenbankbefehl sieht ungefähr so aus
UPDATE session_tabelle SET returnpath = 'return_path|s:94:"/kommentare/kommentar.php?ParentID=346904" WHERE sessionID = …'

Bei dem versuchten Angriff wurde aber nicht nur die Nummer übergeben, sondern noch ein Stückchen Code an die URL angehängt.

Der resultierende Datenbankbefehl sieht dann ungefähr so aus:
UPDATE nnz_p2_sessions SET data = 'return_path|s:94:"/kommentare/kommentar.php?ParentID=346904 AND (SELECT 7064 FROM (SELECT(SLEEP(5)))SKqf)-- atRY";' WHERE sessionID = …'

Wichtig ist hier das Wörtchen „sleep(5)“. Hat der Programmierer eine ordentliche Prüfung der Parameter vergessen, haben wir jetzt ein potenzielles Problem - der MySQL-Server führt ggf. den „sleep(5)“-Befehl aus. Wenn diese Bedingung erfüllt ist, geht der Server fünf Sekunden „schlafen“. Falls man viele dieser Code-Injektionen in kurzer Zeit abfeuert, ist der Server schnell mausetot.

Der Fehler hierbei war, nicht zu prüfen, ob die gesendete Abfrage wirklich nur eine Zahl enthält bzw. den übergebenen Wert explizit in eine Zahl umzuwandeln.

Das fehlende »(int)«
Die Lösung bestand hierbei in einer „expliziten Typumwandlung“.

Aus
$ParentID = $_GET['ParentID';
wurde
$ParentID = (int) $_GET['ParentID'];

Der kleine Einschub „(int)“ sorgt dafür, das alles, was übergeben wird, in eine Integer-Zahl umgewandelt wird. Der eingeschleuste Befehl kann also nicht mehr ausgeführt werden, da bei der Datenbank nur eine Zahl ankommt.

Und darum, liebe Leserinnen und Leser, haben sich unsere Seiten in den vergangenen Wochen auch Abseits von Großereignissen gerne einmal für eine Weile „verabschiedet“. Wer die Angreifer waren und woher sie kamen, lässt sich nicht mit Sicherheit sagen. Ein Check der IPs verweist nach Russland, dass ist aber nur ein Indiz, kein Beweis.

Der Abwehrkampf im Datenmeer des Internets wird weitergehen, aber für den Moment sollte erst einmal Ruhe und vor allem Stabilität auf den Seiten der Nordthüringer Onlinezeitungen einkehren.

Noch eine gute Nachricht zum Schluss: Bei den letzten Wahlen, eines der Großereignisse, die uns in der Vergangenheit regelmäßig in die Knie gezwungen haben, hat der Server geschnurrt wie ein Kätzchen.

Volker Georg Franke
technischer Support nnz
Angelo Glashagel
Redaktion


P.S.: Wer mehr über den Angriffsvektor wissen möchte, findet hier genauere Erklärungen: it-forensik.fiw.hs-wismar.de


Lesen Sie auch 0x01 - Session-Verwaltung, SQL-Injektion und anderer Spaß.