资源描述
SQLSQL注入漏洞基础注入漏洞基础王朋涛王朋涛深信服北京安全团队深信服北京安全团队SQL注入漏洞基础王朋涛深信服北京安全团队1.SQL注入背景简介2.SQL注入攻击原理3.SQL注入分类4.SQL注入渗透测试框架5.SQL盲注入6.SQL登录绕过攻击7.总结培训提纲培训提纲SQL注入背景简介培训提纲SQLSQL注入背景介绍注入背景介绍SQL注入背景介绍SQLSQL注入背景简介注入背景简介什么是什么是SQLSQL?SQL=Structured Query Language 结构化查询语言SQL语言提供了我们访问操作数据库的能力,分为:-DML(Data Manipulation Language,数据操作语言)-DDL(Data Definition Language,数据定义语言)-DCL(Data Control Language,数据控制语言)-DQL(Data Query Language,数据查询语言)SQL能够:-执行对数据库的查询,DQL -插入修改删除数据库数据,DML -定义数据库实体对象结构,DDL -设置或更改数据库用户角色权限信息等,DCLSQL注入背景简介什么是SQL?SQLSQL注入背景简介注入背景简介产生背景产生背景lSQL注入的出现是Web安全史上的一个里程碑,它大概出现在1999年,并很快就成为Web安全的头号大敌。l黑客们发现通过SQL注入攻击,可以获取很多重要的、敏感的数据,甚至能够获取系统访问权限,这种效果并不比直接攻击系统软件差,Web攻击一下子就流行起来。SQL注入背景简介产生背景SQLSQL注入攻击原理注入攻击原理SQL注入攻击原理SQLSQL注入攻击原理注入攻击原理WebWeb应用工作原理应用工作原理SQL注入攻击原理Web应用工作原理SQLSQL注入攻击原理注入攻击原理WebWeb应用工作原理应用工作原理SQL注入攻击原理Web应用工作原理SQLSQL注入攻击原理注入攻击原理攻击原理攻击原理l注入攻击的根源在于用户数据与程序代码没有分离,使得攻击者有机会将程序代码当作用户输入数据提交给Web应用程序执行。SQL注入作为注入攻击的一种,Web应用程序动态生成SQL命令时没有对用户输入的数据进行验证过滤,使得用户输入的SQL语句得以执行。SQL注入攻击原理攻击原理SQLSQL注入攻击原理注入攻击原理示例代码示例代码 id=request.QueryString(“id”);set rs=server.createobject(“adodb.recordset”);sql=“select*from admin where id=”&id;说明:第一行代码获取HTTP请求的查询字符串数据(外部数据)id,并把该id直接用于SQL语句拼串,这样对用户数据没有过滤,导致了SQL注入漏洞。SQL注入攻击原理示例代码SQLSQL注入攻击分类注入攻击分类SQL注入攻击分类区分数字和字符串区分数字和字符串要想构造有效的SQL注入语句,需要对SQL语言有基本的了解。执行SQL注入利用,首先要清楚数据库包含不同的数据类型,他们都具有不同的表示方式,可以将它们分为两类:-数字:不需要使用单引号来表示 -字符串:需要单引号来表示l使用数字值的例子:select*from products where id=3l使用字符串值的例子:select*from products where name=petaSQLSQL注入攻击分类注入攻击分类区分数字和字符串SQL注入攻击分类内联和终止内联和终止l内联注入是指向查询注入一些SQL代码后,原来的查询仍然会全部执行。SQLSQL注入攻击分类注入攻击分类内联和终止SQL注入攻击分类内联和终止内联和终止l终止式注入是指攻击者在注入SQL代码时,通过注释剩下的查询来成功终止了SQL语句。除终止了该语句外,还需要注释剩下的查询以使其不会被执行。SQLSQL注入攻击分类注入攻击分类内联和终止SQL注入攻击分类常规注入和盲注入常规注入和盲注入l常规注入是指攻击者通过构造一系列有目的、有规律的HTTP请求,从返回的HTTP响应中直接提取数据库数据的攻击。常规注入之所以称为常规是由于它的普遍性、适用性,它最主要的一个特点是请求返回的响应可以“直接”获取想要的数据。SQLSQL注入攻击分类注入攻击分类常规注入和盲注入SQL注入攻击分类常规注入和盲注入常规注入和盲注入l与常规注入相比,盲注就是一种非常规注入,它不能从HTTP请求返回的响应中直接提取想要的数据,但是可以利用多个请求响应的细微差别间接推断出数据库数据。SQLSQL注入攻击分类注入攻击分类常规注入和盲注入SQL注入攻击分类按攻击方法划分按攻击方法划分基于时间,基于WEB应用响应时间上的差异来寻找利用SQL注入漏洞 -/sql.asp?id=1;if+(system_user=sa)+waitfor+delay+0:0:5-/sql.asp?id=1 union select if(substring(user(),1,4)=root,benchmark(100000000,rand(),1);-/sql.asp?id=1 union select if(substring(user(),1,4)=root,sleep(5),1);-select utl_http.request(http:/10.0.0.1)from dual;-select HTTPURITYPE(http:/10.0.0.1).getclob()from dual;-select decode(substr(user,1,1),A,(select count(*)from all_objects,all_objects,all_objects,all_objects),0)SQLSQL注入攻击分类注入攻击分类按攻击方法划分SQL注入攻击分类按攻击方法划分按攻击方法划分基于错误,基于错误的用法需要与特定数据库错误相结合使用,下面是一个MSSQL基于错误的攻击探测方法:-/sql.asp?id=12/is_srvrolemember(sysadmin);说明:is_srvrolemember是MSSQL用于探测当前数据库用户是否拥有固定数据库角色,如上面请求,如果用户有sysadmin数据库角色,函数返回1,没有返回0。类似的函数还有is_member、has_dbaccess。基于错误的方法还可以结合基于条件的攻击手法一起使用,如下请求:/sql.asp?id=12/(case when(system_user=sa)then 1 else 0 end);SQLSQL注入攻击分类注入攻击分类按攻击方法划分SQL注入攻击分类按攻击方法划分按攻击方法划分基于内容,基于错误的方法可能会触发许多不需要的错误,基于内容的攻击手法是对基于错误的方法的改进,它避免了错误的产生,通过不同的响应来判断信息位。-/sql.asp?id=12%2B(case when(system_user=sa)then 1 else 0 end);说明:与基于错误的唯一差别是用%2B替换了“/”字符。%2B是“+”的URL编码。SQLSQL注入攻击分类注入攻击分类按攻击方法划分SQL注入攻击分类特定数据库的攻击特定数据库的攻击lPL/SQL对于Oracle就像T-SQL对于MSSQL一样,它们都是对标准数据查询语言(SQL)的扩展。PL/SQL不是一个独立的产品,它是一个整合到Oracle服务器和Oracle工具中的技术,可以把PL/SQL看作Oracle服务器内的一个引擎,SQL语句执行者处理单个的SQL语句,PL/SQL引擎处理PL/SQL程序块。当PL/SQL程序块在PL/SQL引擎处理时,Oracle服务器中的SQL语句执行器处理PL/SQL程序块中的SQL语句。lPL/SQL注入是Oracle特有的一种SQL注入,它不同于一般SQL注入的地方是PL/SQL注入可以执行PL/SQL代码,而一般的SQL注入只能执行SQL语句。SQLSQL注入攻击分类注入攻击分类特定数据库的攻击SQL注入攻击分类SQLSQL注入渗透测试框架注入渗透测试框架SQL注入渗透测试框架SQLSQL注入渗透测试框架注入渗透测试框架SQL注入渗透测试框架SQLSQL注入渗透测试框架注入渗透测试框架收集应用程序可测试点收集应用程序可测试点应用程序可测试点指的是Web应用程序页面中用户可控数据的入口点。用户通过入口点输入的数据,如果没有经过验证过滤而被用于操作数据库,就有可能存在SQL注入漏洞。所以在收集可测试点的过程中,应尽量确保覆盖范围,不遗漏每一个可测试点。常见的可测试点有url查询字符串参数、post表单数据、cookie数据,post表单数据往往还包含一些隐藏字段。SQL注入渗透测试框架收集应用程序可测试点SQLSQL注入渗透测试框架注入渗透测试框架确定可测试点是否是可注入点确定可测试点是否是可注入点确定可测试点是否是可注入点,是SQL注入渗透测试最重要的一个环节。确定的依据主要有两种,一种是依据用户输入数据是否会导致应用程序出现SQL语法错误,另一种是依据用户输入数据执行的差异性。-单引号测试 -and 1=1与and 1=1测试SQL注入渗透测试框架确定可测试点是否是可注入点SQLSQL注入渗透测试框架注入渗透测试框架数据库类型探测数据库类型探测发现了SQL注入漏洞相当于找到了切入点,对于攻击者没有任何意义,对于渗透测试人员没有令人信服的凭证,所以万里长征要想取得成功,我们还需一步步走。如果说发现SQL注入漏洞为我们指明了革命的方向,那么探测清楚数据库类型就是革命的路线方针,它可以让我们在整个渗透测试过程中少走弯路,为我们进一步的发起总攻提供强有力的支持。-oracle特有dual数据表 -oracle错误信息 -oracle版本信息 -oracle特有拼串操作 -oracle特有函数SQL注入渗透测试框架数据库类型探测SQLSQL注入渗透测试框架注入渗透测试框架数据库基本信息探测数据库基本信息探测探测数据库类型也是探测基本信息的一步,但知道了数据类型与版本还远远不够,还不足以为进一步渗透提供足够的信息,还有一些基本信息需要探测清楚,包括当前用户名、当前用户权限、当前数据库名、当前数据库表信息、当前数据库列信息。-爆破(access)-全局变量version servername(MSSQL)-特有函数db_name()(MSSQL)-数据库系统元数据信息(mssql、mysql、oracle)SQL注入渗透测试框架数据库基本信息探测SQLSQL注入渗透测试框架注入渗透测试框架爆取数据库数据爆取数据库数据l利用SQL注入漏洞爆取数据库数据,是SQL注入攻击的最直接的价值体现。有了基本信息探测阶段探测的数据库表信息与数据库列信息,爆取数据库数据是水到渠成的事情。直接构造SQL语句“select 列名 from 表名”爆取数据。SQL注入渗透测试框架爆取数据库数据SQLSQL注入渗透测试框架注入渗透测试框架提权提权所有现代DBMS均为其管理员提供了对用户可执行操作的细微控制,可以通过为每个用户赋予指定的权限来管理并控制其对存储信息的访问。如我们攻击的后台DBMS可能包含多个数据库,但执行查询的用户可能只能访问其中的某一个,该数据库可能并未包含我们想要的信息。还有可能用户只能读取数据,而我们测试的目的是检查是否能够以未授权的方式修改数据。换言之:执行查询的用户只是一个普通的用户,其权限远低于DBA。这时就需要提权,不同数据库的提权方式也是不同的,大体可分为一下类别:-爆破(MSSQL爆破sa口令)-具体DBMS漏洞SQL注入渗透测试框架提权SQLSQL注入渗透测试框架注入渗透测试框架读写文件读写文件lMySQL的LOAD DATA INFILE语句和LOAD_FILE函数读取文件lMySQL的SELECT.INTO DUMPFILE/OUTFILE语句用于写入文件lMSSQL的bulk insert语句可以读取源文件、配置文件以及证书文件lMSSQL的一系列系统存储过程sp_oamethod、sp_oacreate、xp_fileexist等。lORACLE的utl_file包、JAVA存储过程SQL注入渗透测试框架读写文件执行系统命令执行系统命令MSSQL的xp_cmdshell扩展ORACLE的JAVA存储过程SQLSQL注入渗透测试框架注入渗透测试框架执行系统命令SQL注入渗透测试框架SQLSQL盲注入盲注入SQL盲注入l一般推断技术:分两步,第一步推断某个要探测的数据的长度N;第二步推断N个字节的值。第一步推断长度是非常重要的,如果没有推断出长度,就无法确定第二步要推断多少个字节的值。以推断用户名为例它的推断公式是:-and(select length(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-1,w取A-Z,a-z,0-9,_SQLSQL盲注入盲注入一般推断技术:分两步,第一步推断某个要探测的数据的长度N;第l二分法推断技术:从推断过程看二分法推断技术同一般推断技术一样分两步,第一步推断要探测的数据的个数或长度或者两者都有;第二步利用二分法发送8个请求推断要探测的数据的每一个字节值。以推断数据表表名为例它的推断公式是:-and(select ascii(substr(table_name,i,1)from(select rownum,table_name from user_tables where rownumN,i取0.n-1,n是探测的数据表长度,j取2.m+1,m是探测的数据表的个数,N取0.255SQLSQL盲注入盲注入二分法推断技术:从推断过程看二分法推断技术同一般推断技术一样l逐位推断技术:在逐位推断技术中,长度个数的推断也是必不可少的,以推断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 rownumj order by 1 desc)where rownum=1),2的N次方)=2的N次方,i取0.n-1,n是探测的TB_USERS第j-1个数据列的长度,j取2.m+1,m是探测的TB_USERS数据列的个数,N取0.7SQLSQL盲注入盲注入逐位推断技术:在逐位推断技术中,长度个数的推断也是必不可少的SQLSQL绕过攻击绕过攻击SQL绕过攻击l利用注入漏洞绕过认证不同于常规注入和盲注,它的目的只是利用内联和终止式注入绕过应用程序认证,这种注入漏洞主要存在于应用程序登录页面。-字符串式内联注入绕过-字符串式终止注入绕过-数字式内联注入绕过-数字式终止注入绕过SQLSQL绕过攻击绕过攻击利用注入漏洞绕过认证不同于常规注入和盲注,它的目的只是利用内字符串式内联注入绕过字符串式内联注入绕过l某公司Web站点要求用户输入正确的用户名和密码进行表单身份认证,用户输入用户名和密码后,应用向数据库发送一个查询以对用户进行认证,查询的格式为:-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=SQLSQL绕过攻击绕过攻击字符串式内联注入绕过SQL绕过攻击字符串式终止式注入绕过字符串式终止式注入绕过l某公司Web站点要求用户输入正确的用户名和密码进行表单身份认证,用户输入用户名和密码后,应用向数据库发送一个查询以对用户进行认证,查询的格式为:-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=SQLSQL绕过攻击绕过攻击字符串式终止式注入绕过SQL绕过攻击数字式内联注入绕过数字式内联注入绕过l假设用户可以登录到Victim公司访问自己的资料,格式如下:-http:/ 1=1)语句,可以返回所有用户的消息而不单是自己的消息,如下:-http:/ or 1=1此时服务器执行的SQL语句为:-select*from messages where uid=1 or 1=1 order by name上述查询会返回messages表所有的行,而不只是那些发送给自己的消息行,这样我们就绕过了认证访问了发送给其他用户的消息。SQLSQL绕过攻击绕过攻击数字式内联注入绕过SQL绕过攻击数字式终止注入绕过数字式终止注入绕过还是以数字式内联注入的例子说明,通过注入一个永真的条件(or 1=1-)语句,可以返回所有用户的消息而不单是自己的消息,如下:-http:/ or 1=1-此时服务器执行的SQL语句为:-select*from messages where uid=1 or1=1-order by name上述查询会返回messages表所有的行,而不只是那些发送给自己的消息行,这样我们就绕过了认证访问了发送给其他用户的消息。SQLSQL绕过攻击绕过攻击数字式终止注入绕过SQL绕过攻击总结总结总结l介绍了SQL注入的背景l介绍了SQL注入的原理l介绍了SQL注入渗透测试框架l介绍了SQL注入分类l介绍了SQL盲注入l介绍了SQL绕过攻击总结总结介绍了SQL注入的背景总结
展开阅读全文