任意文件讀取漏洞
任意文件讀取是屬於文件操作漏洞的一種,一般任意文件讀取漏洞可以讀取配置信息甚至系統重要文件。嚴重的話,就可能導致SSRF,進而漫游至內網。
漏洞產生原因
- 存在讀取文件的函數
- 讀取文件的路徑用戶可控,且未校驗或校驗不嚴
- 輸出了文件內容
文件讀取函數
readfile()、file_get_contents()、fopen()中,$filename沒有經過校驗或者校驗不合格,用戶可控制變量讀取任意文件,如/etc/passwd、./index.php、/config.ini。
任意文件下載漏洞
一些網站由於業務需求,往往需要提供文件查看或文件下載功能,但若對用戶查看或下載的文件不做限制,則惡意用戶就能夠查看或下載任意敏感文件,這就是目錄遍歷與下載漏洞。
漏洞產生原因
- 有讀取文件的函數
- 讀物文件的路徑用戶可控,且沒有經過校驗,或者校驗不嚴格
- 輸出文件內容
- 一個正常的網站,存在一個下載文件的功能,同時還會從瀏覽器接收文件名字
文件下載的兩種方式
1、直接下載:
<a href=”http://www.a.com/xxx.rar”>下載</a>
2、增加header頭
<?php
$filename = $_GET['filename'];
echo '<h1>講開始下載文件!</h1><br /><br />';
echo file_get_contents($filename);
header('Content-Type: imgage/jpeg');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Lengh: '.filesize($filename));
?>
利用思路
利用方式
一般鏈接形式:
download.php?path=
down.php?file=
data.php?file=
或者包含參數:
&Src=
&Inputfile=
&Filepath=
&Path=
&Data=
(1)下載常規的配置文件,例如: ssh,weblogic,ftp,mysql等相關配置
(2)下載各種.log文件,從中尋找一些后台地址,文件上傳點之類的地方,如果運氣好的話會獲得一些前輩們的后門。
(3)下載web業務文件進行白盒審計,利用漏洞進一步攻入服務器。嘗試讀取/root/.bash_history看自己是否具有root權限。如果沒有,就只能利用../來回跳轉讀取一些.ssh下的配置信息文件。讀取mysql下的.bash_history文件。來查看是否記錄了一些可以利用的相關信息。然后逐個下載需要審計的代碼文件,但是下載的時候變得很繁瑣,只能嘗試去猜解目錄,然后下載一些中間件的記錄日志進行分析。
如果我們遇到的是java+oracle環境
可以先下載/WEB-INF/classes/applicationContext.xml 文件,這里面記載的是web服務器的相應配置,然后下載/WEB-INF/classes/xxx/xxx/ccc.class對文件進行反編譯,然后搜索文件中的upload關鍵字看是否存在一些api接口,如果存在的話我們可以本地構造上傳頁面用api接口將我們的文件傳輸進服務器
如果具有root權限
在linux中有這樣一個命令 locate 是用來查找文件或目錄的,它不搜索具體目錄,而是搜索一個數據庫/var/lib/mlocate/mlocate.db。這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,並且每天自動更新一次。當我們不知道路徑是什么的情況下,這個可以說是一個核武器了,我們利用任意文件下載漏洞mlocate.db文件下載下來,利用locate命令將數據輸出成文件,這里面包含了全部的文件路徑信息。
locate 讀取方法: locate mlocate.db admin //可以將mlocate.db中包含admin文件名的內容全部輸出來
locate 讀取方法
locate mlocate.db admin
可以將mlocate.db中包含admin內容全部輸出來。
利用這個文件可以獲取到該服務器任何我們想要的內容並下載出來而不用一個一個去猜解目錄,但是這個文件只有root用戶才能讀取。另一方面我們也可以利用linux內核的一個文件/proc/self/cmdline當前進程的cmdline參數,可以獲取到路徑信息。
總的來說,任意文件下載漏洞的利用主要是為了信息收集,我們通過對服務器配置文件的下載,獲取到大量的配置信息、源碼,從而根據獲取的信息來進一步挖掘服務器漏洞從而入侵。
任意文件讀取與下載漏洞挖掘
敏感信息
任意文件讀取與下載漏洞驗證
任意文件讀取驗證

readfile.php?f=../index.txt
file://偽協議 ,讀取文件內容
readfile.php?f=file:///etc/passwd
任意文件下載驗證
示例代碼:
<?php
$filename = $_GET['f'];
echo '<h1>講開始下載文件!</h1><br /><br />';
echo file_get_contents($filename);
header('Content-Type: imgage/jpeg');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Lengh: '.filesize($filename));
?>
漏洞判斷
參數f的參數值為PHP文件時:
1.文件被解析,則是文件包含漏洞
2.顯示源代碼,則是文件查看漏洞
3.提示下載,則是文件下載漏洞
漏洞防御修復
通用
- 過濾 . 點,使用戶在url中不能回溯上級目錄
- 正則嚴格判斷用戶輸入的參數
- php.ini配置open_basedir限定文件訪問范圍
- 設置白名單,即只能下載/訪問某個目錄下的文件,權限給到最低
文件下載漏洞修復
-
將下載區獨立出來,放在項目路徑外,給每個下載資源固定的URL,而不是所有的下載資源都是統一的URL:http://www.test.com/download?filename=文件名
-
凈化數據:對用戶傳過來的文件名參數進行硬編碼或統一編碼,對文件類型進行白名單控制,對包含惡意字符或者空字符的參數進行拒絕。
-
web應用程序可以使用chroot環境包含被訪問的web目錄,或者使用絕對路徑+參數來訪問文件目錄,時使其即使越權也在訪問目錄之內。www目錄就是一個chroot應用。由chroot創造出的那個根目錄,叫做“chroot監獄”(所謂”監獄”就是指通過chroot機制來更改某個進程所能看到的根目錄,即將某進程限制在指定目錄中,保證該進程只能對該目錄及其子目錄的文件有所動作,從而保證整個服務器的安全。
-
詳細具體chroot的用法,可參考:http://blog.csdn.net/frozen_fish/article/details/2244870
-
任意文件下載漏洞也有可能是web所采用的中間件的版本低而導致問題的產生,例如ibm的websphere的任意文件下載漏洞,需更新其中間件的版本可修復。
-
要下載的文件地址保存至數據庫中。
-
文件路徑保存至數據庫,讓用戶提交文件對應ID下載文件。
-
用戶下載文件之前需要進行權限判斷。
-
文件放在web無法直接訪問的目錄下。
-
不允許提供目錄遍歷服務。
-
公開文件可放置在web應用程序下載目錄中通過鏈接進行下載。
-
記錄文件下載日志。
漏洞利用實例
不是弱口令,也不能掃出目錄。只有一個help.docx文件可以下載。於是可能是任意文件下載漏洞。
點擊藍字“help”,抓包,發包。發現GET方式一直什么都下載不了。后來修改為POST,就可以下載了。
因為題目提示java,所以可以先下載網站的配置文件,在根目錄WEB-INF/web.xml
發現操作flag的關鍵文件位置,讀取(或下載)/WEB-INF/classes/下的flag的關鍵文件位置,又因為Java字節碼類文件(.class)是Java編譯器編譯Java源文件(.java)產生的“目標文件”。
最終得出flag的關鍵文件位置為:/WEB-INF/classes/com/wm/ctf/FlagController.class
Base64解碼得到flag
http://192.168.18.54:78/pikachu/vul/unsafedownload/execdownload.php?filename=../down_nba.php
http://192.168.18.54:78/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../../admin.php
本來是圖片,現在下載源代碼了。
注:Linux的…/打的很多也最多只跳轉到網站根目錄下,不會出現問題,但是Windows下不行,。
一般來說,都是程序員沒有指定下載文件變量對應路徑的地址,就會造成跳轉。
