|
mantis帐号更新SQL注入缺陷
涉及程序:
SQL Server 2000
描述:
Distributor SQL Server 2000 执行任意指令缺陷
详细:
在一台 SQL 服务器上,一个存储进程是由一系列可写入一次,运行多次的 SQL 请求组成。在一台担任'public'角色的 SQL Server 2000
上有一个内部存储进程,此内部存储进程有权限在用户输入递交给 xp_cmdshell 进程前运行可能无法递交的输入数据。xp_cmdshell
扩展存储进程在运行操作系统指令时,具有低级权限的恶意用户可能能够在程序中嵌入并运行他们选择的任意指令。
如果将一台 SQL 服务器被配置成 distributor , 那么它就能在不同服务器之间进行数据复制,一个具有低级权限的恶意用户能够运行 'sp_MScopyscript'
存储进程,并且嵌入任意指令,在 SQL Server 用户的安全上下文(security context)中运行。如果 SQL Server
是作为一个本地系统运行,攻击就会失败。其原因就是用户提供的指令在运行之前,服务器必须要先在 distributor
上建立一个网络共享目录,而本地系统帐号在网络上是没有这种权限的,自然相应的存储进程也是不能进行的。如果服务器是以域用户的权限运行,就能执行"make
directory"指令进行数据复制。一旦指令可执行,存储进程就会嵌入用户提供的参数 @scriptfile 到指令中,如下面
sp_MScopyscript 文本中所示:
select @cmd = N'copy "' + @scriptfile + N'" "' + @directory + N'"'
exec @retcode = master..xp_cmdshell @cmd, NO_OUTPUT
如果恶意攻击者提供一个畸形的 @scriptfile 参数将能运行任意指令:
use master
declare @cmd nvarchar(4000)
exec sp_MScopyscriptfile N'c:\autoexec.bat" c:\cp.txt&echo hello >
c:\ccc.bbb & echo "hello',@cmd OUTPUT
print @cmd
上面的这个请求将能拷贝 autoexec.bat 文件到 cp.txt 中,但并不会发出“hello”回应给文件 ccc.bbb 。
如果服务器是以管理员权限运行,那么攻击者几乎能嵌入任何指令。如能另外建立一个新的用户,并将其添加到管理员组中。
攻击方法:
如果恶意攻击者提供一个畸形的 @scriptfile 参数将能运行任意指令:
use master
declare @cmd nvarchar(4000)
exec sp_MScopyscriptfile N'c:\autoexec.bat" c:\cp.txt&echo hello >
c:\ccc.bbb & echo "hello',@cmd OUTPUT
print @cmd
上面的这个请求将能拷贝 autoexec.bat 文件到 cp.txt 中,但并不会发出“hello”回应给文件 ccc.bbb 。
解决方案:
下载补丁:
Microsoft SQL Server 7.0
http://www.microsoft.com/Release.asp?ReleaseID=Q327068
Microsoft SQL Server 2000
http://www.microsoft.com/Release.asp?ReleaseID=Q316333
临时解决方案:
* 对 SQL Server 进行配置,禁止不信任用户去载入和运行他们创建的任何数据库请求。另外,在运行任何数据库请求之前必须先过滤。
* 将 SQL Server 配置为缺省在最低权限用户的 security context 中运行。
|