SQL注入攻击与防范研究
2011-08-15天津市信息中心应用处刘云志
天津市信息中心应用处 刘云志
SQL注入攻击与防范研究
天津市信息中心应用处 刘云志
SQL注入攻击是指攻击者利用提交专门设计的数据库查询代码,欺骗服务器执行恶意的SQL命令,从而获取用户密码等保密信息,甚至获取主机控制权限的行为。SQL注入攻击利用的是SQL语法,由于其广泛性、易学性和难以捕获性已经逐渐成为互联网上的主流黑客攻击方式。目前,互联网上的多种Web应用程序都面临SQL注入的危险,多家网站都曾经或正在被SQL注入攻击,这种攻击目前正在加速泛滥。统计表明,在互联网上的Web服务器遭受的各类应用层攻击中,SQL注入占有极大的比例。
由于多数程序员不了解SQL注入漏洞的知识,目前互联网上网站经常遭受SQL注入攻击。本文,笔者针对PHP+MySQL型和ASP+SQLServer型Web程序的SQL注入攻击防范措施进行了详细阐述,并给出了预防SQL注入漏洞的方法,有助于提高Web应用程序员的安全意识和Web程序的安全性。
一、SQL注入原理
1. SQL注入原理。SQL注入攻击是指黑客在用户交互端精心编写一些SQL语句,把特殊的SQL指令语句插入到系统实际SQL语句中并执行它,从而获取主机控制权限的攻击方法。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面上的防火墙不会对SQL注入发出警报。以PHP语言为例,如果用户的输入能够影响脚本中SQL命令的生成,那么很可能在添加了单引号、#号等转义命令字符后,能够改变最终生成的SQL命令。
2. 举例说明。如果程序员在编程时没有对用户输入的变量$U和$P进行合理的限制,当攻击者把用户名输入为admin’#的时候,输入字符串中的单引号和脚本中的单引号形成配对,而输入字符串中的“#”号对于mysql语言来说是行注释符,后边的语句将被当做注释处理掉。这使攻击者可以轻易绕过身份验证机制,因此,没有正确密码也能看到管理员的信息。对于SQL注入攻击,很多程序员对它仍然没有足够的重视,编写的网站中遗留了大量SQL注入攻击漏洞。加上许多专门的SQL注入软件(如NBSI)的“蓬勃发展”,使得一个既不懂编程又不懂SQL的人,只要知道如何操作这个软件就可以轻而易举地入侵一家网站。
二、SQL注入攻击的特点
1.广泛性。SQL注入攻击利用的是简单的SQL语法,因此所有基于SQL语言标准的Web应用程序都可能成为SQL注入攻击的目标。如果没有对输入的SQL语句做严格的技术处理,理论上都会存在SQL注入漏洞安全隐患。市场上主流的Web应用程序均发现存在SQL注入漏洞的问题。
2.危害大。通过SQL注入攻击可以控制整个Web应用系统,在不经授权的情况下对数据做任意地修改,甚至恶意篡改网页的内容,破坏性极大。
3.技术要求低。目前互联网上出现了许多SQL注入攻击工具,如明小子、桂林老兵等都是非常出名的攻击工具。攻击者无需专业知识,直接利用此类工具软件便可随意地对存在SQL注入攻击漏洞的网站实施攻击。
三、SQL注入攻击检测与防范
目前针对Web服务器的SQL注入攻击技术层出不穷,但其内部机理都是利用畸形的SQL语句通过客户端浏览器与服务器之间的共享连接来实现绕过认证获取敏感信息。如何让系统管理者采取有效的防范措施阻止内部信息的泄露,将整个系统的威胁降至最低,是目前服务器防守的关键。
1. SQL注入攻击检测方法。SQL注入攻击检测分为入侵前的检测和入侵后的检测,入侵前检测可以手工测试也可以通过软件检测,入侵后检测主要是针对日志的检测。
(1)数据库检查。使用HDSI、NBSI和Domain等SQL注入攻击软件工具进行SQL注入攻击后,都会在数据库中生成一些临时表。通过查看数据库中最近新建表的结构和内容,就可以判断是否曾经发生过SQL注入攻击。
(2)IIS日志检查。在Web服务器中如果启用了日志记录,则IIS日志会记录访问者的IP地址、访问文件等信息,SQL注入攻击往往会大量访问某一个页面文件(存在SQL注入点的动态网页),且日志文件也会急剧增加。
2. 一般SQL注入攻击的防范方法。
(1)IIS服务器安全设置。攻击者常用错误信息判断SQL漏洞是否存在,可以修改IIS的返回信息,使得所有错误返回一样的信息,攻击者无从获取网站信息。可以修改C:WINDOWSHelp iisHelpcommon目录下的500-100.asp文件为统一格式的500.htm。对于静态网站,一般不设置脚本可执行权限,动态网站也只设置纯脚本权限。对于用户上传的文件设置为无可执行权限,上传文件夹不放置系统配置文件。IIS如无匿名登录需求,则可取消该项服务。
(2)功能代码端设置。程序员要习惯将应用系统中的密码字段进行加密(如最常见的MD5加密),这不仅仅是为了隐藏用户信息,尊重用户隐私,更重要的是提高系统的安全性。也就是在程序中要对用户输入的信息进行检验,以达到SQL攻击的防御效果。目前这种检验方法一般有2种:替换或删除敏感字符串,在服务器正式处理前对提交数据进行检验。
(3)SQL Server安全配置。用于程序连接数据库的用户不应使用服务器角色组,而应使用数据库用户角色组成员。SA级别的权限是不能随便配置的,黑客SQL注入得手后调用xp_cmdshell命令就可以得到系统的最高权限。最好的方法是只给予db_Reader和db_ Writer权限,遇到有需要备份的用户最好另行新建用户。SQL Server可以精确地设置某一数据库中各个表的select、update、delete等操作的权限,开发人员应根据应用系统的不同功能要求,合理地配置好这些权限。
(4)对系统一级的设置。例如,使用防火墙关闭TCP1433和UDP1434端口对外的连接,给系统和SQL Sevrer甚至IIS打上最新的补丁,及时检查系统是否出现弱口令用户,一旦发现要及时修改密码等。