浅谈网站SQL注入攻击防护策略研究
2016-05-19李虎军
李虎军
摘要:针对动态网页生成时存在的安全漏洞,该文简要介绍了网站SQL注入攻击的原理、攻击常用方法,并在此基础上对如何防范对目标网站数据库系统进行注入攻击给出了一些防御方法,以期抵御网站所受的注入攻击,更好地保护Web网站安全和应用。
关键词:网站; SQL注入;攻击;数据库系统
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2016)08-0001-03
随着互联网的飞速发展,对网站进行SQL注入攻击的事件层出不穷。2009年2月,据称罗马尼亚黑客团伙利用数据库注入攻击技术分别攻击了F-Secure、BT.com、CNET.com等知名网站。为美国1万多家公司提供工资服务的美国PayChoice公司,在受到网站SQL注入攻击后暂时被迫关闭其全部网站。Open Web Application Security Project Top 10 for 2013报告称,注入漏洞攻击已成为十大网站攻击之首。
1 网站SQL注入攻击原理
网站SQL注入攻击,是别有用心的人先使用搜索引擎定位网页中包含的动态ASP脚本,测试目标网站的网页脚本是否存在数据库注入漏洞并确定注入点,最终试图遍历目标网站后台数据库的所有文本字段,获取目标数据库中用户名和密码,进而非法登录目标网站计算机系统,达到恶意目的。一旦攻击得逞,被攻击站点就会被入侵、泄密、破坏,甚至也可能成为恶意软件的分发点。网站注入攻击以网站数据库为目标,一般利用Web应用程序对特殊字符串过滤不完全的缺陷,通过精心构造的字符串达到非法访问网站数据库内容或在数据库中执行命令的目的。
假设有语句str="SELECT * FROM user WHERE name=' "+username+" ' and pwd=' "+PassWord+" '; " ,该语句含义是:将用户输入的用户名(存储在变量username中)和登录口令(存储在变量PassWord中)进行数据库检索验证,如果相应的用户名和登录口令正确,则该语句能返回正确的检索信息,否则,检索结果为空(意味着身份验证失败)。以下两种情况都可实现注入攻击。
如果将username赋值如下: username="1'or 1=1--",将PassWord赋值任意字符串,则程序在进行变量替换后,str中实际存放的字符串为:str="SELECT * FROM user WHERE name='1' OR 1=1-- and pwd=' 任意字符串'; "。表达式name='1' OR 1=1值为真,其后验证密码部分被注释掉,则strSQL中实际存放的字符串相当于:str="SELECT * FROM user ;",就相当于不需对用户输入的用户名和密码进行验证。
如果在正常浏览网页的URL地址http://xx.xx.xx.xx/abd.asp?id=KK后添加“and 1=1”时网页如果无变化,而当添加“ and 1=2”时网页出现错误,则说明该网页存在注入漏洞。当添加“and 1=(SELECT is_srvrolemember('sysadmin'))”时页面访问正常,则说明连接数据库的用户权限为sysadmin,可以执行数据库命令,表明存在注入权限为系统管理员漏洞。此时,如果添加的语句为“;exec master..xp_cmdshell 'net user test 123/add '--” ,则URL地址中包含的SQL语句就可以在数据库中创建一个名为test、登录口令为123的用户。黑客即可利用新建的用户text上传木马至目标主机,为后续非法攻击奠定基础。
2 网站SQL注入攻击
2.1 SQL注入漏洞与位置探测
一般来说,带有参数的动态网页并且此网页的生成需要访问数据库系统,则很有可能存在SQL注入漏洞。如果网站设计程序员安全意识不强,没有过滤掉一些输入的特殊字符,则存在SQL注入的可能性就非常大。通常在页面URL地址处添加“and 1=1”、“ and 1=2”以及单双引号等一些特殊字符,并通过网页浏览器所返回的信息来判断目标网站是否存在SQL注入漏洞。如果网站程序员对单引号进行了过滤,则攻击者还可以采用:如用SELect代替select、SELECT的大小写混合法;在IE中将输入的字符串变成UNICODE字符串进行输入,如将+换成%2b、将空格换成 %20的UNICODE法;把输入的字符用ASCII码代替,例如将字符A换成chr(65)的 ASCII码法。
2.2 判断网站后台数据库的相关信息
在进行SQL注入攻击前,需要先识别被攻击网站后台所用数据库管理系统的类型和版本。可以通过网站所用的开发语言判断后台数据库类型。例如基于ASP或者ASP.NET技术所开发的网站通常用Microsoft SQL SERVER作为网站后台数据库管理系统。也可通过网站的部署环境进行判断,如果是运行在Linux操作系统上的Apache应用服务器,则网站很可能使用的是MySQL数据库。如果网站开发者没有向浏览者屏蔽错误消息,则通过在URL中附加一些字符使网站后台数据库系统产生语法错误消息并将相应信息返回到访问页面,则攻击者可以根据返回的错误消息来判断是那类数据库管理系统。还可以利用不同数据库管理系统的独特SQL语法进行判断。例如, MySQL支持select 'a'+'b' 和select concat('a','b');Oracle数据库支持select 'a' ||'b'和select concat('a','b')。
判断出数据库管理系统类型之后,可通过查询语句获取版本信息。如果是MySQL数据库则可发送select version( )。也可通过判别系统表方式判断数据库类型,Access数据库的系统表是msysobjects,SQL Server数据库的系统表是sysobjects,系统变量有user和db_name( )。通过读取上述表和变量的方式判断网站后台数据库管理系统类型。通过http://xx.xx.xx.xx/abc.asp?id=KK and( select db_name( ))>0,可以得到目标网站当前连接的数据库名。获知了网站后台数据库的相关信息,为后续有针对性地采取对应入侵方式打下基础。
2.3 确定目标网站主机目录
为了上传木马程序到目标网站,需先找到目标网站的Web虚拟目录,并将木马程序上传其中,使木马程序得到运行,从而创建目标网站后门。通常有两种方法:
1)根据经验猜解。一般来说,Web虚拟目录可能是c:\inetpub\wwwroot或是d:\inetpub\wwwroot等,而可执行虚拟目录可能是c:\inetpub\scripts或是d:\inetpub\scripts等。
2)通过遍历目标网站主机的目录结构,分析相关数据发现目标主机的Web虚拟目录。可以利用xp_availablemedia获取当前所有驱动器;接着利用xp_subdirs获得子目录列表;然后利用xp_dirtree获得所有子目录的目录树结构。
2.4获取用户账户信息与口令
许多Web网站为了维护方便,提供了远程管理功能,对于不同用户有不同的访问权限。为了以合法用户身份登录目标网站,需要获取目标网站的用户名和登录口令。用户名与口令通常存储在数据库才一张表中。首先找到系统存放用户名和口令的表,这里假设该表名为Stable。
1)猜解表中用户名字段名和口令字段名。在Stable表中必定存在一个用户名字段和一个登录口令字段,只有首先得到这两个字段的名称,后续才能设法得到这两个字段的内容。
假设有:http://xx.xx.xx.xx/abc.asp?id=KK and( SELECT top 1 col_name (object_id('Stable'),1) FROM TestDB.dbo.sysobjects)>0,该注入语句是从系统表sysobjects中得到表Stable的第一个字段名。当与整数进行比较时,该URL访问异常,但在异常中却可以发现想要的字段名称。把col_name(object_id('Stable'),1)中的1依次替换为2、3、……就可以得到Stable表中所有的字段名称。
2)猜测用户名和口令
可以采用ASCII码逐字解码,先猜测字段的长度,然后异常猜测出每一位的值。以猜测用户名为例。http://xx.xx.xx.xx/abc.asp?id=KK and( SELECT top 1用户名字段FROM TestDB.dbo.Stable)=YY(YY=1、2、3、……),若YY为i值且abc.asp运行正常,则i就是第一个用户名的长度。
猜测用户名的第一个字符(猜测口令同理):http://xx.xx.xx.xx/abc.asp?id=KK and(SELECT top 1 ascii(substring(username,1,1) FROM TestDB.dbo.Stable)=XX,若XX为某i值且abc.asp运行正常,则i就是对应字符的ASCII码值。
通过上述操作,可获得目标网站的用户名与口令。
3 防御SQL注入策略
网站SQL注入攻击主要针对运行在目标计算机应用层的Web应用程序,因此对于绝大多数防火墙来说,这种攻击是“合法”的(使用合法的HTTP协议)。为更好地防御SQL注入攻击需要在设计网站、进行编程时进行完善。因此在设计网站、编写Web应用程序时,应遵循以下策略以减少SQL注入漏洞。
3.1 SQL注入攻击的检测
SQL注入攻击的检测分为网站被入侵前的检测和被入侵后的检测。被入侵前的检测,既可以采用手工方式,也可以采用SQL注入工具软件。对于被SQL注入攻击后的检测,主要通过对日志的检测来发现攻击活动。因为SQL注入攻击成功后,都会在网站的IIS日志和数据库系统中留下“痕迹”。 检测的目的是为预防SQL注入攻击。
1)数据库系统检查
使用NBSI、HDSI等软件进行SQL注入攻击后,都会在目标主机的数据库系统中生成临时表。通过查看目标主机的数据库系统中最近新建表的结构和内容,通常可以判断出是否被SQL注入攻击过。
2)Internet 信息服务(IIS)日志检查
如果网站主机系统启用了日志记录,则IIS 日志中存有访问者的IP地址、所访问文件等访问信息;SQL注入攻击者往往会大量访问某一个存在SQL注入漏洞的动态网页,则IIS日志文件内容会快速增加。通过查看IIS日志文件的大小变化以及IIS日志文件中的内容,也能判断是否被SQL注入攻击过。
3)通过其他相关信息进行判断
在SQL注入攻击成功后,攻击者通常会在目标主机系统中添加用户、开放远程服务以及安装运行木马等。可以通过检查系统用户账号、远程服务开启情况、系统最近产生的文件等信息来判断是否被入侵过。
3.2 参数化语句
ASP网站易受到SQL注入攻击的原因是攻击者将恶意的SQL语句以合法的字符串形式利用网站系统动态构造SQL语句的特点使后台数据库系统执行。大多数网站编程语言和数据库访问API允许使用占位符或通过绑定变量来向数据库系统的查询命令提供参数,而不仅仅是对用户的输入直接进行操作;即使用户输入的参数中含有分号、注释符号、SELECT等一些SQL关键字,也要被转义成一般字符进行处理,这种处理方式通常被称为参数化查询。此方法是一种较为安全的动态字符串构造方法,参数化查询可以避免网站URL中常见的SQL注入攻击问题。
3.3 过滤特殊字符
在SQL注入攻击前进行漏洞探测时,攻击者需要在提交的参数中包含一些特殊字符,在实施SQL注入时,SQL语句中往往需要包含“'”、“;”、“or”、“--”、“select”、“add”、“xp_”等字符。防范SQL注入攻击的最有效的方法是对用户的输入内容进行安全检查。根据参数的类型,将用户输入的单引号、双引号、分号、逗号、冒号、连接号等进行转换或过滤,可以防止很多SQL注入攻击。例如对单引号过滤,可以将单引号转换成两个单引号,此举将导致用户提交的数据在进行SQL语句查询时出现语法错误;也可以将单引号转换成空格,对用户输入提供数据进行严格限制。上述方法将导致SQL注入失败。
3.4 最小权限原则
为防止网站访问用户滥用权限,应该只给网页访问数据库系统所需的最小权限。如果网页不需要访问数据库中的某些表,则应该明确网页没有访问这些表的权限;如果网页只需要读权限,则应确认其无表的更改等权限。如果网页程序需访问数据库系统,则其不应使用sa、root、system等系统管理员账号,而应该使用普通用户账号,并且根据实际需要严格设置其权限。对于只读操作,则只分配select权限,而不要分配insert、update、delete等这些具有修改功能的权限。即便网站被攻击泄露了数据,数据也不会被破坏。特别注意,Web应用程序所使用的存储过程和函数的权限,也要遵循最小权限原则。运行在操作系统上的数据库应用程序也要被设置成最小权限。还应关闭数据库中的额外功能,例如在SQL SERVER中,应关闭xp_cmdshell以及xp_reg*等存储过程的运行。确保操作系统和数据库系统漏洞已得到修补,系统已更新了最新的补丁。
3.5规范化输入
攻击者也可以通过发送输入数据前对其进行编码,然后再对其进行解码和解释的方式,来达到攻击目的。对上述方式中所输入的数据进行验证是比较难处理的。例如在UNICODE中SQL注入常将双引号用"%u0022"表示。为规范化输入,可以通过白名单验证的方式过滤掉所有不符合规定的输入内容。但当SQL注入攻击字符串是符合格式要求的字符串时,就需要寻找编码方法或其他输入方法来保证接收的字符串是安全的。可以先将输入的字符串进行解码,当解码后的字符串中还存有经过编码的字符时,则认为该字符串为非法输入。另外,每种数据库管理系统都有一个字符转义机制来判断输入的内容是数据而不是代码,则可以对用户所有输入的字符串进行转义,那么数据库系统就不会混淆数据和代码,也就不易出现被SQL注入攻击了。
3.6 网站服务器设置
SQL注入攻击很多时候是根据目标服务器给出的错误信息进行判断、入侵的,网站服务器端配置应将错误提示信息的反馈功能关闭,使得攻击者只能进行盲注入,大大提高注入攻击的难度。同时,要利用IIS日志服务,及时发现SQL注入攻击痕迹。数据库名、表名、字段名的命名要避免采用默认或通用的名称,避免给注入者留下可乘之机。对系统的用户和角色合理授权,严格用户最小权限原则。 删除网站主机不使用的账户,防止攻击者通过这些账户来获得目标服务器上的数据和应用程序的访问权。系统必须使用强密码,以增加攻击者进行暴力攻击的难度。在网站服务器系统中适当设置假用户,诱骗攻击者,增加攻击难度。禁止将敏感性数据以明文存放在数据库中,通过哈希函数加密后存放,或通过RSA提供的加解密API在读取/写入数据时进行解密/加密处理,进行这样即使数据库被SQL注入漏洞攻击,也会减少泄密的风险。
将网站后台存放文本的目录的执行权限均设置为“无”,即使网站该目录被上传了木马,该木马也不能运行。将Web应用的根目录和虚拟目录转移到非系统分区,以防被目录遍历攻击。Web管理员必须通过本地登录方式管理Web服务器。经常使用漏洞扫描工具和网站监视工具对网站进行监测和查找漏洞,保护网站的安全。
4 结束语
本文从SQL注入攻击的基本原理和过程描述了SQL注入攻击可能对网站系统造成的各种破坏,以及相关攻击过程和手段,重点阐述了如何有效防范SQL注入攻击的策略和措施,以便有效防范SQL注入攻击,更好地保护Web网站安全。
参考文献:
[1] 黄景文.SQL注入攻击的一个新的防范策略[J].微计算机信息,2008(6):31-32.
[2] 查凯.基于标识的SQL注入攻击防御方法[J].信息安全与通信保密,2011(6):54-55.
[3] 黄健.计算机信息安全技术及防护[J].信息安全与技术,2012(4):83-85.