首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >复现pgAdmin4 <= 9.10(CVE-2025-13780)漏洞利用

复现pgAdmin4 <= 9.10(CVE-2025-13780)漏洞利用

作者头像
qife122
发布2026-01-19 14:36:32
发布2026-01-19 14:36:32
1140
举报

一、漏洞详情

pgAdmin 是一个流行且功能丰富的开源 PostgreSQL 数据库管理和开发平台,广泛被数据库管理员和开发者用于通过 Web 界面管理 PostgreSQL 数据库。

该漏洞存在于 pgAdmin4 的数据库恢复(Restore)工具中,该工具使用 psql 命令行程序执行用户上传的纯文本 SQL 文件。攻击者可以利用特殊字符绕过 pgAdmin4 对文件内容的安全检查,在 SQL 文件中嵌入元命令(\!),从而通过 psql 程序在服务器上执行任意系统命令,实现远程代码执行。

二、受影响版本

pgAdmin4(版本<=9.10)

三、漏洞复现步骤

这里以vulhub的pgadmin docker环境作为漏洞复现测试,复现的系统在ubuntu中

链接地址:

https://github.com/vulhub/vulhub/tree/master/pgadmin/CVE-2025-13780

1.git clone或者下载vulhub项目到ubuntu本地目录中,如下所示

2.在命令行中cd到pgadmin/CVE-2025-13780中,如下所示

3.在终端运行docker命令(默认ubuntu服务器已安装docker环境,如果未安装docker环境可以参考该链接ubuntu安装docker并配置国内镜像),通过 Docker Compose 一键式启动包含漏洞版本(9.10)的 pgAdmin4 服务器及配套的 PostgreSQL 数据库,如下所示

代码语言:javascript
复制
sudo docker compose up -d

4.等容器启动后,在浏览器输入http://localhost:5050进入pgAdmin4登录页面,如下所示

5.以vulhub@example.com / vulhub登录凭据登录pgAdmin4数据库管理平台,如下所示

6.访问恢复工具,登录pgAdmin4后,依次点击左侧导航栏的Services” -> “main” -> “Databases” -> “vulhub”。右键点击 “vulhub” 数据库,选择 “Restore...” 输入vulhub数据密码"vulhub"后打开数据库恢复工具,如下所示

7.准备恶意sql文件,保存到payload.sql文件中,如下所示

(1)直接使用换行符的简单恶意payload,会被拦截

代码语言:javascript
复制
SELECT 1;
\! bash -c 'touch /tmp/hacked1'

(2)使用回车符(\r)替代换行符的恶意payload

代码语言:javascript
复制
echo -ne "SELECT 1;\r\\! bash -c 'touch /tmp/hacked2'\r" > payload2.sql

8.执行恢复操作,分别在Restore工具的“Filename”处上传payload.sql跟payload2.sql文件,确保“Format”选择“PLAIN”,点击“Restore”按钮进行测试,如下所示

(1)简单恶意payload测试

(2)使用回车符(\r)替代换行符的恶意payload测试

9.查看docker容器中的/tmp目录中看是否有hacked2文件,如果有的话,则我们的漏洞利用执行成功,如下所示

使用如下命令查看/tmp文件列表

代码语言:javascript
复制
sudo docker exec <pgadmin_container_id> ls -la /tmp/

(1)sudo docker ps -a查看docker容器列表

(2)找到pgadmin容器id为812353dae4bf,执行如下命令查看/tmp/目录

代码语言:javascript
复制
sudo docker exec 812353dae4bf ls -la /tmp/

四、漏洞利用 Payload 生成命令解析

这是漏洞复现的关键,演示了如何构造绕过检查的输入。

代码语言:javascript
复制
echo -ne "SELECT 1;\r\\! bash -c 'touch /tmp/hacked2'\r" > payload2.sql

代码注释

  • echo -ne:-n选项禁止输出末尾的换行符,-e选项允许解释反斜杠转义字符。
  • SELECT 1;:一个合法的 SQL 语句,用于伪装文件内容。
  • \r:关键点。回车符 (Carriage Return),ASCII 码为 0x0D。在这里用于替代常规的换行符 (\n, 0x0A)。pgAdmin4 9.10 的检查逻辑可能只检测了 \n后跟 \!的模式,而 \r可以起到相似的分隔作用(在 psql中),从而绕过检测。
  • \\!:经过 shell 转义后,在文件中实际写入的是 \!,这是 psql的元命令,用于执行后面的系统命令。
  • bash -c 'touch /tmp/hacked2':要通过 \!执行的系统命令,创建一个文件作为攻击成功的证明。
  • 最后的 \r确保文件以 \r 结尾,保持格式一致性。
  • payload2.sql:将构造的字符串输出到名为 payload2.sql的文件中。该文件上传后,psql在处理时会因 \r而识别出新“行”,并执行 \!后面的命令。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全技术点滴分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、漏洞详情
  • 二、受影响版本
  • 三、漏洞复现步骤
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档