一.引言
随着网络的普及和发展,基于Internet的各种系统也在各行各业中发挥着日益重要的作用。但由于计算机网络具有连接形式多样性、终端分布不均匀性和网络的开放性、互联性等特征,致使WEB系统易受黑客,恶意软件和其它不轨行为的攻击。而且,当其中涉及有关个人身份的隐私资料,或公司、学校等各种团体的敏感数据,甚至商业数据时,提高网络安全性尤为重要。本文将以WEB系统中的典型配置(Win2000 server+SQL+IIS5.0)为例,着重讨论WEB服务器的系统安全设置与SQL Injection的安全策略。
二.网络安全隐患分析及安全技术
通常,我们所说的网络安全是指:网络系统的硬件、软件及其系统中的数据受到保护,不会因为偶然或者恶意的攻击而遭到破坏、更改、泄漏,系统能够连续、可靠、正常地运行,网络服务不中断。因此,通常网络安全包括了系统安全和数据安全两个部分。同样,对网络地恶意攻击行为也可大致分为系统型攻击和数据型攻击。在网络安全中,各种硬件设施,防火墙都是必不可少的。除此之外,系统的安全设置及代码的数据安全性也是其中不可忽视的一部分,本文将对此作深入的讨论。具体分析如下:
1.系统安全设置
以Windows 2000 server + SQL Server 2000 + IIS5.0为例:相对而言,这是我们最常用的网络服务器配置。但是微软的漏洞层出不穷,补丁一个接一个。因此,加固系统安全就显得异常重要。
首先,应尽可能选择专用的Web Server服务器,在安装系统时应断开服务器的网络连接,并在此基础上安装Service Pack 3的补丁程序。打完补丁后修改注册表,首先禁止默认共享。在Windows 2000中,有一个“默认共享”,这是在安装服务器的时候,把系统安装分区自动进行共享,虽然对其访问还需要超级用户的密码,但这是潜在的安全隐患,从服务器的安全考虑,最好关闭这个“默认共享”,以保证系统安全。将键值: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparametersautoshareserver修改为0。
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparameters autosharewks修改为0。如果没有这两个键值,新建即可。注意,新建时选择“双字节值”。此外应禁止IPC$空连接,将键值 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa
estrictanonymous修改为1。
IPC$(Internet Process Connection)是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的权限,在远程管理计算机和查看计算机的共享资源时使用。利用IPC$,连接者甚至可以与目标主机建立一个空的连接而无需用户名与密码(当然,主机必须开了ipc$共享,否则是连接不上的),而利用这个空的连接,连接者还可以得到目标主机上的用户列表。
其次,针对IIS,要尽量避免把IIS安装在网络中的主域控制器上。因为在安装完IIS后,会在所安装的计算机上生成IUSR_Computername的匿名账户。这个账户会被添加到域用户组中,从而把应用于域用户组的访问权限提供给访问Web服务器的每个匿名用户,这样不仅不能保证IIS的安全性,而且会威胁到主域控制器。在安装完后,应运行IISLOCKD.EXE,该软件是微软发行的用于填补IIS漏洞的软件。但这并不足以保证IIS的安全,应对IIS做进一步的加固:
a.删除和停用IIS的示范程序和目录,这是IIS自带的程序和文件,也是进攻者对web系统进行攻击的一个途径。
条目
位置
IIS
?Inetpubiissamples
Admin Scripts
?InetpubAdminScripts
IIS Documentation
%systemroot%helpiis help
Data Access
?Program Filescommonfilessystemmsadc
b.为防止进攻者利用服务器的FTP设置和发送MAIL的功能对网站内容进行修改,如果服务器不需要FTP和发送MAIL, 可以删掉ftproot和mailroot 两个文件夹,并关掉相关服务。
c.为避免日志文件被修改或覆盖,需要设置IIS日志文件的访问控制权限:默认情况下,IIS的日志会在“%systemroot%system32logfiles”目录下。如果可能,可以将日志的路径换一个地方。推荐访问控制权限:Administrators (Full Control) ;System (Full Control) ;Everyone (RWC). 这个步骤将防止一些有恶意的用户通过删除日志信息来掩盖他的记录。
d.删除危险的脚本影射:例如:对.htr文件的映射,请求处理存在堆溢出漏洞,远程攻击者可以利用此漏洞得到主机本地普通用户访问权限。而对idq.dll,在处理某些URL请求时存在一个未经检查的缓冲区,如果攻击者提供一个特殊格式的URL,就可能引发一个缓冲区溢出。通过精心构造发送数据,攻击者可以改变程序执行流程,执行任意代码。成功地利用这个漏洞,攻击者可以远程获取"Local System"权限。因此,删除一些并不需要的脚本影射,可以将利用漏洞攻击的可能性降至最低:
脚本类型
映射
Web-based password reset
.htr
Internet Database Connector
.idc
Server-Side Includes
.stm .shtml .shtm
Internet Printing
.printer
Index Server
.ida .idq .hta
2.数据攻击
以下主要总结了针对SQL Injection 的安全防范策略及对SQL Server的设置。所谓SQL Injection,就是指利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。在利用Web 脚本语言(ASP,PHP)做前台+数据库做后台的WEB系统中,为达到与用户交互的目的,就不可避免的有一些东西是来自用户提交的信息,如用户的登陆信息,查询字符串,或用户可以远程修改的资料等等。这些信息往往可能被攻击者利用,将SQL语句篡改成其它组合语句,以达到其攻击目的。
这里,我们举一个简单的例子:
dim conn
dim rst
username=request.querystring("username")
password=request.querystring("password")
set conn=Server.CreateObject("ADODB.Connection")
conn.open strConn ‘数据库连接字符串略
set rst=conn.execute("select * from login where username=‘" & username & "‘ and password=‘"
& password "‘")
if not rst.eof then
response.write "log in"
else
response.write "failed"
end if
rst.close
conn.close
其中,实施SQL Injection的关键代码如下:set rst=conn.execute("select * from login where username=‘" & username & "‘ and password=‘" & password "‘")
在数据库中,我们在表login中定义username=user , password= pwd。如果在登录界面输入正确,则username , password 嵌入到SQL语句中,组成的URL为:http://localhost/test.asp ? username=username&password=password
如果,入侵者提交这样的URL又会怎样呢?http://localhost / test.asp ? username=username&password=any ‘or 1=1--
结果,组成的SQL为:select * from login where username=‘username‘ and password=‘any‘ or 1=1--‘
而1=1永远成立,--后面的东西将被忽略。所以,不管正确的密码是什么,这个语句返回的都将是login. 这就是最典型的SQL Injection,也是较为简单的一种。SQL Injection的威胁性也不止于此,还有诸如:得到后台数据库信息、读取数据库中的数据,甚至获取系统信息,修改注册表等。根据以上特点,我们提出如下的防范措施:
首先,SQL Injection通常在与用户交互时发生,那么对用户的输入进行严格的过滤是非常重要的,尤其是对单引号、双引号以及“――”等符号。而且不仅是对QUERY_STRING环境变量的过滤,还要对所有的表单提交的数据以及用户可以通过修改来控制的下拉菜单、按钮等所有的交互数据进行过滤。同时,考虑到很多恶意的攻击可能会结合一些数据的组合来绕开这种过滤方法。因此,可以采用一种更安全的方法,进行一些安全替换等。比如:将单引号替换为两个单引号input = replace (input,” ’ ”,” ’ ’ ”)但是,仅从程序的角度来过滤是不够的,还需要结合其它的安全手段,比如:使用防火墙过滤掉进入80端口的单引号、双引号以及“――”等特殊符号。此外,还要对SQL Server 进行必要的安全配置,删除一些存储过程:
1.直接运行系统命令的存储过程:xp_cmdshell 。xp_cmdshell是进入操作系统的最佳捷径,是数据库留给操作系统的一个大后门。
2. 删除访问注册表的存储过程,某些注册表存储过程甚至能够读出操作系统管理员的密码来:xp_regaddmultistring, xp_regdeletekey, xp_regdeletevalue, xp_regenumvalues, xp_regread, xp_regremovemultistring, xp_regwrite 。
3.OLE存储过程:Sp_OACreate, Sp_OADestroy, Sp_OAGetErrorInfo, Sp_OAGetProperty, Sp_OAMethod, Sp_OASetProperty, Sp_OAStop
4.其他有一定安全隐患的存储过程:如xp_servicecontrol, xp_stopmail, xp_startmail, xp_perfmonitor, xp_unc_to_drive, xp_perfend, sp_sdidebug, xp_availablemedia, xp_deletemail, xp_dirtree, xp_dropwebtask, xp_dsninfo,等。
其实在多数应用中根本用不到多少系统的存储过程,而SQL Server的这么多系统存储过程只是用来适应广大用户需求的,所以请删除不必要的存储过程,因为有些系统的存储过程能很容易地被人利用起来提升权限或进行破坏。在删除这些存储过程的之前,先备份。如果系统不能正常运行,则恢复它。
三.结语:
网络安全技术是网络安全管理的重要内容,合理的系统及IIS配置能够增强网络安全。同时,代码的安全及防火墙的合理配置也是不可忽视的内容。文中所提及的技术已在某些高校的就业管理系统中得到应用。实践证明,这些技术是可行和有效的。同时,虽然本文是针对Win2000 server+SQL+IIS5.0做的探讨,但也可以有选择地应用于其它的服务器配置。