任长普
(克拉玛依市委党校电大 新疆 克拉玛依 834000)
目前至少有70%以上的Web站点存在着SQL注入的缺陷,恶意用户便可以利用服务器、数据库配置的疏漏和精心构造的非法语句通过程序或脚本侵入服务器获得网站管理员的权限和数据库的相关内容,严重的还可以获得整个服务器所在内网的系统信息,它们的存在不仅对数据库信息造成威胁,甚至还可以威胁到系统和用户本身。SQL注入攻击是脚本攻击的一种,文中将从分析SQL注入PHP网站开始,介绍SQL注入的基本思路与方法,结合实例分析多种SQL注入方式,并整理总结了网站防范SQL注入的手段。
网站安全技术除了以上所述外,另外最重要同时也应用最广泛的就是SQL注入技术,也是文中所研究的重点,将在下文作详细地介绍和探讨。
所谓SQL注入式攻击,也就是SQL Injection,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。来自官方的说法是:“当应用程序使用输入内容来构造动态SQL语句以访问数据库时,会发生SQL注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生SQL注入攻击。SQL注入可能导致攻击者能够使用应用程序登录在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重”。
在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。而许多网站程序在编写时,没有对用户输入数据的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。
这样用户就可以提交一段数据库查询代码,(一般是在浏览器地址栏进行,通过正常的www端口访问)根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是SQL注入产生了。其实简单点说,SQL注入的原理就是从客户端提交特殊的代码,收集程序及服务器的信息,从而获取你想到得到的资料[3-4]。
Access:asc(字符)SQLServer:unicode(字符);
作用:返回某字符的ASCII码;
Access:chr(数字)SQLServer:nchar(数字);
作用:与asc相反,根据ASCII码返回字符;
Access:mid(字符串,N,L)SQLServer:substring(字符串,N,L);
作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串;
Access:abc(数字)SQLServer:abc(数字);
作用:返回数字的绝对值(在猜解汉字的时候会用到);
Access:A between B And C SQLServer:A between B And C;
作用:判断A是否界于B与C之间。
SQL Server与MySQL都是Web应用开发的后端服务器,通过服务器来进行系统文件与命令的操作是攻击者最常用的手段,攻击者多数是分析利用它们网络通信机制来进行版本信息探测和漏洞扫描,扫描到的数据可以清楚的协助攻击者掌握后台版本漏洞并做出相应的注入攻击策略。
1)SQL Server通信方式 命名管道通信,是借助SMB报文来进行的,如果服务器端配置有加载命名管道网络库,它就会使用TCPl39及445端口来完成与客户端的通信。客户端如果配置了命名管道来连接服务器,一般是与端口445端口建立SMB的会话连接。
TCP/IP协议通信,此种通信需要客户端和服务器端都加载有TCP/IP网络库,SQL Server会在TCPl433端口监听客户端的连接请求。
多协议通信,这是一种采用Windows RPC的通信机制。SQL Server会在初始化时向TCPl35端口上的Mapper服务动态注册监听端口,而客户端要连接SQLServer需向TCPl35端口的Mapper发送请求,在得到真正的端口后才能正常通信。
2)MySQL通信方式 TCP/IP协议通信,MySQL缺省监听的TCP端口是3306,服务器会通过这个端口与客户端进行数据通信。熟悉各自数据库服务器的通信方式会对网络扫描有一定的针对性和目的性。
Web表单数据提交方式有两种,一种是GET,一种是PoST。GET提交数据是利用URL传值,提交的数据显示在网页地址URL中,一般可以看到,且网页地址栏可以让客户端用户随意输入。GET提交方式受到限制,最多只能提交1 024字节的数据,而POST提交不受到限制。POST提交的数据从URL地址栏上是无法看到的。
问号后面就是属于URL传值。有时候会有多个参数,这些值用户可以看到,也可以更改,就算网站不允许用户与网站进行交互,用户也可以随意修改URL地址。如果你允许用户与网站交互,那么用户还可以通过表单提交数据到服务器。用户可以随意在URL地址中或是表单书写作何东西,就容易被别有用心的人加以利用,在入侵网站的手段中,SQL注入成了大多攻击者尝试入侵的方法。SQL注入,是指利于SQL语法特性,从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想到得到的资料。
GET能提交1 024字节的数据也足够应付攻击者的要求。SQL注入是基于应用层的,这种攻击方式是攻击者通过猜测一些公共表来进行攻击的,这种攻击方式得以实施的前提是因为攻击者熟程序设计人员的编程习惯和程序设计的特点。普通用户会认为非公开下载的源程序,攻击者是很难得到真实数据库结构,但事实上数据库中有用户表与系统表,一般程序员会对系统表名为sysobjects,系统表存在的每一个对象,包括约束、默认值、日志等等,攻击者可以在查询分析器时执行相对应的SQL语句就可以依次得到数据库的用户表,从而得到数据库表中的字段。
服务器的安全措施虽然不能有效阻止SQL的注入,但可以将降低SQL注入的威胁,防范某些机密数据的泄露,如果服务器的安全系数不够,黑客可能就直接渗透服务器,不必在网页上大费周折。有些小型网站是采用ASP+ACCESS或是PHP+ACCESS创建的,如果ACCESS存在的文件夹允许访问,而数据后缀为mdb,则网站浏览者可以直接下载该数据库。服务器的安全措施适用于拥有独立服务器的网站。
1)Apache服务器安全 修改掉默认的用户名,修改用户名权限,只有管理员才拥有最高权限,关才所有的不需要的端口。及时的对服务器进行更新,安装最近补丁,提高服务器安全。把一般性需要保护的文件放在安全目录下,禁止非法用户的访问。
2)IIS服务器安全 屏蔽错误信息是在服务处理完毕后进行补救。攻击其实已经发生,只是企图阻击攻击者知道攻击结果。一些攻击者使用新技术,在错误信息被屏蔽的情况下仍能获得错误信息。按需求限制网站或文件夹的权限,包括脚本资源访问、读取、写入、目录浏览、记录访问、索引资源等等。如果网站不需要与用户进行交互,那可以去掉写入权限。如果网站只限内部人员使用,可以去掉匿名访问权限,选择集成Windows身份验证。删掉不必要的脚本映射,删除IIS的危险组件。
3)Access数据库安全 Access数据库以独立的文件存在于文件夹中,这与MySQL及MsSQL不同,Access应在独立的文件夹内,该文件夹内不能包含有网站的当前路径,网站浏览无法在浏览器的地址栏内输入地址访问文件夹,access的扩展名不要以mdb为后缀,可改为.asp,或是.asa。
4)MySQL数据库安全 更改默认的用户名与密码。限制用户权限,根据不同的用户分配查询、插入、更新、删除等操作权限,例如仅允许用户具有查询权限,则用SQL注入想要进行插入、更新、删除等操作时无法使用。
5)MsSQL数据库安全 限制使用数据库的权限,不要赋予使用数据库用户角色为服务器角色组,根据需要分配表的操作权限。
6)PHP安全 将 magic_quotes_gpc设置为 on,对输入的特殊字符进行转义。将display_errorsy设置为on,禁止错误信息提示,防止恶意用户从错误提示中得到提示。
SQL注入,大多都从客户端渗透的。客户端的SQL注入,属于正常提交,服务器允许客户端向服务器提交数据,开发人员对于来自客户端的提交的数据,要假设都是不可信任的,在服务器正式处理之前,对来自客户端提交的数据进行验证、过滤。
1)addslashes()函数 PHP函数,将对输入的特殊字符进行转义,如果服务器magic_quotes_gpc设置为on,会自动对输入的特殊字符进行转义。
2)server.HTMLEncode()函数 ASP 函数,对指定的字符串应用HTML编码,(把字符编码为转义符),浏览器在解释转义符时,只将转义符对应的字符或者字符串转化显示在浏览器上,而不进行HTML的标记解释,类似PHP的addslashes()函数,但没有它强大,例如说单引号,server.HTMLEncode0函数就不会对它进行转义,而单引号在SQL注入的作用非常的大。
3)MD5()函数 PHP中有自带函数,对指定的字符串进行加密。ASP中需要自定义,网络中很容易找到,自定义函数已有自己的好处,可以根据需要进行某些更改,虽说该函数加密不可逆,但网上很容易搜到破解工具,如果你做一些更改,网上的工具就无法破解了。
4)intval()函数 PHP函数,通过使用特定的进制转换(默认是十进制),返回变量脚的integer数值,如果查询的是整形变量,利用此函数将用户的输入转换成整形,该函数与settype(mixed var,‘int’)功能差不多。
5)isnumeric()、is_numeric()函数 分别为 ASP、PHP 函数,判断变量是否为数字。当限制客户端的输入为数字时,可以用来加以判断。
6)len()函数与 strlen()函数 两个函数分别为 ASP、PHP获取长度的函数,用此函数限制用户输入数据的长度。
7)正则配匹 正则匹配能将复杂的验证简化成较短的判断语句,例如它可以验证输入数据的长度,是否为数字等,用一个表达式就可以完成,不必分开验证,唯一的缺点是,相对函数来说,正则匹配验证时间会比一般函数要慢。
文中对SQL注入攻击的方法、原理以及攻击实施过程进行了阐述和总结,由于SQL注入攻击是针对应用开发过程中的编程漏洞,因此对于绝大多数防火墙来说,这种攻击是可以绕过的。虽然数据库服务器的版本一直在更新,各种脚本语言本身的漏洞也越来越少,可是随着SQL注入技术的不断提高,只要Web应用系统或源码中仍然存在此类漏洞,就会潜伏着这种隐患。本文总结整理出多种SQL注入方式,并结合实例提出多种有效的防范SQL注入的方法,且稳定安全地运用于实际网站当中,为WEB网站保驾护航。
[1]胡昌振.网络入侵检测原理与技术[M].北京:北京理工大学出版社,2006.
[2]邓吉,曹轶,罗诗尧.黑客攻防实战入门[M].北京:电子工业出版社,2007.
[3]张勇,李力,薛倩.Web环境下SQL注入攻击的检测与防御[J].现代电子技术,2004,27(15):103-105.ZHANG Yong,LI li,XUE Qian.Detection and prevention of SQL injection attacksin Web environment[J].Modern electronic technology,2004,27(15):103-105.
[4]王云,郭外萍,陈承欢.Web项目中的SQL注入问题研究与防范方法[J].计算机工程与设计,2010,31(5):976-978.WANG Yun,GUO Wai-ping,CHEN Cheng-huan.SQL injection in the Web project research and prevention methods[J].Computer Engineering and Design,2010,31(5):976-978.
[5]刘文晋.远程渗透测试中的SQL注入攻击技术研究[D].北京:北京交通大学,2009.
[6]徐茹枝.针对SQL攻击的数据库防护系统的设计与研究[D].上海:华北电力大学,2010.
[7]张骏温.多功能SQL注入检测系统的实现及攻击防范方法研究[D].北京:北京交通大学,2009.
[8]徐寅昊.SQL注入及SQL Server的安全性研究 [D].华东师范大学,2009.
[9]张卓.SQL注入攻击技术及防范措施研究[D].上海:上海交通大学,2007.
[10]张超.SQL Server数据库入侵检测系统的研究[D].西安电子科技大学,2004.
[11]张博.SQL注入攻击与检测技术研究[J].信息安全与通信保密,2010(5):90-92.ZHANG Bo.SQL Injection Attack and Detection Technology[J].Information Security and Communications Privacy,2010(5):90-92.
[12]王菊.浅谈计算机网络安全[J].硅谷,2010(5):49.WANG Ju.Talk about computer network security[J].Silicon Valley,2010(5):49.
[13]王晓平.恶意代码的入侵检测技术研究[J].哈尔滨职业技术学院报,2010(3):124-125.WANG Xiao-ping.Research on the instruction detect system technology of the malicious code[J].Journal of Harbin Vocational&Technical College,2010(3):124-125.
[14]谢栋梁.浅谈SQL注入攻击与防范[J].中国西部科技,2010(2):20-21.XIE Dong-liang.Talk about the SQL injection attacks and prevention[J].Science and Technology of West China,2010(2):20-21.
[15]王希忠,王智,黄俊强.浅谈数据库注入攻击及其应对策略[J].信息技术,2010(2):120-124.WANG Xi-zhong,WANG Zhi,HUANG Jun-qiang.Database injection attacks and strategy for coping with it[J].Information Technology,2010(2):120-124.