














FTP 还能注入 SQL?说实话,看到这个 CVE 的第一眼,我脑子里浮现的是 2008 年的 PHP 教程:把表单里的字符串拼进 SQL 查询,然后被管理员骂一顿。
但这次的注入点不在表单,在 FTP 的文件名里;被注入的不是网站数据库,是 ProFTPD 的访问日志系统;而攻击的终点,是 PostgreSQL 的COPY ... TO PROGRAM——一条能让数据库替攻击者执行操作系统命令的语句。
8 月 25 日,exploit 公开,编号 CVE-2026-42167。攻击者只需要一个合法的 FTP 账号(认证后利用),就能在服务器上执行任意命令。
老协议,新玩法。拆开看看。
ProFTPD 是 Linux 世界最常见的 FTP 服务器之一,mod_sql 是它的一个扩展模块,干一件事:把 FTP 服务器的行为记到 SQL 数据库里——谁登录了、上传了什么、下载了什么。
记录的形式很灵活,管理员可以在 proftpd.conf 里定义"命名查询"(SQLNamedQuery),把日志事件映射成 SQL 语句。比如常见的配置:
SQLNamedQuery uploaded UPDATE lastlog SET last=now(), file='%f' WHERE user='%u'
这里%f会被替换成上传的文件名,%u替换成用户名——ProFTPD 的日志模板变量。写完这个映射,用户在 FTP 上做的每个动作,都会被翻译成一条 SQL 语句执行。
问题来了:如果文件名本身不是"文件名",而是精心构造的 SQL 片段呢?
mod_sql 的设计者不是没想过这个问题——他们想了,还写了专门的转义逻辑,只是这个逻辑本身被绕过了。
先看转义逻辑。mod_sql 里有个函数叫is_escaped_text,作用是判断一段文本"是否已经被 SQL 转义过了":
static int is_escaped_text(const char *text, size_t text_len) {
register unsigned int i;
if (text[0] != '\'') {
return FALSE;
}
if (text[text_len-1] != '\'') {
return FALSE;
}
for (i = 1; i < text_len-1; i++) {
if (text[i] == '\'') {
return FALSE;
}
}
return TRUE;
}
逻辑简单粗暴:首字符是单引号、末字符是单引号、中间没有其他单引号——那就判定"这段文本已经是转义过的",直接放行。
这个判断是为谁设计的?为了兼容:有些 SQL 查询里管理员自己已经写了带引号的字面量(比如WHERE user='admin'),如果模块再转义一遍,引号会变成\',SQL 就错了。所以模块做了这个启发式判断,避免"双重转义"。
它被调用的地方在sql_resolved_append_text()里:
if (is_escaped_text(text, text_len) == FALSE) {
mr = sql_dispatch(sql_make_cmd(p, 2, resolved->conn_name, text),
"sql_escapestring");
if (check_response(mr, resolved->conn_flags) < 0) {
errno = EIO;
return -1;
}
new_text = (char *) mr->data;
new_textlen = strlen(new_text);
} else {
pr_trace_msg(trace_channel, 17,
"text '%s' is already escaped, skipping escaping it again", text);
}
翻译成人话:只要文本首尾是单引号、中间没有单引号,模块就信任它,原样拼进 SQL 语句,跳过转义。
这个"信任"就是整条漏洞链的起点。
一个启发式判断撑不起安全边界——"看起来像转义过的"和"确实是转义过的",是两个概念。
把完整链路走一遍,你会看到文件名从"数据"变成"代码"的全过程。
第一步,拼 SQL 语句。在process_named_query()里,命名查询被拼装成最终 SQL:
if (strcasecmp(c->argv[0], SQL_INSERT_C) == 0) {
query = pstrcat(cmd->tmp_pool, "INTO "
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。