UDF提权
概念:
MySql提供了一个让使用者自行添加新的函数的功能,这种用户自行扩展函数的功能就较UDF。
当我们拿到webshell后,由于中间件例如,apache允许的使用使用了较低的权限,可能仅仅是个网络服务的权限,然后我们就需要进行提权,而有时候目标机器补丁较全,各种系统提权姿势都失效的情况下,可以将对象转义到数据库服务上,在Windows下,在较低版本的mysql(<5.6)安装时默认是系统权限。还有就是很多人图方便,例如使用了各种集成环境,未做安全设置,直接用root账户进行配置站点,就可以考虑用UDF进行提权。
不同版本的区别:
MySql < 4.1:
允许用户将任何的DLL文件里面的函数注册到MySql里。
MySql 4.1-5.0:
对用来注册的DLL文件的位置进行了限制,通常我们选择 UDF导出到系统目录
C:/windows/system32/来跳过限制。
MySql >=5.1:
这些DLL只能被放在MySql的plugin目录下。
操作步骤:
1.上传具有MySql提权功能的大马:
2.首先先确认MySql版本:
这里的前提是,我们需要先知道数据库的账号密码,这个通常webshell翻阅站点下的配置文件即可找到。进行连接后,执行:
select version();
符合MySql>=5.1的情况。
3.查看plugin目录名称:
show variables like ‘plugin%’;
4.查询目录的绝对路径:
select @@plugin_dir;
5.修改大马的内容,这个路径一般在大马的代码中,因为会进行提权的时候需要根据版本指定dll写入的路径,对代码中的路径进行修改即可。或者如果是页面上就可以指定的也就不需要改大马的代码了。
6.安装DLL:
前提:
这里要执行成功的前提是允许mysqld在指定目录或任意目录的导入导出权限。
原因:
secure_file_priv参数用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录。
secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。
secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行。
secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。
查看 secure_file_priv 的值,默认为NULL,表示限制不能导入导出。
当允许进行操作时:
因为 secure_file_priv 参数是只读参数,不能使用set global命令修改。只能是修改my.cnf或my.ini,然后在结尾处加上secure_file_priv='' 然后再重启mysql。
当不为NULL时,可以安装DLL后门成功:
注意:
这里有个坑,如果你是用phpstudy进行复现的,这里虽然上面读取出来的路径是有plugin目录的,但是实际上去访问的时候会发现一开始并不存在plugin目录,这里就需要自己手动创建了。
接下来就可以进行执行命令了
然后我们和系统中mysql的执行角色进行比对:
现在就已经将权限提升到和mysql的运行权限一致了。
最后,总的来说,UDF提权就是利用MySql允许扩展自定义函数的特性,将webshell的权限变成和mysql运行权限一致,所以就有个前提,mysql得是以高权限进行运行的,至少得比中间件权限高,才有用这个方法进行提权的必要。
欢迎分享转发。
喜欢的话动动手指点个“关注”和“在看”吧~![]()
(信安随笔)












浙公网安备 33010602011771号