不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令
作者: 来源: 添加日期:2008-5-19 11:18:56
我的BLOG里有一篇文章介绍了关于SQL注入的基本原理和一些方法。最让人感兴趣的也许就是前面介绍的利用扩展存储过程xp_cmdshell来运行操作系统的控制台命令。这种方法也非常的简单,只需使用下面的SQL语句:
EXEC master.dbo.xp_cmdshell 'dir c:\'
但是越来越多的数据库管理员已经意识到这个扩展存储过程的潜在危险,他们可能会将该存储过程的动态链接库xplog70.dll文件删除或改了名,这时侯许多人也许会放弃,因为我们无法运行任何的cmd命令,很难查看对方计算机的文件、目录、开启的服务,也无法添加NT用户。
对此作过一番研究,后来我发现即使xp_cmdshell不可用了,还是有可能在服务器上运行CMD并得到回显结果的,这里要用到SQL服务器另外的几个系统存储过程:sp_OACreate,sp_OAGetProperty和sp_OAMethod。前提是服务器上的Ws cript.shell和s cripting.FileSystemObject可用。 sp_OACreate 在 Microsoft? SQL Server? 实例上创建 OLE 对象实例。 语法 sp_OACreate progid, clsid, objecttoken OUTPUT [ , context ] sp_OAGetProperty 获取 OLE 对象的属性值。 语法 sp_OAGetProperty objecttoken, propertyname [, propertyvalue OUTPUT] [, index...] sp_OAMethod 调用 OLE 对象的方法。 语法 sp_OAMethod objecttoken, methodname [, returnvalue OUTPUT] [ , [ @parametername = ] parameter [ OUTPUT ] [...n]]
思路: 先在SQL Server 上建立一个Ws cript.Shell,调用其run Method,将cmd.exe执行的结果输出到一个文件中,然后再建立一个s cripting.FileSystemObject,通过它建立一个TextStream对象,读出临时文件中的字符,一行一行的添加到一个临时表中。
以下是相应的SQL语句
CREATE TABLE mytmp(info VARCHAR(400),ID IDENTITY (1, 1) NOT NULL) DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400)
|