abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-go
类别: 命令注入 影响范围: 本地
SQLite 3.53.4(b09c88c)默认的 sqlite3 CLI 仍将 SQL Server 的 go 和 Oracle 的 / 视为语句终止符。line_is_command_terminator 会将该行重写为 ;。当 SQL 缓冲区为空时,下一行会进入 do_meta_command,因此 .shell / .output / .read 会以操作员 UID 执行。
--safe 仍会阻止 .shell。该控制措施依然有效。默认的 sqlite3 不会开启 --safe。不是 libsqlite3。Oracle 是见证字符串的 echo。
| ID | 暂无 CVE |
| 类别 | 命令注入(CLI go / / 终止符后接后续点命令) |
| 影响范围 | 本地(受害者在未使用 --safe 的情况下,对攻击者提供的 SQL/脚本运行默认 sqlite3;UI:R) |
| CWE | CWE-78 |
| CVSS | 高危:7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| 产品 | SQLite(sqlite3 CLI) |
| 受影响版本 | 3.53.4(b09c88c14082339b66c7b7158d609a771e64ca69)SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| 认证 | 受害者向默认 sqlite3 提供脚本;未使用 --safe |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18920。见证字符串 SQLITE-CLI-GO-WITNESS。 |
在操作员未使用 --safe 向 sqlite3 提供的脚本中存在未终止的 SQL 后,一行 go 或 / 后接 .shell / .output / .read 会以操作员 UID 执行。
分号已经结束了一条语句。剩余部分是终止 SQL,但没有 ;,因此认为语句仍处于打开状态的包装器仍会执行下一个点命令。.shell 即 system()。实验环境 oracle 是见证字符串的 echo。不是反向 shell。
在 OpenLiteSpeed 之后,对 3.53.4 进行了二十次源码搜寻。最新 GA 版本,而非 3.54.0 草案。CLI 附加功能并非默认库。--safe 是处理不受信任脚本的文档化防护措施(CVE-2022-46908)。它仍会阻止 .shell。默认 sqlite3 不会开启它。
src/shell.c.in 仍保留 SQL Server / Oracle 兼容路径。主干 ac6ac0c22d(2026-10-08)除非定义 SQLITE_SHELL_LEGACY_COMMAND_TERMINATOR,否则会禁用该路径。该提交在此 GA 版本之后。
已记录的弯路:将分号视为相同的剩余部分;重新提交 CVE-2022-46908;期望 --safe 成为默认;将此称为 libsqlite3 RCE;使用反向 shell 作为 oracle;锁定 3.54.0(草案)。
cd lab
./run.sh
将官方 sqlite-src-3530400 构建为默认 Unix sqlite3(--disable-readline)。Compose sqlite-cli-go。在 127.0.0.1:18920 上运行 Dummy TCP。默认 CLI 将 go 和 / 视为终止符,然后运行 .shell echo SQLITE-CLI-GO-WITNESS。--safe 输出 cannot run .shell in safe mode。绑定回环地址。
SUCCESS sqlite-cli-go how=go-then-dot-shell slash=yes safe=blocked SQLITE-CLI-GO-WITNESS
停止将 go 和 / 视为终止符,这正是主干 ac6ac0c22d 所做的,除非定义 -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR。在此之前,请使用 --safe 运行不受信任的脚本。--safe 是仍然有效的控制措施。
b09c88c14082339b66c7b7158d609a771e64ca69)src/shell.c.in line_is_command_terminator、process_input 重写、do_meta_command、failIfSafeMode 之后的 .shell system()--safe--safe