阅读:3213回复:0
攻击JavaWeb应用[4]-SQL注入[2]
注:这一节主要是介绍Oracle和SQL注入工具相关,本应该是和前面的Mysql一起但是由于章节过长了没法看,所以就分开了。
◆0 Oracle Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。 Oracle对于MYSQL、MSSQL来说意味着更大的数据量,更大的权限。这一次我们依旧使用上面的代码,数据库结构平移到Oracle上去,数据库名用的默认的orcl,字段"corps_desc" 从text改成了VARCHAR2(4000),JSP内的驱动和URL改成了对应的Oracle。 图片:2014091811125084186.png Jsp页面代码: 图片:2014091811125084186.png 开始注入: Union +order by 永远都是最快捷最实用的,而盲注什么的太费时费力了。 依旧提交order by 去猜测显示当前页面所用的SQL查询了多少个字段,也就是确认查询字段数。 分别提交http://localhost/SqlInjection/index.jsp?id=1 AND 1=1 和?id=1 AND 1=12 得到的页面明显不一致,1=12页面没有任何数据,即1=12为false没查询到任何结果。 图片:2014091811125084186.png http://localhost/SqlInjection/index.jsp?id=1 AND 1=12 图片:2014091811125084186.png 提交:http://localhost/SqlInjection/index.jsp?id=1 ORDER BY 4-- 页面正常,提交:?id=1 ORDER BY 5--报错说明字段数肯定是4。 Order by 5爆出的错误信息: 图片:2014091811125084186.png 使用union 进行联合查询: Oracle的dual表: dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录,在Oracle注入中用途可谓广泛。 Oracle union 查询 tips: Oracle 在使用union 查询的跟Mysql不一样Mysql里面我用1,2,3,4就能占位,而在Oracle里面有比较严格的类型要求。也就是说你union select的要和前面的 SELECT * from "corps" where "id" = 1当中查询的字段类型一致。我们已知查询的第二个字段是corps_name,对应的数据类型是:VARCHAR2(100),也就是字符型。当我们传入整型的数字时就会报错。比如当我们提交union查询时提交如下SQL注入语句: http://localhost/SqlInjection/index.jsp?id=1 and 1=2 UNION SELECT 1,2,NULL,NULL FROM dual-- 图片:2014091811125084186.png Oracle当中正确的注入方式用NULL去占位在我们未知哪个字段是什么类型的时候: http://localhost/SqlInjection/index.jsp?id=1 and 1=2 UNION SELECT NULL,NULL,NULL,NULL FROM dual--当已知第一个字段是整型的时候: http://localhost/SqlInjection/index.jsp?id=1 and 1=2 UNION SELECT 1,NULL,NULL,NULL FROM dual--SQL执行后的占位效果: 图片:2014091811125084186.png 根据我们之前注入Mysql的经验,我们现在要尽可能多的去获取服务器信息和数据库,比如数据库版本、权限等。 在讲Mysql注入的时候已经说道要合理利用工具,在Navicat客户端执行select * from session_roles结果: 图片:2014091811125084186.png Oracle查询分页tips: 不得不说Oracle查询分页的时候没有Mysql那么方便,Oracle可不能limit 0,1而是通过三层查询嵌套的方式实现分页(查询第一条数据“>=0 |
|