姜子罡 张一光 蔺蜀 梁成岗
SQL注入攻击分析应用程序的编码,在发现数据库的漏洞之后,通过提交SQL的查询密码给服务器,得到Web页面返回的数据,根据这得到的结果,从而利用漏洞获得数据库中的重要关键性的数据或者相应的权限。而这种注入攻击的手段通常都是从正常的端口进入,所以防火墙通常不会对其做出有效的反映,只有在事后通过IIS管理日志的分析才能发现。当下很多的中小型的网站主要就是利用托管的方式管理,因而采用分析日志的方式来对SQL注入攻击进行防范是不太现实的,如果一定要做出防范,需要在程序设计的过程中做出专门的处理。本文主要对SQL注入攻击进行相关的论述,除了介绍了一些特定的常见的步骤和手段之外,还主要从开发软件的角度介绍了相应的方法。
1 SQL注入攻击的手段和步骤介绍
1.1 步骤简介
通过上面的介绍我们对SQL注入攻击有了一定的了解,无论在步骤还是手段的方面都有了一个粗略的认识,下面我们来细致的讲述下这种攻击方式的步骤:
a.事先编辑好特殊的SQL语言,然后利用这种语句去寻找注入放面的漏洞;
b.利用发现的注入漏洞来尝试着进入数据库,从而有效的获取数据库中的关键信息;
c.利用上面发现的数据库中的关键信息,通过对其进行仔细的分析,从而获得管理员的相关权限为sa,为后续的攻击做好准备。实施直接控制;以SQL Server 2000为例,如果实施注入攻击的数据库是SQL Server 2000,且数据库用户为sa,则可以直接添加管理员账号、开放3389远程终端服务、生成文件等命令。
d.间接进行控制。间接控制主要是指通过SQL注入点不能执行DOS等命令,只能进行数据字段内容的猜测。在Web应用程序中,为了方便用户的维护,一般都提供了后台管理功能,其后台管理验证用户和口令都会保存在数据库中,通过猜测可以获取这些内容,如果获取的是明文的口令,则可以通过后台中的上传等功能上传网页木马实施控制,如果口令是明文的,则可以通过暴力破解其密码。
1.2 SQL常用的攻击手段介绍
SQL注入攻击漏洞的手段的有很多,下面我们主要介绍几种常见的:
a.可以在查询网址的尾部加入“and 1=1”,“and 1=2”等,从而构成查询的语句,然后通过页面最终返回的结果判断是否存在SQL相关的注入漏洞;
b.通过在查询请求URL尾部添加数据库中内置变量判断的语句的方式,然后根据页面返回的结果来得到关键的信息。例如:user就是Server内置的变量,在URL的尾部加上and user>0,那么返回的頁面就可能返回正确的user名称;
c.在存储的其间通过调用系统命令的方式在查询URL的尾部注入。例如:可以在URL的尾部添加:exec master..xp__cmd shell“net user name passwordadd”。这就相当于是利用net的命令新建了一个密码为password和用户名为name的帐号。
2 从软件开发的角度来介绍防范SQL注入攻击的方法
在设计程序的过程中,需要严格对用户输入进行合法性的检查,采用存储过程对输入值进行有效的处理,制定合理有效的错误返回策略,以及在数据库设计时对命名的规范都可以有效的防范或者避免SQL注入攻击Web应用程序。
2.1 SQL注入攻击一般的防范方法
(1)在服务端正式处理之前对提交数据的合法性进行检查;(2)封装客户端提交信息;(3)替换或删除敏感字符/字符串;(4)屏蔽出错信息。(5)不要用字串连接建立SQL查询,而使用SQL变量,因为变量不是可以执行的脚本;(6)目录最小化权限设置,给静态网页目录和动态网页目录分别设置不同权限,尽量不给写目录权限;(7)修改或者去掉Web服务器上默认的一些危险命令,例如ftp、cmd、wscript等,需要时再复制到相应目录;(8)数据敏感信息非常规加密,通过在程序中对口令等敏感信息加密都是采用md5函数进行加密,即密文=md5(明文),本文推荐在原来的加密的基础上增加一些非常规的方式,即在md5加密的基础上附带一些值,如密文=md5(md5(明文)+123456)。
2.2 检查用户输入的合法性
SQL注入攻击的手段无非就是通过篡改用户的关键信息,因而我们如果要避免或者防范注入攻击的话,就必须对特殊的字符,例如;单引号、分号、双引号、逗号、连接号、冒号等等进行有效的过滤或者转换,与此同时需要对用户输入字符才长度进行有效的限制。另外利用存储过程的方式对输入值进行处理,通过存储过程可以将查询的URL输入值进行参数化,而数据库的服务器可以有效的避免将参数的内容作为SQL的指令进行处理,只有在数据库对SQL的指令完成编译之后,才会套用参数进行运行,这样可以有效的避免SQL注入攻击的风险。
2.3 制定合理有效的错误返回策略
由于SQL的错误反馈信息可以有效的透露数据库设计的某些细节,因而需要注意的就是当应用程序发生错误的时候,尽量不要将错误的信息全部反馈给用户,通常情况下正确而有效的做法就是对发生错误的页面进行一定的包装,根据用户的权限来向用户展示错误的信息,如果没有管理员的权限,可以仅仅提示是SQL发生了错误的运行。
2.4 在数据库设计的过程中要注意规范化命名
软件工程师或者数据库的编译者在对数据库进行设计时,应该避免利用日常词汇对数据库的字段和表进行任意的命名,例如:name,systeminfo,password,useld,account等等,SQL注入攻击通常就会对这些关键的词汇进行寻找,通过发现其是否存在,然后发现寻找相应的漏洞。因而在数据库设计的时候一定要遵循相应的设计原则,适当的增加字段和表的前后缀,使得命名更加的合理。
3 总论
由于Web的应用程序开发的门槛比较低,所以有很多的初学者尚未对整体的知识进行了解就盲目的开发程序,或者一部分的程序设计人员、软件工程师即使拥有了很丰富的设计知识,但是头脑中对网络安全的概念和设计经验的匮乏,使得他们开发设计出的软件有很多的安全隐患,一旦受到SQL的注入攻击就无力招架,甚至瘫痪,因而我们需要做的就是在日常的数据或者程序开发过程中主动进行防范,这样不仅可以提升自身的安全意识,也可以增强网站的安全系数,保证网站安全而有效的运行。
参考文献
[1] 李元鹏.SQL注入攻击扫描分析工具的实现与攻击防范技术研究[D].北京交通大学,2010.
[2] 李小花.基于程序分析的SQL注入防御系统的设计与实现[D].湖南大学,2010.