Ich wurde gebeten, die Artikelserie über das Schließen von Schwachstellen und deren Schließung fortzusetzen (unser erster Artikel kann hier gelesen
werden ). Das letzte Mal haben wir herausgefunden, dass selbst wenn der Hersteller über das Schließen der Sicherheitsanfälligkeit berichtet, in Wirklichkeit möglicherweise nicht alles so ist.

Auswahlkriterien:
Die Auswahlkriterien für die diesmal betrachteten Schwachstellen waren dieselben (außer dass ich diesmal andere Arten von Schwachstellen untersuchen wollte):
- Es sollte einen Exploit geben - wir wollen sehen, dass vor dem Update alles
gut und schlecht ausgenutzt wurde und danach gut wurde. - Die Verwundbarkeit sollte kritisch sein (idealerweise RCE) und eine hohe Punktzahl aufweisen.
- Das Produkt muss Open Source sein.
- Das Produkt darf nicht aufgegeben und aktiv genutzt werden.
- Verwundbarkeit sollte relativ neu sein;
- Hauptsache, wie immer wären wir selbst interessiert.
Was und wie ich gewählt habe:
Ich ging zu
vulners.com und bat darum, alle Exploits mit
Exploit-db.com in den letzten Wochen zu zeigen. Dieses Mal in der Webkategorie wurden fast alle Exploits von Ihsan Sencan verfasst, aber aufgrund der Tatsache, dass sie sich am häufigsten auf SQL-Injektionen in alten nicht unterstützten Anwendungen und Plugins beziehen, habe ich sie entfernt. Von den verbleibenden Produkten fiel nur das ProjeQtOr Project Management Tool 7.2.5 mit der Sicherheitsanfälligkeit CVE-2018-18924 in die Kategorie „nicht aufgegeben und aktiv entwickelt“.
Diese Sicherheitsanfälligkeit erfüllte alle Auswahlkriterien:
- es gibt einen Exploit ;
- RCE-Sicherheitsanfälligkeit (obwohl dafür der Benutzer autorisiert sein muss);
- das Produkt ist ziemlich Open Source;
- Das Produkt wird nicht aufgegeben. 2018 gab es 28 Releases und nur sourceforge.net gab es 702 Downloads (und die meisten Update-Downloads lösen das CVE-Problem, was höchstwahrscheinlich darauf hinweist, dass die Leute CVE gesehen und mit dem Update begonnen haben).
- CVE vom 4. November, ein Exploit vom 25. Oktober, erfüllt die Anforderungen der Neuheit;
- Ich habe mir das Problem und seine Lösung angesehen und mich dafür interessiert (dazu später mehr).
Grundlegendes zum ProjeQtOr-Projektmanagement-Tool
Wir lesen die Beschreibung des
Exploits und die
Beschreibung von CVE auf nist.gov . Wir verstehen, dass Version 7.2.5 nur für einen autorisierten Benutzer anfällig ist. Außerdem können Sie eine .shtml-Datei als Bild hochladen. Obwohl die Fehlermeldung
"Diese Datei ist kein gültiges Bild" angezeigt wird, wird die Datei dennoch in Bildern auf dem Server gespeichert und ist über einen direkten Link in
host / files / zugänglich.
images / image_name .

Der Zugriff über einen direkten Link ist gut, aber hier müssen Sie noch den Namen erraten, unter dem die Datei heruntergeladen wird. Wir haben Glück und es ist kein Zufall, sondern wird aus der aktuellen Zeit im Format generiert: Jahr, Monat, Tag, Stunden, Minuten, Sekunden. Das Ergebnis ist diese Nummer 20181114140320. Als Nächstes durchlaufen die Benutzer-ID und dann der ursprüngliche Dateiname den Unterstrich. Es gibt einige Unbekannte:
- Zeitzone auf dem Server
- wenn die Uhr auf dem Server nicht funktioniert;
- Benutzer-ID
Und wieder haben wir Glück: Wenn Sie ein gültiges Bild hochladen, werden uns alle diese Parameter gemeldet. Es ist nicht schwierig, mehrere Optionen von Links durchzugehen (mehrere, da es Sekunden gibt, aber es ist schwierig, sofort darauf zuzugreifen).

Im Allgemeinen ist das Abrufen des Dateinamens kein Problem. Wir gehen weiter. Und wir denken, warum nicht einfach ein PHP-Skript hochladen? Wir versuchen es herunterzuladen. Das gleiche Fenster wird angezeigt, aber die Datei wird nicht im Verzeichnis angezeigt. Es ist Zeit, in den Code zu schauen!
Das Skript uploadImage.php ist für das Hochladen des Bildes auf den Server in Version 7.2.5 verantwortlich. Wir sind an den Zeilen 100 bis 117 interessiert.
if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm') { if(@!getimagesize($uploadedFile['tmp_name'])) { $error=i18n('errorNotAnImage'); } else { traceHack("Try to upload php file as image in CKEditor"); } } else { if ( ! move_uploaded_file($uploadedFile['tmp_name'], $uploadfile)) { $error = htmlGetErrorMessage(i18n('errorUploadFile','hacking ?')); errorLog(i18n('errorUploadFile','hacking ?')); } } } if (!$error) { if(@!getimagesize($uploadfile)) { $error=i18n('errorNotAnImage'); } }
Zeile 100 ist für die Überprüfung der Dateierweiterung verantwortlich: Wenn es sich um PHP oder PHTM handelt, wird die Datei verworfen und nicht gespeichert. Daher werden PHP-Dateien nicht im Verzeichnis "files / images /" angezeigt. Zeile 115 erzeugt den Fehler, den wir sehen, macht aber nichts mit der Datei.
Lassen Sie uns den Exploit nicht verlassen und laden Sie die Datei mit der Erweiterung .shtml hoch. Hier lohnt es sich, einen kleinen Exkurs zu machen und zu sagen, was .shtml ist und womit es gegessen wird.
SHTML und SSI
Wikipedia-Definition:
SSI (Server Side Includes - Einbeziehung auf der Serverseite) - eine einfache Sprache für die dynamische "Zusammenstellung" von Webseiten auf dem Server aus den einzelnen Komponenten und die Übermittlung des empfangenen HTML-Dokuments an den Client. Wird auf dem Apache-Webserver mithilfe des Moduls mod_include implementiert. Mit der in den Standardeinstellungen des Webservers enthaltenen Funktion können Sie HTML-Dateien einschließen. Um die Anweisungen verwenden zu können, muss die Datei mit der Erweiterung .shtml, .stm oder .shtm enden.
In deinen eigenen Worten:
SHTML ist HTML, das serverseitige Befehlssätze ausführen kann. Von den nützlichen gibt es eine exec-Funktion, die beliebige Befehle auf dem Server ausführt (ja, wir können die Datei mit HTML-Code herunterladen und ausführen).
Hier ist ein Beispielcode zum Ausführen von beliebigem Code:
<!--
Die gute Nachricht ist, dass diese Funktionalität auf dem Apache2-Server nicht standardmäßig aktiviert ist. Um sie zu aktivieren, müssen Sie mit einem Tamburin tanzen. In ein paar Stunden nach Auswahl der Konfiguration konnte ich die Rückgabe von Umgebungsvariablen zum Funktionieren bringen, nicht jedoch den Befehl. Hier ist mein SSI-Code:
<html> <head> <title>thegeekstuff.com</title> </head> <body> <p> Today is <!--
Wenn dir jemand sagt, was du in die Konfiguration schreiben sollst, damit es richtig funktioniert, würde ich es gerne lesen.
Sicherheitslücke ausnutzen
Wenn die Sterne konvergieren, können Sie die HTML-Datei herunterladen und beliebige Befehle ausführen (oder wie ich die Uhrzeit auf dem Server anzeigen).
Beobachten Sie den Patch
Die nächste Version ist 7.2.6, aber es gibt keine Änderungen in Bezug auf die Sicherheitsanfälligkeit, an der wir interessiert sind (nist.gov erneut getäuscht).
Wir schauen uns Version 7.2.7 an und dort scheint alles repariert zu sein (die Entwickler selbst sagen, dass alles nur in dieser Version repariert ist). Es gibt zwei wichtige Änderungen:
1. Unter den verbotenen Erweiterungen wurde "shtm" hinzugefügt (wenn die ersten 4 Zeichen solche sind, fällt auch shtml hierher):
if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm' or substr($ext,0,4)=='shtm') {
2. Dateien, die keine Bilder sind, werden jetzt gelöscht:
if(@!getimagesize($uploadfile)) { $error=i18n('errorNotAnImage'); kill($uploadfile); }
Es scheint, dass Sie abweichen können, da Nicht-Bilder gelöscht werden und shtml nicht einmal versucht, fortzufahren. Aber es hat mir immer nicht gefallen, wenn sie versucht haben, ein Problem mit schwarzen Listen zu lösen. In einigen Ländern verbieten Unternehmen beispielsweise soziale Netzwerke. Dies führt dazu, dass Benutzer beginnen, die „Spiegel“ sozialer Netzwerke zu verwenden, in denen ihre Benutzernamen und Passwörter gestohlen werden. Ihre Passwörter stimmen mit den Firmenpasswörtern überein, aber dann kann es viel größere Probleme geben, als wenn ein Mitarbeiter bei einer Tasse Kaffee durch ein Instagram blättert.
In der Webprogrammierung und ihrer Sicherheit sind schwarze Listen ebenfalls böse.
Umgehen Sie die schwarze Liste von ProjeQtOr
Nun, alles ist einfach. Lassen Sie uns zunächst sehen, welche Dateien Apache2 + PHP in den Standardeinstellungen interpretieren kann (alles wurde unter Ubuntu 16.04 mit einem aktualisierten Repository installiert). Die Direktive „FilesMatch“ ist für die Interpretation von Dateien verantwortlich. Wir suchen danach mit dem Befehl "grep -r" <FilesMatch "/ etc / apache2" und hier ist das Ergebnis:
/etc/apache2/mods-available/php7.0.conf:<FilesMatch ".+\.ph(p[3457]?|t|tml)$"> /etc/apache2/mods-available/php7.0.conf:<FilesMatch ".+\.phps$"> /etc/apache2/mods-available/php7.0.conf:<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$"> /etc/apache2/sites-available/default-ssl.conf: <FilesMatch "\.(cgi|shtml|phtml|php)$"> /etc/apache2/apache2.conf:<FilesMatch "^\.ht">
In der Konfiguration default-ssl.conf werden alle Erweiterungen einfach vollständig aufgelistet. Dies sind: cgi, shtml, phtml, php. Leider wird alles außer CGI in ProjeQtOr herausgefiltert.
Die Konfiguration von php7.0.conf ist viel interessanter, da die Erweiterungen durch den regulären Ausdruck festgelegt werden. Wir bekommen:
Erweiterung | Was wird gefiltert? |
---|
php | substr ($ ext, 0.3) == 'php' |
php3 | substr ($ ext, 0.3) == 'php' |
php4 | substr ($ ext, 0.3) == 'php' |
php5 | substr ($ ext, 0.3) == 'php' |
php7 | substr ($ ext, 0.3) == 'php' |
pht | NICHTS |
phtml3 | substr ($ ext, 0.4) == 'phtm' |
Großartig, eine Dateierweiterung, die nicht gefiltert wird, wurde gefunden. Wir überprüfen, ob es wirklich interpretiert wird.
Erstellen Sie eine test.pht-Datei mit folgendem Inhalt:
<?php phpinfo();
Wir gehen zu dieser Datei im Browser und sehen Informationen über die installierte PHP. Bemerkenswerterweise wurde die schwarze Liste umgangen, während für nicht standardmäßige Einstellungen aus irgendeinem Grund andere Erweiterungen für die Interpretation zulässig sein könnten.
Wir laden unsere Testdatei in das ProjeQtOr Project Management Tool. Natürlich erhalten wir eine Fehlermeldung, da dies kein Bild ist (in der Version vor 7.2.7 haben wir bereits Codeausführung auf dem Server, da es nicht schwierig ist, phpinfo in die Ausführung von Befehlen zu ändern). In Version 7.2.7 wird die Datei gelöscht und der Code nicht ausgeführt.
Aber wir sind nicht verärgert und umgehen die Prüfung auf dem Bild.
PHP Bild
Die Überprüfung, ob die heruntergeladene Datei ein Bild im ProjeQtOr Project Management Tool ist, erfolgt mit der Funktion getimagesize, die einfach den Header der übertragenen Datei betrachtet.
Unter Ausnutzung der Tatsache, dass die PHP-Datei möglicherweise Müll enthält und die Interpretation des PHP-Codes nur mit den Zeichen „<? Php“ beginnt, schreiben wir einen kleinen Code, der zuerst das Bild und dann den benötigten PHP-Code schreibt. Als Bild senden wir einen Screenshot des Fehlerfensters. 3 Zeilen Python-Code und fertig:
data = open ('test.png','rb').read() data += open ('test.pht','rb').read() open ('new_pht_png.pht','wb').write(data)
Wahrscheinlich könnten Sie einfach einen gültigen Bildheader am Anfang der Datei schreiben, aber es ist einfacher, und noch mehr, das Bild wird in jedem Betrachter angezeigt.
Wir laden diese Kreation auf den Server hoch und siehe da, sie wird geladen (und im Viewer als Bild angezeigt). Außerdem ist es schön, dass uns der vollständige Name angezeigt wird, mit dem diese Datei hochgeladen wurde.

Wir gehen zur heruntergeladenen Datei
localhost / files / images / 20181114171730_1_new_pht_png.pht und sehen das heruntergeladene Bild als Text und die phpinfo-Ausgabe darunter. Es ist klar, dass es nicht schwierig ist, phpinfo durch eine einfache Web-Shell zu ersetzen. Zum Beispiel: <? Php system ($ _ GET ['cmd']);

Sobald Sie mit dem Auswählen von Dateidownloads begonnen haben, müssen Sie den Job beenden und sehen, wo sonst Dateien mit oder ohne Blacklists heruntergeladen werden.
Ein weiterer Datei-Upload
Wir werden in der neuesten verfügbaren Version sehen. Angenommen, Sie verwenden dieselbe Funktion zum Hochladen von Dateien wie zuvor, d. H. move_uploaded_file suchen wir im Projektverzeichnis "grep -r" move_uploaded_file "./". Wir erhalten die folgenden 5 Dateien:
./tool/uploadImage.php
./tool/saveDocumentVersion.php
./tool/uploadPlugin.php
./tool/import.php
./tool/saveAttachment.php
Datei uploadImage.php - schon gesucht.
Datei saveDocumentVersion.php - Lädt Versionen von Dokumenten herunter (wie der Name schon sagt). Wir versuchen, ein Dokument herunterzuladen und es anzusehen (zunächst laden wir immer ein Bild). Nach dem Herunterladen sehen wir, dass die Erweiterung .1 zur Datei hinzugefügt wird. Wir sehen uns im Code an, wie der Name erhalten wird (dies erfolgt in Zeile 229):
$uploadfile = $dv->getUploadFileName();
Die Funktion getUploadFileName ist in der Datei DocumentVersionMain.php deklariert. Dort sehen wir in Zeile 227, dass "." Zum zurückgegebenen Namen hinzugefügt wird. und Dokument-ID. Wir können nicht einmal den zusätzlichen Punkt umgehen:
return $uploaddir . $paramPathSeparator . $fileName . '.' . $this->id;
Die Datei uploadPlugin.php ist nur für Administratoren zugänglich. Die Tatsache, dass das Plugin möglicherweise fehlerhaften Code enthält, ist sehr logisch und schwer zu beseitigen, ohne dass die Plugin-Validierung eingegeben werden muss (wie dies bei gängigen CMS der Fall ist). Wenn Sie versuchen, dort etwas herunterzuladen, wird es natürlich erfolgreich geladen und dann ausgeführt.
Die Datei import.php steht auch nur Administratoren zur Verfügung. Beim Herunterladen einer Datei wird uns mitgeteilt, dass es sich um eine CSV-Datei oder eine XLSX-Datei handeln sollte. Natürlich versuchen wir die PHP-Datei zu laden und sehen einen Fehler:
FEHLER - Der angegebene Dateityp und das ausgewählte Dateiformat stimmen nicht überein
Import abgebrochen
Das Problem ist, dass die Datei wie im ursprünglichen Fehler von CVE nicht gelöscht wird, sondern unter
localhost / files / attach / import / test.php verfügbar bleibt.
Die Datei saveAttachment wird beim Laden von Anhängen verwendet (z. B. beim Laden Ihres eigenen Bildes). Das PHP-Skript wird dort nicht gecrawlt, da das Formular geschützt ist:
if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm' or substr($ext,0,4)=='shtm') { $attachment→fileName.=".projeqtor";
es stellt sich heraus, dass zu den Erweiterungsdateien php *, phtm *, shtm * die Erweiterung ".projeqtor" hinzugefügt wird, dh offensichtlich wird unsere pht-Datei dort crawlen (auch ohne die Bilder zu crawlen). Wir versuchen es und bekommen alles unter der Adresse
localhost / files / attach / attachment_1 / test.pht .
Insgesamt fünf schnell gefundene Speicherorte für das Herunterladen von Dateien:
- schaffte es 4 mal PHP oder Pht Skript zu laden;
- Die Validierung der schwarzen Liste erfolgt in zwei Teilen.
- Die Validierung der weißen Liste ist nirgendwo;
- einmal konnte die Datei nicht heruntergeladen werden (fehlgeschlagen, aber nicht ausgeführt), weil Die Expansion veränderte sich
Schlussfolgerungen zum ProjeQtOr Project Management Tool und CVE-2018-18924
- Die gemeldete Sicherheitsanfälligkeit wurde praktisch beseitigt.
- Es gibt andere Schwachstellen im Code (die den Entwicklern gemeldet wurden und sogar Whitelists für Erweiterungen versprochen haben).
- Eine ordnungsgemäße Konfiguration des Apache2-Servers könnte uns vor allem bewahren (beschränken Sie die ausführbaren Formate auf nur das Notwendige, verbieten Sie die Ausführung von Skripten in Benutzerordnern).
- nist.gov enthält nicht die neueste anfällige Version.
Herrin Notiz
- wo immer möglich schwarze Listen ablehnen (ich weiß nicht, wo dies unmöglich ist);
- Seien Sie vorsichtig und aufmerksam, wenn Sie heruntergeladene Dateien verarbeiten (es ist besser, wenn Sie sich an einem Ort befinden und nicht um 5 verteilt sind).
- Ein ordnungsgemäß konfigurierter Webserver erspart viele Probleme im Projektcode (es ist wichtig, Code zu schreiben und den Server gut zu konfigurieren).
Detaillierte Antwort von Entwicklern
Die erste Antwort der Entwickler lautete: "Wir haben alles repariert, sehen Sie sich also den korrigierten Code an." Ich musste sehr detailliert malen, wo einige Probleme sind und wie sie ausgenutzt werden können.
Dann erhielt er eine ausführliche Antwort: „Ja, es gibt Probleme, die in Version 7.3.0 behoben werden. Es werden auch weiße Listen für Bilder für xlslx und csv hinzugefügt. “ Sie haben auch geschrieben, dass sie eine Empfehlung haben, die Verzeichnisse "Anhänge" und "Dokumente" außerhalb des Webzugriffs in die Installationsanweisungen aufzunehmen.
Die Entwickler erlaubten mir, CVE zu registrieren und nach dem Update einen Artikel zu schreiben (der herauskam und zum
Download zur
Verfügung steht ).
Fazit
Wie ich zu Beginn schrieb, haben einige Leute das Update heruntergeladen, das CVE entscheidet (mehr als 500 Downloads), und es ist cool, dass Leute ihre anfällige Software aktualisieren, aber es ist traurig, dass die Software weiterhin anfällig bleibt.
Infolgedessen wurden mir und unserem Unternehmen vier CVEs zugewiesen: CVE-2018-19307, CVE-2018-19308, CVE-2018-19309, CVE-2018-19310.