新疆 孙俊德
SQL注入攻击与防范技术
新疆 孙俊德
通过对目前常见的SQL注入攻击的行为分析,网站管理人员从中了解并采用相关的防范技术,保障网站数据库的安全。本文通过对SQL注入攻击过程的分析,有针对性提出如何增强网站抗SQL注入攻击的措施。
SQL注入;黑客;网站安全
SQL注入攻击可以算是互联网上最为流传最为广泛的攻击方式,许多企业网站先后遭此攻击。所谓SQL注入(SQL Injection),就是利用程序员对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,查询数据库。
(1)一些网站的管理登陆页面对输入的用户名和密码没有做SQL过滤,导致网站被攻击。
这里假设一个没有严格过滤SQL字符的管理登陆界面。事实上黑客并不需要知道用户名和密码,那么黑客只需在用户名里面输入"'or 1=1--",密码任意输入,提交后,系统认为用户名为空('')或者(1=1恒成立),后面不执行(--),就无需验证密码直接进入后台。
(2)下面的查询语句在有注入漏洞的服务器上被恶意利用也会导致严重后果。
String SqlStr=”Select*from customers where CompanyName like'%"+textBox1.Text+"%"';
这样的字符串连接可能会带来灾难性的结果,比如用户在文本框中输入:
a'or1=1
那么SqlStr的内容就是:
select*from customers where CompanyName like'%a'or1=1--%'
这样,整个customers数据表的所有数据就会被全部检索出来,因为1=1永远true,而且最后的百分号和单引号被短横杠注释掉了。
如果用户在文本框中输入:
a'EXEC sP_addlogin'John','123'EXEC sP_addsrvrolemember'John','sysadmin'--
那么SqlStr的内容就是:
select*from customers where CompanyName like'%a'EXEC sp_addlogin'John','123'
EXECsp_addsrvrolemember'John','sysadmin'--
该语句是在后台数据库中增加一个用户John,密码123,而且是一个sysadmin账号,相当于sa的权限。
如果用户这时在文本框中输入:a'EXECxp_cmdShell('formatc:/y')--运行之后就开始格式化C盘!
(3)通过注入获得管理员账户密码。
一个正常的网址http://localhost/lawjia/show.asp?ID=101,将这个网址提交到服务器后,服务器将进行类似Select*from表名 where字段="&ID的查询(ID即客户端提交的参数,本例是即101),再将查询结果返回给客户端。
当某人知道网站管理员帐号存储在表login中,其用户名为admin,如果想知道管理员密码,此时他可从客户端接着提交这样一个网址:
http://localhost/lol/show.asp?ID=101 and(Select password from login where user_name='admin')>0
返回的出错信息如下:
MicrosoftOLEDBProvider forODBCDrivers(0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server] 将 varchar 值 '!@huway**a'转换为数据类型为int的列时发生语法错误。
/lol/show.asp,第 27 行
黑体字部分即为返回密码
(4)通过工具进行注入攻击测试。
如何判断一个网站能否被注入,首先找到注入点,像上面提到的“/show.asp?ID=101”就是一个注人点,很多新闻系统的新闻显示页面、产品发布显示页面都有类似ID=101的标志,在ID=101后面直接输入and 1=1,如果没有出错,仍然返回原先显示页面,这就是一个注人漏洞,如果返回您的网址不合法,显然己经做了SQL过滤。
显然人工猜测表名是一件麻烦事情,但大多存放管理员的账户的表通常为addmin,guan,login这样简单单词,通过黑客工具附带字典,先确定表的名称,接着猜测字段,然后穷学查询字段第一位、第二、第三位…,直到全部出来,借助工具,对有注人漏洞网站攻击成功率可达60%以上。注入工具有NBSI、啊 D、Domain 等。
以上仅是对SQL攻击的粗略分类。但从技术上讲,如今的SQL注入攻击者们在如何找出有漏洞的网站方面更加聪明,也更加全面了。出现了一些新型的SQL攻击手段。黑客们可以使用各种工具来加速漏洞的利用过程。
2.1 使用参数化的过滤性语句
要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。下面是一个使用Java和JDBCAPI例子:
PreparedStatement prep=conn.prepareStatement("SELECT*FROM USERS WHEREPASSWORD=?");
prep.setString(1,pwd);
总体上讲,有两种方法可以保证应用程序不易受到SQL注入的攻击,一是使用代码复查,二是强迫使用参数化语句的。强迫使用参数化的语句意味着嵌入用户输入的SQL语句在运行时将被拒绝。不过,目前支持这种特性的并不多。如H2数据库引擎就支持。
2.2 还要避免使用解释程序,因为这正是黑客们借以执行非法命令的手段。
2.3 防范SQL注入,还要避免出现一些详细的错误消息,因为黑客们可以利用这些消息。要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。
2.4 使用专业的漏洞扫描工具。但防御SQL注入攻击也是不够的。攻击者们目前正在自动搜索攻击目标并实施攻击。其技术甚至可以轻易地被应用于其它的Web架构中的漏洞。企业应当投资于一些专业的漏洞扫描工具,如大名鼎鼎的Acunetix的Web漏洞扫描程序等。一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找网站上的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。
建议Web应用程序的程序员们对其代码进行测试并打补丁,虽然SQL注入漏洞被发现和利用的机率并不太高。但近来攻击者们越来越多地发现并恶意地利用这些漏洞。因此,在部署其软件之前,开发人员应当更加主动地测试其代码,并在新的漏洞出现后立即对代码打补丁,做为网站管理人员要在Web应用程序开发过程的所有阶段实施代码的安全检查。首先,要在部署Web应用之前实施安全测试,这种措施的意义比以前更大、更深远。网站管理人员还应当在部署之后用漏洞扫描工具和站点监视工具对网站进行测试。
[1]马宜义.网络安全与病毒防范.上海:上海交通大学院出版社,2009.
[2]秦志兴,张凤荔.计算机病毒原理与防范[M].北京:人民邮电出版社,2007.
[3]张仁斌,李刚,等.计算机病毒与反病毒技术[M].武汉:武汉大学出版社,2006.
(编辑 吕智飞)
(作者单位:昌吉职业技术学院)