這你不是你所常見的PHP文件包含漏洞(利用phpinfo)

0x01 前言

看到文件包含(+phpinfo ) 的問題,在上次衆測中出現此題目,如果沒打過CTF,可能真的很少見到這種問題,當然作爲小白的我,也是很少遇到,畢竟都是第一次,那就來總結一波經驗和操作,附贈EXP,借鑑網上大佬環境,進一步進行探索。

0x02 漏洞環境

執行如下命令啓動環境:

docker-compose up -d

目標環境是官方最新版PHP7.2,說明該漏洞與PHP版本無關。

環境啓動後,訪問http://your-ip:8080/phpinfo.php即可看到一個PHPINFO頁面,訪問http://your-ip:8080/lfi.php?file=/etc/passwd,可見的確存在文件包含漏洞。

源碼及其EXP地址:

https://github.com/vulhub/vulhub/tree/master/php/inclusion

0x03 漏洞復現

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

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

具體步驟:

在網上找的腳本: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);

0x04 文件包含原理

先講一下利用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章