APP下载

网站数据库SQL注入及防范

2010-04-11陈学平

制造业自动化 2010年10期
关键词:攻击者页面加密

陈学平

CHEN Xue-ping

(重庆电子工程职业学院 技师学院,重庆 401331)

网站数据库SQL注入及防范

Web database and preventing SQL injection

陈学平

CHEN Xue-ping

(重庆电子工程职业学院 技师学院,重庆 401331)

SQL注入是一种入侵WEB服务器的方法.当网站应用程序对接收到的数据没进行严格过滤时,它便有可能存在SQL注入漏洞.文中将介绍入侵者利用SQL注入方法入侵WEB服务器的思路,并且给出相应的防御方法。通过在实际项目中的使用,能够很好的进行主动防范,具有较高的实用价值。

数据库安全;SQL注入;SQL防范

1 网站数据库的安全

对于采用“虚拟主机”的方式建立的中小型网站,其后台数据库绝大多数采用Access数据库。如果有人通过各种方法获得或者猜到数据库的存储路径和文件名,则该数据库可以被下载到本地。

为了防止被非法下载和访问,可采取以下措施:

1)改变数据库名称。为数据库文件起个复杂的非常规的名字,并放在几层目录下。所谓“非常规”,就是说如果有个数据库要保存的是有关电子商店的信息,不把它命名为“eshop.mdb”,而是起个比较怪的名称,如d34ksfslf.mdb,再放在如/kdslf/i44/studi/ 的几层目录下,这样黑客要想通过猜的方式得到Access数据库文件就比较困难了。

2)不把数据库名写在程序中。许多人都把DSN写在程序中,比如DBPath= Server.MapPath("cmddb.mdb")conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath 假如万一给人拿到了源程序,Access数据库的名字就一览无余。因此建议在ODBC里设置数据源,再在程序中这样写:conn.open "shujiyuan"。

3)改变数据库文件的扩展名。如把abc134.mdb改为abc134.asp,这样在ASP文件及数据库操作中仍然可以正常使用。但在非法访问者看来,该文件已不是数据库文件了。

4)加密Access数据库文件。选取"工具→安全→加密/解密数据库,选取数据库(如employer.mdb),然后按“确定”按钮,会出现"数据库加密后另存为"的窗口,存为employer1.mdb。接着,employer.mdb会被编码,然后存为employer1.mdb。要注意的是,以上的方法并不是对数据库设置密码,而只是对数据库文件内容加密,目的是为了防止他人使用别的工具来查看数据库文件的内容。接下来为数据库设置密码,首先打开经过编码的employer1.mdb,在打开时,选择"独占"方式。然后选取功能表的"工具→安全→设置数据库密码",输入密码即可。为employer1.mdb设置密码之后,如果再使用Access数据库文件时,则Access会先要求输入密码,验证正确后才能够启动数据库,可以在ASP程序中的connection对象的open方法中增加PWD的参数来访问有密码保护的数据库文件,

例如:

param="driver={Microsoft AccessDriver(*.md b)};Pwd=yfdsfs"param=param&";

dbq="&server.mappath("employer1.mdb")conn.open param

这样即使别人得到了employer1.mdb文件,没有密码是无法看到employer1.mdb的内容。

综合使用上述方法,数据库被非法下载的可能性就会降低。

2 SQL注入攻击的原理

许多动态网站在编写程序时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户通过向数据库提交一段精心构造的SQL查询代码,(一般是在浏览器地址栏进行,通过正常的www端口访问)根据程序返回的结果,收集网站与数据库的信息,进而非法获得网站数据库中的敏感信息或向其中添加自定义数据,这就是SQL Injection,即SQL注入攻击。SQL注入攻击使用简单,危害大。被攻击成功的网站往往被攻击者掌握最高权限,可任意增删数据。

为了说明SQL注入攻击的原理,可在本地网站上http://localhost/进行测试。

http://localhost/show.asp?ID=123是一个正常的网页地址,将这个网址提交到服务器后,服务器将进行类似Select * from 表名 where 字段="&ID的查询(ID即客户端提交的参数,本例是即123),再将查询结果返回给客户端,如果在这个地址后面加上单引号’,服务器会返回下面的错误提示:

Microsoft JET Database Engine 错误 '80040e14'

字符串的语法错误 在查询表达式 'ID=123'' 中。

/show.asp,行8

从这个错误提示我们能看出下面几点:

1)网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。

2)程序没有判断客户端提交的数据是否符合程序要求。

3)该SQL语句所查询的表中有一名为ID的字段。

除了上述介绍的在页面地址栏中加单引号“’”的方法判断可否注入外,还可以在页面地址后面分别加入“and 1=1 ”和“and 1=2”来测试网站能否注入,这就是经典的1=1、1=2测试法,通过其返回结果判断能否注入:

1)http://localhost/show.asp?id=123

2)http://localhost/show.asp?id=123 and 1=1

3)http://localhost/show.asp?id=123 and 1=2

可以注入的表现:

1)正常显示(这是必然的,不然就是程序有错误了)

2)正常显示,内容基本与①相同

3)提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空(程序加了on error resume next)

不可以注入就比较容易判断了,1)同样正常显示,2)和3)一般都会有程序定义的错误提示,或提示类型转换时出错。

不同的数据库的函数、注入方法都是有差异的,通常在注入之前,攻击者还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer。

SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以直接从出错信息获取,方法如下:

http://localhost/show.asp?id=123 and user>0

这句语句的前面的部分是正常的,重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示类似于:将nvarchar值 ”abc” 转换数据类型为 int的列时发生语法错误,其中,abc正是变量user的值,这样,很容易就得到了数据库的用户名。

如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?攻击者可以从Access和SQLServer和区别入手,Access和SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。

在确认可以注入的情况下,使用下面的语句:

http://localhost/show.asp?id=123? and (select count(*) from sysobjects)>0

http://localhost/show.asp?id=123? and (select count(*) from msysobjects)>0

如果数据库是SQLServer,那么第一个网址的页面与原页面http://localhost/show.asp?id=123是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。

如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。

3 防范SQL注入攻击

对于存在着SQL注入攻击漏洞的网站,攻击者可以通过专用工具或手工构造特殊代码不断猜测尝试,获得数据库名、表名、表中的字段名称,甚至是具有系统管理权限的用户帐号和密码、上传病毒、木马或恶意文件,给网站带来巨大危害。下面讲述如何防止SQL注入。

1)设置ASP错误提示

SQL注入入侵是根据IIS给出的ASP错误提示信息来入侵的,如果把IIS设置成不管出什么样的ASP错误,只给出一种错误提示信息,即http 500错误,那么攻击者就没办法直接得到网站的数据库信息,也就很难确定下一步的攻击目标了。具体设置参见图1。主要把500:100这个错误的默认提示页面 C:WINDOWSHelpiisHelpcommon500-100.asp改成自定义的C:WINDOWSHelpiisHelpcommon500.htm即可,这时,无论ASP运行中出什么错,服务器都只提示HTTP 500错误。

图1 IIS出错信息设置

但是这样设置一个不好的地方是程序员编写的代码出错时,服务器不给出详细的错误提示信息,会给程序调试带来很大的不便。不过,服务器毕竟不是测试代码的地方,应坚持安全稳定第一,这样设置也是无可厚非的,事实上许多服务器的出错信息都是如此设置。

2)过滤敏感字符

在程序中对客户端提交的数据进行检查,如果输入中存在着特殊字符(如’、<、>、=等),或者输入的字符中含有SQL语言中的命令动词(如insert、select、update等),就认为是SQL注入式攻击,系统立即停止执行并给出警告信息或者转向出错页面。

下面是防止注入式攻击的asp代码,使用时加入到相应的asp文件中即可。该代码并没有实际记录攻击者的相关信息,只是吓唬而已,如有必有,完全可以把攻击者的数据记录到特定的文件中,以备查看。

常见的是利用MD5进行加密处理,用MD5加密的数据不能被反向解密,即使看见了加密后的密文也不能得到原始数据。使用时,把用VBScript实现MD5算法的文件md5.asp包含在文件中,然后用md5(user_password)的形式调用,即可得到加密后的密文。如:

由于篇幅所限,上述md5.asp文件省略。

4 结束语

我们上面介绍了网站数据库的SQL注入防范方法,我们平常在网站制作完成后,可用NBSI、HDSI、DFomain、《啊D注入工具》等网页注入工具对网站进行检测,如果不能被注入,才可以正式发布运行。

[1] 沈昌样.网络安全与信息战.网络安全技术与应用.2001.

[2] 陈学平,余永洪.中小型网站建设与管理.第二版,2009.

TH166

A

1009-0134(2010)10(上)-0192-04

10.3969/j.issn.1009-0134.2010.10(上).60

2009-12-28

陈学平(1967 -),男,副教授,研究方向为电子、通信、计算机网络等。

猜你喜欢

攻击者页面加密
刷新生活的页面
一种新型离散忆阻混沌系统及其图像加密应用
答案
让Word同时拥有横向页和纵向页
一种基于熵的混沌加密小波变换水印算法
正面迎接批判
正面迎接批判
加密与解密
有限次重复博弈下的网络攻击行为研究
我国古代对军事信息的加密与传递