前言:
UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,其实就像使用本地MySQL函数如 user() 或 concat() 等。
那么我们该如何使用UDF文件呢?
在MySQL默认安装的里面是不存在这个文件的。
那么如果假设该文件存在被攻击者上传到路径:C:\phpStudy\MySQL\lib\plugin
(mysql>5.1 默认\lib\plugin
文件夹不存在)。
- 当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下
- 当 MySQL> 5.1 版本时,将 .dll 文件导入到 \lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建)
此时udf.dll文件中定义了名为 sys_eval() 的 MySQL 函数,该函数可以执行系统任意命令。但是如果我现在就打开 MySQL 命令行,使用 select sys_eval(‘whoami’);的话,系统会返回 sys_eval() 函数未定义。因为我们仅仅是把 udf.dll 放到了 lib/plugin 目录下,并没有引入,如果没有引入包,那么这个包里的类你是用不了的。
所以,我们应该把 udf.dll 中的自定义函数引入进来。看一下官方文档中的语法:
create function sys_eval returns string soname 'udf.dll';
- sys_eval是我们想引入的函数
- shared_library_name(共享包名称),即 udf.dll
引入函数:create function sys_eval returns string soname 'udf.dll';
执行命令:select sys_eval("whoami");
删除引用:drop function sys_eval;
复现步骤:
攻击机:192.168.1.106(win10)
被攻击机:192.168.30.143(WinServer2008)
此时攻击机(192.168.1.106)已经获得了被攻击机(192.168.30.143)的一个webshell,并且也顺利的找到了一个注入点。
通过注入点得知mysql版本大于5.1
通过–sql-shell执行命令找到mysql安装路径。
通过webshell找到Mysql安装路径,并且在\lib目录下新建plugin目录
(这里注意权限, 实战中如果权限不够高的话,是无法直接创建目录的)
接下来,我们需要做的就是生成udf.dll文件,默认sqlmap目录E:\Python38\sqlmap\data\udf\mysql
是有windows和linux下的使用的dll
文件的。
但是sqlmap中的文件是通过编码的,如果需要使用的话是需要sqlmap/extra/cloak
目录下的cloak.py文件进行解码。
判断mysql是为32位还是64位,可以看到为32位。
使用sqlmap中32位udf.dll文件,进行解密操作,生成udf.dll文件。
python2 cloak.py -d -i E:\Python38\sqlmap\data\udf\mysql\windows\32\lib_mysqludf_sys.dll_ -o udf.dll(这里udf.dll文件名可以自定义)
通过webshell上传udf.dll文件到lib\plugin 目录下。
通过webshell找到mysql中root密码,一般位置在“C:\phpStudy\MySQL\data\mysql\user.MYD”
通过彩虹表解开密码后,通过菜刀内置数据库管理连接mysql数据库,进行函数引用:
权限提升:
删除引用: