什麼是文件包含?在文件包含裏面,我們要想方設法把真正包含的文件掉包,換成惡意文件,服務器卻不知道。
文件包含:是一種代碼處理方式,當一個代碼文件想要引用另外一個代碼文件,就要用到包含,常見的包含函數有include、require等,參數是文件名。但是如果文件包含的參數用戶可控且過濾不嚴,被攻擊者偷樑換柱。
LOW等級:
首先進行正常的操作:點擊fil1和file2時,僅僅是配置參數的變化,而其他並沒有變化,這個參數便是可以利用的。
首先進行嘗試,將這個參數隨便改成test.php,顯示找不到文件,證明這個參數是可以利用的。如圖可以看到錯誤信息,同時爆出來web的絕對路徑。
思考:之前的file1.php、file2.php、file3.php肯定是在一個目錄中的,而這個目錄加上這個文件名形成了絕對路徑,這個目錄我們已經在出錯信息裏面找到了,所以這個include函數如下圖所示。
進一步思考,如果我們要包含根目錄裏面的php.ini文件,就要跳轉到上兩級目錄,如下圖所示:
在瀏覽器中,php.ini的文件成功讀取:
接下來思考如何進行攻擊:
1、本地文件執行:
嘗試讀取DVWA跟目錄下面的phpinfo.php文件,如圖所示,表明了文件包含不僅僅能讀取文件,換能夠執行文件。
2、遠程文件執行:
在DVWA跟目錄下面放一個phpinfo.txt文件,然後進行遠程包含:如下圖所示,說明是可以遠程包含php文件的,而且非php的文件,只要裏面包含了php格式的代碼都可以正常執行。經過進一步嘗試遠程的phpinfo.php文件也可以執行,但兩者的區別是.txt顯示的是DVWA的域名,而.php文件顯示的是本地127.0.0.1。我們要清楚遠程的執行不是在攻擊者的web服務器上執行,而是在受害者web服務器上執行命令,所以phpinfo.txt纔是正經。
攻擊思路:a現在要攻擊b,攻擊者首先在a上傳有webshell代碼的文本文件,得到URL,找到b的文件包含漏洞,就成功地執行了webshell,獲得了b的web權限。
Medium等級:
1、本地文件執行:
首先進行本地包含,在這個等級,發現剛剛的../沒用了,經過測試觀察報錯信息,發現輸入../報錯信息裏面不出現,說明這個等級過濾了../,但我們可以使用..\
如圖所示,成功讀取
2、遠程文件包含:
接下來進行遠程包含,發現同樣被過濾了,經過不斷的判斷,觀察出錯信息,發現服務端只將http://作爲整體進行過濾,如圖所示採用雙寫的方法可成功繞過。
High等級:
1、本地文件包含:
前面兩種方法都不行,經過測試,觀察出錯信息,發現page參數只認file開頭的文件,其他的則提示找不到文件。
所以我們可以利用file 協議:在file://後面加上物理路徑即可,成功查看php.ini裏面的內容。
隨便讀取D盤下面的phpinfo.txt文件可成功執行:
遠程文件執行:前面兩種方法失效,經過驗證同樣只支持file開頭的字符串,而file協議只支持本地文件,遠程的不支持,所以就需要有一種方法將遠程的文件上傳到服務器上,所以這裏要結合文件上傳漏洞,然後進行本地文件執行。
防禦:
白名單