作为网络管理员,我想大家对SQL Server 2000一定不会陌生,它是一个C/S模式的强大的关系型数据库管理系统,是一种应用领域十分广泛的中小型网络数据库,到处都可以看到它的身影。
不过,在带来方便的同时,它也带来了许多安全隐患。本文中,笔者将着重介绍一下SQL Server 2000中会带来安全风险的一些存储过程。
危险的存储过程
存储过程是存储在SQL Server中预先写好的SQL语句集合,主要分为三类,即系统提供的存储过程、用户定义的存储过程和扩展的存储过程。
其中,系统提供的存储过程是在安装SQL Server时创建的存储过程,名字以“sp_”开头。用户定义的存储过程是用SQL Server的使用者编写的存储过程。扩展存储过程则是对动态链接库(DLL)函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的。
与一般动态链接库不同的是,扩展存储过程直接运行在SQL Server分配的内存地址内,其中危险性最高的扩展存储过程就是xp_cmdshell了,它可以执行操作系统的任何指令,如:
exec master..xp_cmdshell ''net user netadmin 111 /add''
exec master..xp_cmdshell ''net localgroup administrators netadmin /add''
上述命令可以在查询分析器中执行,执行后就在系统中建立了一个名为netadmin、密码为111的系统管理员,但执行上面的命令需要一定的权限。
sa是SQLServer的管理员账号,拥有最高权限,可以执行扩展存储过程,并获得返回值。所以,如果入侵者得到了sa的密码,就可能对系统产生严重威胁。
至于得到sa密码的方法则有很多种,比如通过Sniffer获得sa的加密密码,然后通过密码对照表(网上可以找到)得到sa的明文密码,再比如通过SQL注入得到sa密码或者使用sp_password修改sa密码,还有可以挂密码字典进行暴力破解,在这里就不一一叙述。
除了我们比较熟悉的xp_cmdshell外,还有一些存储过程需要我们特别注意:
1、xp_dirtree,这个存储过程用来列出对应目录下的文件和文件夹。
2、xp_regread,这个扩展存储过程可以读取注册表指定的键里指定的值。
3、xp_regdeletekey,这个扩展存储过程可以删除注册表指定的键。
4、xp_regdeletevalue,这个扩展存储过程可以删除注册表指定的键里指定的值。
5、xp_regwrite,这个扩展存储过程可以写入注册表指定的键里指定的值。
6、sp_OACreate、sp_OADestroy、sp_OAGetErrorInfo、sp_OAGetProperty、sp_OAMethod、 sp_OASetProperty、sp_OAStop等,这些OLE自动存储过程也都很危险,其危险性一点也不比xp_cmdshell 小。不过删除后会造成企业管理器中的某些功能无法使用。
有效的解决方法
如果可以确定上面这些存储过程在应用中确实不需要,可以使用sp_dropextendedproc命令删除掉,比如在查询分析器中执行:
exec sp_dropextendedproc ''xp_cmdshell''
在需要时再进行恢复即可,命令为:
exec sp_addextendedproc ''xp_cmdshell'',''Xplog70.dll''
如果还担心被删除的存储过程被入侵者恢复,那就把存放这些函数的动态链接库删除掉(具体这些存储过程都存放在哪些动态链接库里,可以使用eXeScope这个软件看一下)。当我们需要的时候再Copy回去就可以了。
其实,最好的解决方法是应用程序或网站在与后台数据库SQL Server 2000进行连接时,尽量不要用sa进行连接。我们可以建一个权限比较低的用户与数据库进行连接,同时还要给sa设一个健壮的密码,这样才能从根本上解决问题。
文章转载地址:http://www.365master.com/kt_article_show.php?article_id=1940&categ_code=10041003