0x00前言:php
udf提权是经过数据库来实现获取目标的管理员的shell,来达到从低权限提权到高权限html
0x01什么是udf:python
udf(Userdefined function)是用户自定义函数mysql
在mysql中函数是什么,好比mysql中常见的sleep(),sum(),ascii()等都是函数linux
udf就是为了让咱们开发者可以本身写方便本身函数,它有3种返回值,这三种分别是STRING,INTEGER,REALgit
STRING 字符型
INTEGER 整型
REAL 实数型
定义格式github
#建立自定义函数
CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|INTEGER|REAL} SONAME '文件名'
[AGGREATE]是汇集函数的表示,系统定义的汇集函数好比有COUNT()、AVE()、MN()、MAX()、SUM()
SONAME 'file'表示这个函数从哪一个文件里面引入,而这个文件通常是动态连接库,windows下是dll,linux是so,而且这个文件要在mysql的plugin目录下
#删除自定义函数 DROP FUNCTION function_name
特别注意mysql版本若是是在5.1如下udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录web
若是颜删除函数,必须udf文件还存在plugin目录下sql
举个例子,mysql加载了udf.so文件中的某个函数,而后在没有删除这个函数前,把plugin目录下导入的这个udf.so文件利用rm命令删除了,那么这个导入mysql的函数就没法被删除,没有找到解决办法,若是后面新创的函数名字和该函数相冲突,mysql还不容许建立,因此请注意一下。(我被坑了,重装了mysql才终于把那个自定义导入的函数删掉了) shell
0x02一道CTF题目:
首先看一道jarvis OJ的一道web题目RE?,来明确如何使用用户自定义函数
https://dn.jarvisoj.com/challengefiles/udf.so.02f8981200697e5eeb661e64797fc172
题目下载下来的是一个so文件,那么明显就是针对linux系统,首先可用linux进mysql看看本身的plugin文件夹在哪
这里我ubuntu虚拟机是在/usr/lib/mysql/plugin/下,把下载的文件拖进虚拟机并copy过去
可是有个问题,咱们不知道这个so文件有哪些函数怎么办(虽然题目提示有个help_me),这里能够用ida逆向工具打开这个so文件
能够看到这里面有函数的名字,因而在linux下的mysql里面先加载help_me看看效果
那么继续加载getflag这个函数(请忽略输入错误的语句.....),最终获取了flag
那么要删除这2个函数也很简单实用drop function语句便可
0x03UDF利用:
回归正题,那么这几个udf提权文件从哪里来,msf和sqlmap下都有
metasploit下的动态连接库
sqlmap下的动态连接库
我在这里把metasploit下的4个文件copy出来,sqlmap下的4个udf文件是通过编码的,若是直接丢在mysql的plugin目录下是没法加载的,须要用sqlmap/extra/cloak/cloak.py进行解码
在sqlmap/extra/cloak/目录下使用如下命令,生成的udf文件就会出如今当前文件夹中
python .\cloak.py -d -i ..\..\udf\mysql\linux\64\lib_mysqludf_sys.so_ -o linux_udf_64.so
首先能够向上面作题的时候瞧瞧这个so文件里面的函数
那么将文件丢到刚刚的ubuntu下,并添加udf是成功的,可是一运行的时候会断开链接
我又用msf的做用于windows的udf.dll文件上,在win7的虚拟机运行,也是断开链接
最早我在思考是为何会出现这种状况,最早怀疑udf文件能加载那么多是mysql版本的问题,可是最后看国外的一篇udf提权的文章,最后仅简单的提了一句msf的udf文件原C++函数没有写异常处理,那么mysql加载的时候会使mysql出错致使断开链接。
而后我比较了下msf和sqlmap的udf文件,发现其实2个文件是如出一辙的,也就是若是单独拿出来会在有些环境下(好比我本身的ubuntu16.04 mysql5.7和win7 phpstudy mysql5.5)的环境下会出现没法运行。
最后在解决这个问题上是,借助大马的udf提权模块可以获取windows的32位和64位的udf文件,而且可以成功运行。(大马是具体是哪一个这里就不透露了,有兴趣能够去github翻翻,或者网上查查)
这个大马的udf.dll文件是20k,而msf的udf文件广泛只有7~8k,估计里面写了不少操做(可能有后门,不是很安全,因此我就不在这透露了)
至于linux如何解决,目前我尚未找到现场能直接用的文件,若是能够那么就本身写C++吧。
0x04关于mysql写文件的注意:
mysql有个配置是叫secure_file_priv,该参数来以为mysql能够对哪一个目录进行可写操做,在刚装的mysql上该参数是没有写的(不是为空是没有写,也就是被注释掉的)
在mysql5.5以前 secure_file_priv默认是空,这个状况下能够向任意绝对路径写文件
在mysql5.5以后 secure_file_priv默认是NULL,这个状况下不能够写文件
可是若是mysql的配置文件中添加,那么就和mysql5.5以前同样,为空,能够为任意目录写文件
而在mysql5.7后 secure_file_priv会默认一个目录,固然这个不是web的目录.....
因此如今经过mysql来写webshell是愈来愈困难了,可是不排除一些配置错误致使的咱们“有隙可乘”
0xff结语:
此次udf提权的学习,也让我理清一条攻击思路,若是挖到sql注入,
查数据库密码和帐号,看看是否是能远程链接
mysql5.7版本以后有个system能够直接执行命令
能够经过union select 来利用load_file或者dumpfile或者outfile向绝对路径目录写webshell
拿到webshell能够链接数据库,可以写文件的话,利用udf提权
参考:
https://www.jianshu.com/p/5b34c1b6dee7
http://www.360doc.com/content/18/0228/22/31784658_733287732.shtml