
Funktionaler PoC für CVE-2026-52715 (GeoLeak): Nicht authentifiziertes SQLi in GEO my WordPress <= 4.5.5 über swlatlng/nelatlng. Docker-Labor + time-based/boolean-based-Exploit + Exfiltration ohne Kommas im Payload.
Bildungs-PoC von GeoLeak (CVE-2026-52715), eine nicht authentifizierte SQL-Injection (CVSS 9.3) im Plugin GEO my WordPress <= 4.5.5 für WordPress. Die Parameter
swlatlngundnelatlngder Kartengrenzen werden ohne Bereinigung in die WHERE-Klausel interpoliert. Eigenständiges Docker-Labor + Exploit mit time-based-, boolean-based-Techniken und Zeichen-für-Zeichen-Exfiltration.
CVE-2026-52715 ist eine SQL-Injection (CWE-89) in der Funktion gmw_get_locations_within_boundaries_sql() des Plugins GEO my WordPress, die alle Versionen <= 4.5.5 betrifft und seit 4.5.5.1 (15. Juni 2026) gepatcht ist. Entdeckt wurde sie vom Forscher alvarodh5 und über Patchstack veröffentlicht.
Die Kette mit dem Namen GeoLeak zeigt, wie ein Angreifer, ausgehend ausschließlich von Lesezugriff auf eine beliebige öffentliche Seite, die den Shortcode [gmw] enthält, Folgendes tun kann:
swlatlng (oder nelatlng) der Query-String injizieren – ohne Cookies, ohne Nonce und ohne Authentifizierung.SLEEP() (time-based blind) erzwingen, ausgewertet für jede Zeile des INNER JOIN gegen wp_gmw_locations."total_results":N, den das Plugin selbst in das JSON der Kartenkonfiguration einbettet, nutzen, um boolesche Bedingungen abzuleiten (boolean-based blind).explode(',', ...)), und zwar mittels CASE WHEN und SUBSTRING(x FROM n FOR 1).Das Ergebnis ist beliebiges Lesen der WordPress-Datenbank: Tabelle wp_users (Passwort-Hashes), Konfigurationsoptionen, Schlüssel und Daten Dritter aus Plugins.
In der PoC wird die vollständige Extraktion von VERSION() von MariaDB ausschließlich mit GET-Anfragen verifiziert.
Dieses Repository enthält Material, das streng lehrreich und defensiv ist.
┌─────────────────────────────────────────────────────────────────────┐
│ 1. Öffentliche Anfrage ohne Authentifizierung │
│ GET /?page_id=5&form=1&action=fs&swlatlng=<payload>&nelatlng=… │
│ öffentliche Seite mit Shortcode [gmw form="1"] │
└──────────────────────────────────────────────────┬──────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 2. GMW_Form::set_default_values() │
│ action=fs => Formular als gesendet markiert │
│ get_form_values() nimmt $_SERVER['QUERY_STRING'] │
└──────────────────────────────────────────────────┬──────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 3. gmw_get_form_values() (gmw-functions.php:512) │
│ parse_str($query_string, $output) ohne Whitelist │
│ $output['swlatlng'] kommt unverändert an │
└──────────────────────────────────────────────────┬──────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 4. parse_query_args() (class-gmw-form-core.php:794) │
│ gmw_swlatlng / gmw_nelatlng werden in Suchargumente kopiert │
└──────────────────────────────────────────────────┬──────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 5. gmw_get_locations_within_boundaries_sql() (gmw-functions:669) │
│ $sw = explode(',', $southwest); │
│ "AND ( gmw_locations.latitude BETWEEN {$sw[0]} AND {$ne[0]} )" │
│ direkte Interpolation: ohne prepare, ohne Validierung │
└──────────────────────────────────────────────────┬──────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 6. WP_Query -> $wpdb->get_results() │
│ SQL: ... AND ( gmw_locations.latitude BETWEEN │
│ 1 AND SLEEP(5) AND 40.416775 AND 41 ) ... │
│ Antwort um 5s verzögert / total_results = Orakel │
└─────────────────────────────────────────────────────────────────────┘
curl und awk für den Exploitdocker-compose.yml ändern)POC-GeoLeak-CVE-2026-52715/
├── docker-compose.yml WordPress 6.8 (PHP 8.2) + MariaDB 11
├── docker/
│ ├── Dockerfile WP-Image + WP-CLI + Labor-Entrypoint
│ ├── lab-entrypoint.sh Start + automatische Seeding beim ersten Boot
│ ├── seed.sh WP-Installation, Formular, geolokalisierten Beitrag
│ └── geo-my-wp/ Plugin GEO my WordPress 4.5.5 (verwundbarer Code)
├── poc/
│ └── poc.sh Exploit: time-based + boolean-based + Exfiltration
├── docs/
│ ├── analisis-tecnico.md Vollständige Kette request -> SQL, mit Code
│ └── diff-parche-4.5.5.1-gmw-functions.php.diff Offizieller Patch
├── LICENSE
└── README.md
# 1. Labor starten (erster Start: 60-90 s)
docker compose up -d --build
# 2. Prüfen, ob das Seeding abgeschlossen ist
docker compose logs wordpress | grep lab-entrypoint
# [lab-entrypoint] laboratorio listo
# 3. PoC ausführen
./poc/poc.sh
# 4. Labor zerstören
docker compose down -v
Konfigurierbare Parameter des Exploits:
TARGET=http://localhost:3080 PAGE_ID=5 FORM_ID=1 SLEEP=5 ./poc/poc.sh
WordPress-Zugang: http://localhost:3080 mit admin/admin. Die Seite mit dem verwundbaren Formular ist http://localhost:3080/?page_id=5.
Hinweis: Die Seed-Zeile in
wp_gmw_locationsist unerlässlich. Die Abfrage verwendet einen INNER JOIN gegen diese Tabelle: Ohne Zeilen wird das injizierte WHERE nicht ausgewertet undSLEEP()schläft nicht.
Reale Ausgabe der letzten Ausführung gegen das Labor (14. August 2026):