以下的文章能主要是对Oracle Web Hacking 基本思路的描述,如果你是Oracle Web Hacking 基本思路方面的新手,你就可以通过以下的文章对Oracle Web Hacking 基本思路有一个更好的了解,以下就是文章的详细内容的介绍。
下面说说如何确定目标,注射参数的确定就由大家自己来了,主要是如何判断数据库属于Oracle,根据数据库的特性很容易判断出来,Oracle支持--类型注释,但是不支持; 分隔执行多语句,Oracle有很多系统表,譬如all_tables,通过对这些表的访问也可以判断出是否属于Oracle。
另外在Oracle里的一些函数也可以用来判断,譬如utl_http.request这些,语言上的小细节也可以用来区分系统,譬如在Oracle里||是连接符号,但是在其他数据库里就不是了,所以 and chr(123)||chr(123)=chr(123)||chr(123)这样的,如果可以顺利执行,那么就基本应该是Oracle了,另外,一些脚本在出现数据库查询错误时,对错误信息没有处理,也会泄露真实的后台数据库,这个可以很明显地看出来。
然后需要确定的是注射点的类型,一般的情况下,我们进入的参数不是数字类型就基本是字符类型(其他很多人所说的搜索型注射其实还是应该归结于字符类型的),对于数字类型的基本不用考虑什么,很容易添加--注释字符就可以让语句正确闭合了,如果是字符类型的就要考虑如何让整个语句正确,通常是添加'以及--这些注射字符来构造自己的注射环境。
在一些复杂的情况下,如同一个参数在多个sql语句和逻辑里出现,就要自己小心构造出符合环境的注射语句了,记住,我们只需要一个能便利插入自己sql命令的完好环境:)
在确定目标数据库为OracleWeb Hacking 基本思路并且可以注射的时候,就可以开始尝试构造语句了。一般首先要进行的是判断当前的权限,在Oracle数据库里权限比较高的是DBA权限,拥有Oracle数据库的所有权限,另外如果当前用户的权限授予不对的话,也可以实现跨库查询的效果,可以通过对dba_tables这样的dba的表进行尝试访问来是否是dba。
在一般的注射中,分为select类型注射,insert类型注射以及update类型等。update和insert类型的注射可以根据上下文来更改数据库中的数据,如利用update注射将表中某个重要字段更改成我们想要的值,即使这些数据库无关紧要也没关系,我们可以利用select子语句来将我们需要的数据查询出来然后在另外某个地方将这个数据读出来,只要遵循数据库的语法,实现自己的目的就可以了。
在这里主要说下select类型的注射,如果我们能控制select语句的一部分的话,就可能实现这种类型注射,如果查询的结果可以返回到页面中的时候,还可以尝试使用union查询出结果,直接将内容显示在页面当中,这是最方便的一种。事实上后面可以看到,无论是什么注射,在Oracle的web环境下,都可以直接执行系统命令返回shell。
Oracle中获得敏感数据,首先就是Oracle有系统表,任何有权限获得数据都可以从这里获得,关键的系统表有all_tables,all_objects等,都是有权限能访问的,包括别人赋予你权限的,所以如果你的权限是dba的话,这能看到系统中所有的表,注射中一个技巧就是如果你需要从后台登陆但是不知道密码就可以在这里使用了,譬如猜测列名含不含有password等方法,后面的例子中也有讲述。
另外比较需要了解的就是union查询,在Oracle union查询中和其他数据库类似,要求列数一样,还要求类型完全一致,Oracle类型有很多,常见的有字符类型,数字类型以及日期类型等等,一般我们能用来做union查询并且显示的是字符类型,所以需要精确定位哪个字段符合我们的要求
1 会在页面显示,数据从进入到出来会有很多的流程,很多数据会在中间经过多次的处理,所以要想找到能显示出来的数据,很多时候并不是那么顺利,这种显示包括很多地方,包括返回的http头,页面正文甚至是cookie等。
2 字符类型 因为我们出来的数据大部分都是字符类型,所以需要这个类型用来正确地匹配
3长度需要足够 尽管我们可以用一些字符函数来解决这个问题,但是够长的字段总是非常简便 ),OracleWeb Hacking 基本思路并不会自己做数据类型转换,但是Oracle中提供了一个NULL类型,可以匹配所有的数据类型,所以我们在定位完字段数之后就可以在union的各个字段填写null来匹配,另外Oracle不支持select 1这样的查询,语法要求select必须有关键字,如果我们没有表可以用。
可以用系统中默认谁都有权限的表dual。关于定位字段数其实也比较简单,和其他数据库一样可以利用order by 1-- 这样操作,如果字段个数存在就会正常,通常页面的逻辑会让这个参数 不只在一个地方出现,所以order by地方不一致,所以不能进行union查询。在这里可能会遇到目标语言不支持''的情况,所以可以使用chr这些函数来处理这些问题。
即使不支持union,Oracle的一些特性还是让我们轻易拿到想要的信息,就是用系统的utl_http.request包,这个包你可以看做是一个普通的函数,所以我们完全可以自己监听端口,然后通过这个函数用请求将需要的数据发送过来,这个时候我们还可以用来查看数据库可不可以上网以及出口IP,是个非常重要的一点。
正是有了这些系统里丰富的包和函数以及存储过程,使得只要有一个注射点,就可以在OracleWeb Hacking 基本思路里做任何事情,包括权限允许的和权限不允许的,记住,是任何事。
【编辑推荐】