预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

SQL注入攻击及其防御策略分析HYPERLINK"https://m.zqwdw.com/wenku/jingjimaoyi/2020/0914/710561.html"摘要:随着互联网Web应用的飞速发展,黑客攻击的手段也在不断翻新,各种新的攻击技术层出不穷。SQL注入攻击是黑客对Web应用进行攻击的常用手段之一。以ASP和SQLServer为例详细阐述了SQL注入攻击的基本原理和过程,并从Web应用生命周期的各个环节出发,综合探讨防御SQL注入攻击的有效方法和策略。关键词:SQL注入;参数化查询;渗透测试;Web应用防火墙中图分类号:TP393文献标识码:A文章编号:1009-3044(2013)05-1000-02随着互联网Web应用的飞速发展,各类Web网站大量涌现。在这种互联性和开放性坏境下,各种Web应用系统的复杂性和多样性导致了系统漏洞层出不穷,黑客入侵和篡改网站的安全事件时有发生。SQL注入作为直接威胁Web应用的最常见的网络攻击手段之一,一直受到网站开发人员和管理人员的关注。如何有效防御SQL注入攻击是近年来人们讨论的热点问题。SQL注入是针对ASP、PHP、JSP等脚本建站语言的一种入侵手段,理论上它对所有基于SQL语言标准的数据库软件包括SQLServer、Oracle、MySQL、Access等都是有效的。该文以ASP和SQLServer为例阐述SQL注入攻击的基本原理和过程,并从Web应用生命周期的各个环节深入探讨防御SQL注入攻击的有效方法和策略。1SQL注入攻击的原理和过程所谓SQL注入攻击[1],就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容被直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。SQL注入过程中,攻击者通过从客户端提交构造巧妙的SQL代码,收集服务器返回的结果信息,从而获取想要得到的资料并实施攻击。下面以HTTP://xxx.xxx.xxx/abc.asp?id=25作为测试URL讨论SQL注入攻击的一般过程。1)检测是否有注入漏洞。最简单的方法就是在测试URL的末尾附加一个单引号,提交页面请求后查看服务器的响应情况。如果返回错误信息,则证明程序没有对单引号进行过滤,有可能存在注入漏洞。当然,以上方法对那些实现单引号过滤的应用程序不起作用,此时可以使用下面方法进行检测。在测试URL的后面分别加上“and1=1”和“and1=2”两种注入参数并提交请求,若前者测试的返回结果为正常页面,而后者测试的返回结果为错误信息,则说明可以进行注入。其原理在于若后台程序存在注入漏洞,提交第一种参数则会构成SQL语句“select*from表名whereid=25and1=1”,由于逻辑正确服务器将返回正常页面;提交第二种参数则会构成SQL语句“select*from表名whereid=25and1=2”,由于逻辑错误服务器会返回错误信息。上例只是注入参数为数字型的检测方法,实际应用时还可以使用字符型和搜索型参数进行检测。2)判断数据库类型。一般与ASP最常搭配的数据库是Access和SQLServer,判断时可以从Access和SQLServer的区别入手:Access的系统表是msysobjects,且在Web环境下没有访问权限;而SQLServer的系统表是sysobjects,在Web环境下可以被访问。由此,可在测试URL的尾部注入参数“and(selectcount(*)fromsysobjects)>0”并提交,如果返回正常页面,基本上可以断定是SQLServer数据库;如果返回错误信息,则可以断定是Access数据库。3)破解数据库名。在注入点之后附加参数“and(selectcount(*)frommaster.dbo.sysdatabaseswherename>1anddbid=6)<>0”并提交,由于name字段是一个字符型字段,因此abc.asp工作异常,通过返回的错误信息可得到第一个数据库名。同理将dbid的值分别改成7、8、9……,就可得到所有数据库名。除此之外也可以通过注入参数“anddb_name()>0”来获取连接数据库的名称。以下假设得到的数据库名是TestDB。4)猜解用户名表的名称。Web用户的账号一般存放在一张表中,为了获取数据库的访问权限,需要分析可能存放用户名与密码的表的名称。常用的方法有猜解法和读取法:猜解法根据个人的经验猜表名,通过在注入点后附加参数“and(selectcount(*)fromTestDB.dbo.表名)>0”实现;读取法通过构造注入参数访问SQLServer的系统表sysobjects来实