1. 程式人生 > >php檔案包含漏洞(利用phpinfo)復現

php檔案包含漏洞(利用phpinfo)復現

 利用docker復現該漏洞,訪問http://192.168.80.156:8080/phpinfo.php,可以看到頁面出現phpinfo頁面

再訪問http://192.168.80.156:8080/lfi.php?file=/etc/passwd,可以看到該頁面是存在檔案包含漏洞的。

 

先講一下利用phpinfo上傳檔案,然後在檔案包含的原理:

參考連結:https://github.com/vulhub/vulhub/tree/master/php/inclusion

在給PHP傳送POST資料包時,如果資料包裡包含檔案區塊,無論訪問的程式碼中是否有處理檔案上傳的邏輯,php都會將這個檔案儲存成一個臨時檔案(通常是/tmp/php[6個隨機字元]),這個臨時檔案在請求結束後就會被刪除,同時,phpinfo頁面會將當前請求上下文中所有變數都打印出來。但是檔案包含漏洞和phpinfo頁面通常是兩個頁面,理論上我們需要先發送資料包給phpinfo頁面,然後從返回頁面中匹配出臨時檔名,將這個檔名傳送給檔案包含漏洞頁面。

因為在第一個請求結束時,臨時檔案就會被刪除,第二個請求就無法進行包含。

但是這並不代表我們沒有辦法去利用這點上傳惡意檔案,只要傳送足夠多的資料,讓頁面還未反應過來,就上傳我們的惡意檔案,然後檔案包含:

1)傳送包含了webshell的上傳資料包給phpinfo,這個資料包的header,get等位置一定要塞滿垃圾資料;

2)phpinfo這時會將所有資料都打印出來,其中的垃圾資料會將phpinfo撐得非常大

3)PHP預設緩衝區大小是4096,即PHP每次返回4096個位元組給socket連線

4)所以,我們直接操作原生socket,每次讀取4096個位元組,只要讀取到的字元裡包含臨時檔名,就立即傳送第二個資料包

5)此時,第一個資料包的socket連線其實還沒有結束,但是PHP還在繼續每次輸出4096個位元組,所以臨時檔案還未被刪除

6)我們可以利用這個時間差,成功包含臨時檔案,最後getshell

具體步驟:

在網上找的指令碼:https://github.com/vulhub/vulhub/blob/master/php/inclusion/exp.py

利用該指令碼上傳我們的惡意檔案

接下來只要執行指令碼就可以成功上傳我們的檔案了

http://192.168.80.156:8080/lfi.php?file=/tmp/g&1=system(%27cat%20/etc/passwd%27);