当前位置:文档之家› 01SQL注入漏洞基础

01SQL注入漏洞基础


询字符串参数、post表单数据、cookie数据,post表单数据往往还包
含一些隐藏字段。
SQL注入渗透测试框架
确定可测试点是否是可注入点 确定可测试点是否是可注入点,是SQL注入渗透测试最重要的一个环节
。确定的依据主要有两种,一种是依据用户输入数据是否会导致应用
程序出现SQL语法错误,另一种是依据用户输入数据执行的差异性。
说明:第一行代码获取HTTP请求的查询字符串数据(外部数据)id, 并把该id直接用于SQL语句拼串,这样对用户数据没有过滤,导致了 SQL注入漏洞。
SQL注入攻击分类
SQL注入攻击分类
区分数字和字符串 要想构造有效的SQL注入语句,需要对SQL语言有基本的了解。执行SQL
注入利用,首先要清楚数据库包含不同的数据类型,他们都具有不同
SQL注入渗透测试框架
执行系统命令 MSSQL的xp_cmdshell扩展
ORACLE的JAVA存储过程
SQL盲注入
SQL盲注入
一般推断技术:分两步,第一步推断某个要探测的数据的长度N;第 二步推断N个字节的值。第一步推断长度是非常重要的,如果没有推 断出长度,就无法确定第二步要推断多少个字节的值。以推断用户名 为例它的推断公式是:
是一个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);
end);
说明:与基于错误的唯一差别是用%2B替换了‚/‛字符。%2B是‚+‛的 URL编码。
SQL注入攻击分类
特定数据库的攻击 PL/SQL对于Oracle就像T-SQL对于MSSQL一样,它们都是对标准数据查
询语言(SQL)的扩展。PL/SQL不是一个独立的产品,它是一个整合到
Oracle服务器和Oracle工具中的技术,可以把PL/SQL看作Oracle服务 器内的一个引擎,SQL语句执行者处理单个的SQL语句,PL/SQL引擎处
SQL注入漏洞基础
王朋涛 深信服北京安全团队
培训提纲
1.SQL注入背景简介
2.SQL注入攻击原理
3.SQL注入分类
4.SQL注入渗透测试框架 5.SQL盲注入 6.SQL登录绕过攻击 7.总结
SQL注入背景介绍
SQL注入背景简介
什么是SQL? SQL=Structured Query Language 结构化查询语言
- 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,_
还还有一些基本
信息需要探测清楚,包括当前用户名、当前用户权限、当前数据库名 、当前数据库表信息、当前数据库列信息。
- 爆破(access)
- 全局变量@@version @@servername(MSSQL) - 特有函数db_name()(MSSQL) - 数据库系统元数据信息(mssql、mysql、oracle)
SQL语言提供了我们访问操作数据库的能力,分为:
- DML(Data Manipulation Language,数据操作语言) - DDL(Data Definition Language,数据定义语言) - DCL(Data Control Language,数据控制语言) - DQL(Data Query Language,数据查询语言)
- /sql.asp?id=1 union select #MYSQL
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;
内联和终止 内联注入是指向查询注入一些SQL代码后,原来的查询仍然会全部执行

注入
原来的SQL语句
注入后的SQL语句
SQL注入攻击分类
内联和终止 终止式注入是指攻击者在注入SQL代码时,通过注释剩下的查询来成功
终止了SQL语句。除终止了该语句外,还需要注释剩下的查询以使其不
会被执行。
注入
原来的SQL语句
SQL注入攻击分类
按攻击方法划分 基于内容,基于错误的方法可能会触发许多不需要的错误,基于内容
的攻击手法是对基于错误的方法的改进,它避免了错误的产生,通过
不同的响应来判断信息位。
- /sql.asp?id=12%2B(case when (system_user=‘sa’) then 1 else 0
以通过为每个用户赋予指定的权限来管理并控制其对存储信息的访问
。如我们攻击的后台DBMS可能包含多个数据库,但执行查询的用户可 能只能访问其中的某一个,该数据库可能并未包含我们想要的信息。
还有可能用户只能读取数据,而我们测试的目的是检查是否能够以未
授权的方式修改数据。换言之:执行查询的用户只是一个普通的用户 ,其权限远低于DBA。这时就需要提权,不同数据库的提权方式也是不 同的,大体可分为一下类别:
SQL注入渗透测试框架
爆取数据库数据 利用SQL注入漏洞爆取数据库数据,是SQL注入攻击的最直接的价值体
现。有了基本信息探测阶段探测的数据库表信息与数据库列信息,爆
取数据库数据是水到渠成的事情。直接构造SQL语句‚select 列名 from 表名‛爆取数据。
SQL注入渗透测试框架
提权 所有现代DBMS均为其管理员提供了对用户可执行操作的细微控制,可
注入后的SQL语句
SQL注入攻击分类
常规注入和盲注入 常规注入是指攻击者通过构造一系列有目的、有规律的HTTP请求,从
返回的HTTP响应中直接提取数据库数据的攻击。常规注入之所以称为
常规是由于它的普遍性、适用性,它最主要的一个特点是请求返回的 响应可以‚直接‛获取想要的数据。
SQL注入攻击分类
黑客们发现通过SQL注入攻击,可以获取很多重要的、敏感的数据,甚 至能够获取系统访问权限,这种效果并不比直接攻击系统软件差,Web 攻击一下子就流行起来。
SQL注入攻击原理
SQL注入攻击原理
Web应用工作原理
SQL注入攻击原理
Web应用工作原理
SQL注入攻击原理
攻击原理 注入攻击的根源在于用户数据与程序代码没有分离,使得攻击者有机
- 单引号测试
- and 1=1与and 1=2测试
SQL注入渗透测试框架
数据库类型探测 发现了SQL注入漏洞相当于找到了切入点,对于攻击者没有任何意义,
对于渗透测试人员没有令人信服的凭证,所以万里长征要想取得成功
,我们还需一步步走。如果说发现SQL注入漏洞为我们指明了革命的方 向,那么探测清楚数据库类型就是革命的路线方针,它可以让我们在
SQL注入渗透测试框架
SQL注入渗透测试框架
SQL注入渗透测试框架
收集应用程序可测试点 应用程序可测试点指的是Web应用程序页面中用户可控数据的入口点。
用户通过入口点输入的数据,如果没有经过验证过滤而被用于操作数
据库,就有可能存在SQL注入漏洞。所以在收集可测试点的过程中,应 尽量确保覆盖范围,不遗漏每一个可测试点。常见的可测试点有url查
SQL能够:
- 执行对数据库的查询,DQL - 插入修改删除数据库数据,DML - 定义数据库实体对象结构,DDL - 设置或更改数据库用户角色权限信息等,DCL
SQL注入背景简介
产生背景 SQL注入的出现是Web安全史上的一个里程碑,它大概出现在1999年,
并很快就成为Web安全的头号大敌。
会将程序代码当作用户输入数据提交给Web应用程序执行。SQL注入作
为注入攻击的一种,Web应用程序动态生成SQL命令时没有对用户输入 的数据进行验证过滤,使得用户输入的SQL语句得以执行。
SQL注入攻击原理
示例代码
id =
request.QueryString(‚id‛);
set rs = server.createobject(‚adodb.recordset‛); sql = ‚select * from admin where id=‛&id;
常规注入和盲注入 与常规注入相比,盲注就是一种非常规注入,它不能从HTTP请求返回
的响应中直接提取想要的数据,但是可以利用多个请求响应的细微差
别间接推断出数据库数据。
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);
相关主题