SQL注入攻击及其防御策略分析

时间:2022-07-11 05:58:08

SQL注入攻击及其防御策略分析

摘要:随着互联网Web应用的飞速发展,黑客攻击的手段也在不断翻新,各种新的攻击技术层出不穷。SQL注入攻击是黑客对Web应用进行攻击的常用手段之一。以ASP和SQL Server为例详细阐述了SQL注入攻击的基本原理和过程,并从Web应用生命周期的各个环节出发,综合探讨防御SQL注入攻击的有效方法和策略。

关键词:SQL注入;参数化查询;渗透测试;Web应用防火墙

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2013)05-1000-02

随着互联网Web应用的飞速发展,各类Web网站大量涌现。在这种互联性和开放性坏境下,各种Web应用系统的复杂性和多样性导致了系统漏洞层出不穷,黑客入侵和篡改网站的安全事件时有发生。SQL注入作为直接威胁Web应用的最常见的网络攻击手段之一,一直受到网站开发人员和管理人员的关注。如何有效防御SQL注入攻击是近年来人们讨论的热点问题。

SQL注入是针对ASP、PHP、JSP等脚本建站语言的一种入侵手段,理论上它对所有基于SQL语言标准的数据库软件包括SQL Server、Oracle、MySQL、Access等都是有效的。该文以ASP和SQL Server为例阐述SQL注入攻击的基本原理和过程,并从Web应用生命周期的各个环节深入探讨防御SQL注入攻击的有效方法和策略。

1 SQL注入攻击的原理和过程

所谓SQL注入攻击[1],就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容被直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到 SQL注入式攻击。

SQL注入过程中,攻击者通过从客户端提交构造巧妙的SQL代码,收集服务器返回的结果信息,从而获取想要得到的资料并实施攻击。下面以HTTP://xxx.xxx.xxx/abc.asp?id=25作为测试URL讨论SQL注入攻击的一般过程。

1)检测是否有注入漏洞。最简单的方法就是在测试URL的末尾附加一个单引号,提交页面请求后查看服务器的响应情况。如果返回错误信息,则证明程序没有对单引号进行过滤,有可能存在注入漏洞。当然,以上方法对那些实现单引号过滤的应用程序不起作用,此时可以使用下面方法进行检测。

在测试URL的后面分别加上“and 1=1”和“and 1=2”两种注入参数并提交请求,若前者测试的返回结果为正常页面,而后者测试的返回结果为错误信息,则说明可以进行注入。其原理在于若后台程序存在注入漏洞,提交第一种参数则会构成SQL语句“select * from 表名 where id=25 and 1=1”,由于逻辑正确服务器将返回正常页面;提交第二种参数则会构成SQL语句“select * from 表名 where id=25 and 1=2”,由于逻辑错误服务器会返回错误信息。上例只是注入参数为数字型的检测方法,实际应用时还可以使用字符型和搜索型参数进行检测。

2)判断数据库类型。一般与ASP最常搭配的数据库是Access和SQL Server,判断时可以从Access和SQL Server的区别入手:Access的系统表是msysobjects,且在Web环境下没有访问权限;而SQL Server的系统表是sysobjects,在Web环境下可以被访问。由此,可在测试URL的尾部注入参数“and (select count(*) from sysobjects)>0”并提交,如果返回正常页面,基本上可以断定是SQL Server数据库;如果返回错误信息,则可以断定是Access数据库。

3)破解数据库名。在注入点之后附加参数“and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) 0”并提交,由于name字段是一个字符型字段,因此abc.asp工作异常,通过返回的错误信息可得到第一个数据库名。同理将dbid的值分别改成7、8、9……,就可得到所有数据库名。除此之外也可以通过注入参数“and db_name() >0 ”来获取连接数据库的名称。以下假设得到的数据库名是TestDB。

4)猜解用户名表的名称。Web用户的账号一般存放在一张表中,为了获取数据库的访问权限,需要分析可能存放用户名与密码的表的名称。常用的方法有猜解法和读取法:猜解法根据个人的经验猜表名,通过在注入点后附加参数“and (select count(*) from TestDB.dbo.表名)>0”实现;读取法通过构造注入参数访问SQL Server的系统表sysobjects来实现。以下假设此表名为admin。

5)猜解用户名字段及密码字段的名称。在注入点之后附加参数“and (select top 1 col_name(object_id(‘admin’),1) from TestDB.dbo.sysobjects)>0”,提交后根据返回的错误信息得到已知表名的第一个字段名。以此类推,可以得到所有的字段名称。

6)猜解用户名和密码。基本方法是ASCII码逐字解码法,其思路是先猜出字段的长度,然后依次猜出每一位的值,具体过程不再赘述。

7)寻找Web管理后台入口。可以利用扫描工具快速搜索可能的登陆地址,依次进行尝试即可。

8)入侵和破坏。使用猜解的Web账号,成功登陆到后台管理界面,攻击者就可以任意进行破坏行为,如篡改网页、上传木马、修改、泄漏用户信息等,并进一步入侵数据库服务器。

另外,若当前连接数据库的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程能够正确执行,则通过巧妙构造注入参数运行系统命令,不仅可以设置新的数据库账户获取访问数据库权限,还可以获得Windows用户甚至管理员的权限,开启远程登录服务,实现对计算机的完全控制。这种方式下,以上(3)~(8)步均可省略。

2 防御SQL注入攻击的解决策略

随着网络攻击威胁的日益严重,人们对SQL注入的防范意识已大为提升,但仍有许多网站开发和管理人员缺乏系统的防御观念。笔者将着眼于Web应用生命周期的各个阶段,综合分析探讨防御SQL注入攻击的有效措施。

2.1 编码阶段的防御措施

1)对客户端的输入数据进行检查。SQL注入漏洞的成因在于Web应用程序对用户提交的输入数据或页面中所携带的信息没有进行充分的检查过滤,使应用程序存在安全隐患。因此,防范SQL注入的基本措施就是对用户的输入数据进行检查[2],以保证提交数据不包含SQL代码。具体措施包括:

① 对一些特殊字符,比如单引号、双引号、分号、星号、百分号、连接符等进行转换或者过滤;

② 对数据类型有明确要求的输入数据进行类型验证;

③ 对输入数据的长度进行必要的控制;

④ 对数据库的各关键词如exec、insert、select、delete、update、count、mid、master、truncate、char、declare、xp_、sp_等进行过滤。

2) 删除危险的和不必要的存储过程。攻击者往往通过执行xp_cmdshell之类的扩展存储过程,获取系统信息,甚至控制、破坏系统。因此开发人员应及时删除那些可能造成危害的存储过程,如xp_cmdshell、xp_fileexist、xp_getfiledetails、xp_regaddmultistring、xp_dirtree、xp_getnetname、xp_regdeletekey、sp_OACreate、sp_OAMethod等。

3)对Shell.Application和Wscript.Shell组件进行处理以防范木马。

4)控制SQL用户访问数据库的权限[3]。只给访问数据库的Web应用功能所需的最低的权限,以限制用户只能访问必要资源。同时,严格控制对资源的读、写权限。

5)控制操作系统用户的权限。一旦注入成功,可尽量降低破坏程度。

6)对CMD系列命令进行权限限制。单独对CMD系列命令如cmd.exe、net.exe、net1.exe、ping.exe、netstat.exe、ftp.exe、tftp.exe、telnet.exe等设置为只允许administrators组访问,以防范通过其他的本地提升权限漏洞运行这些关键程序的行为。

7)控制错误信息。当应用程序出错时应屏蔽服务器将详细错误信息传回到客户端的行为,建议采取自定义错误信息的方式,禁止客户端查看更详细的内容。

8)不要以明文形式存放敏感性数据(如账号密码)。

9)尽量避免使用拼接SQL的方式进行查询。使用拼接SQL的方式进行数据库查询,会使应用程序的安全性大打折扣。SQL参数化查询是最简单有效的避免SQL注入的解决方案。在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成对SQL指令的编译后才套用参数运行。这样一来即使参数中含有恶意的指令,也不会被数据库所运行。

值得注意的是,即使采用参数化查询,之前提到的对用户输入数据的检查和关键词的过滤等操作也是需要的,这些操作能够帮助程序尽早地检查输入数据的有效性。在实际Web应用开发中,入口处的安全检查是必要的,参数化查询应作为最后一道安全防线。

2.2 测试阶段的防御措施

在Web应用的测试阶段应采取有效测试手段,全面发现Web应用程序本身的脆弱性及系统架构导致的安全问题,以便及时进行加固处理,进一步提高Web应用程序的安全性。

1)代码审计。采用源代码审核方式,从编程者角度审视代码是否存在漏洞。

2)安全扫描。借助专业的安全检查工具进行Web扫描、主机操作系统和数据库扫描等,根据扫描和评估结果对相关环节进行加固处理,改善其应用部署的合理性,确保网站处在安全基线之上。

3)渗透测试。建议使用专业的SQL注入工具来检验Web网站,从攻击者的角度检查代码的安全性。

2.3 维护阶段的防御措施

SQL注入是从正常的WWW端口访问的,表面看起来跟一般的Web页面访问没什么区别,所以普通的防火墙不会对SQL注入发出警报。此时可以通过部署专用的Web应用防火墙、IPS等设备,监控并过滤恶意的外部访问。Web应用防火墙的防护范围超越了传统网络防火墙和入侵检测/入侵防御系统,它们能够帮助防御SQL注入攻击、跨站脚本攻击和其他的一些针对应用程序逻辑漏洞或软件技术漏洞的攻击。

此外,网站管理人员应在Web服务器上至少安装一款杀毒软件或木马扫描软件,这样可以避免一些常见的入侵。比如当发生前面提到的SQL创建Windows帐户时,这些安全防护系统就会立即发出警报。

最后,经常对Web安全状态进行检测对网站管理人员来说是非常必要的。比如依据常见挂马页面代码的特征,通过持续地检测被保护应用页面的当前状态,判断页面是否被攻击者加入恶意代码;通过检测Web访问日志及Web程序的存放目录,检测是否存在文件篡改或被加入Web Shell一类的网页后门等。

3 结束语

信息安全具有动态性,实际中不存在100%安全的Web网站。网站的开发人员和管理人员应从系统的编码、测试、维护等环节全面考虑安全问题,并实时跟踪国际最新安全技术,掌握新的安全应对措施,及时堵塞安全漏洞,将可能发生的风险控制在可接受的范围之内。

参考文献:

[1] 张桃林,胡春. SQL注入的方式与防范策略[J].福建电脑,2010(5):85,114.

[2] 邢太北. 分析网站建设中网页设计的安全[J]. 计算机光盘软件与应用, 2012(15):237-238.

[3] 李建平. 关于提高Web数据库安全性的几点实践[J]. 科技信息,2008(23):79-80.

上一篇:一种预测文本情感分类词语权值的算法 下一篇:基于工作过程的《图形图像处理》教学改革探索...