一、文件下載漏洞介紹
一些網站由於業務需求,往往需要提供文件查看或文件下載功能,但若對用戶查看或下載的文件不做限制,則惡意用戶就能夠查看或下載任意敏感文件,這就是文件查看與下載漏洞。
二、方式
2.1、一般鏈接形式:
download.php?path=
down.php?file=
data.php?file=
download.php?filename=
例:下載pikachu配置文件
或者包含參數:
&Src=
&Inputfile=
&Filepath=
&Path=
&Data=
2.2、思路:
(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文件名的內容全部輸出來
(4)常見利用文件
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //記錄每個訪問計算機用戶的公鑰
/etc/passwd
/etc/shadow
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用戶歷史命令記錄文件
/root/.mysql_history //mysql歷史命令記錄文件
/proc/mounts //記錄系統掛載設備
/porc/config.gz //內核配置文件
/var/lib/mlocate/mlocate.db //全文件路徑
/porc/self/cmdline //當前進程的cmdline參數
三、文件下載漏洞修復
(1)過濾".",使用戶在url中不能回溯上級目錄
(2)正則嚴格判斷用戶輸入參數的格式
(3)php.ini配置open_basedir限定文件訪問范圍
四、文件上傳簡介
1、文件上傳(File Upload)是大部分web應用都具備的功能,例如用戶上傳附件、修改頭像、分享圖片視頻等
2、正常的文件一般是文檔、圖片、視頻等,Web應用收集之后放入后台存儲,需要的時候再調用出來返回
3、如果惡意文件如PHP、ASP等執行文件繞過eb應用,並順利執行,則相當於黑客直接拿到了webshell
4、一旦黑客拿到webshell,則可以拿到Web應用的數據,刪除web文件,本地提權,進一步拿下整個服務器甚至內網
5、SQL注入攻擊的對象是數據庫服務,文件上傳漏洞主要攻擊web服務,實際滲透兩種相結合,達到對目標的深度控制
web service和后端通過fast_cgi協議通信
web service和前段通過http或https協議通信
五、低安全上傳漏洞
點擊查看代碼
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
?>
5.1、蟻劍連接
選擇一句話的PHP腳本上傳
打開蟻劍輸入腳本所在路徑,獲取網站
雙擊URL就能看見網站目錄了
5.2、冰蠍連接
注意:冰蠍只能使用自身帶的腳本
打開冰蠍輸入腳本所在路徑,獲取網站
雙擊打開后功能比蟻劍多
六、中安全文件上傳漏洞
中安全級別對文件的MIME和文件大小做了限制
點擊查看代碼
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
// Is it an image?
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) ) {
// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
?>
6.1、MIME介紹
MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。客戶端和服務器端通過MIME類型約定那種資源用那種應用程序打開。
在HTTP中設定MIME類型的方法是通過Response對象的ContentType屬性。
每個MIME類型由兩部分組成,前面是數據的大類別,例如聲音audio、圖象image等,后面定義具體的種類。
6.2、常見的MIME類型
超文本標記語言文本 .html text/html
xml文檔 .xml text/xml
XHTML文檔 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文檔 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG圖像 .png image/png
GIF圖形 .gif image/gif
JPEG圖形 .jpeg,.jpg image/jpeg
au聲音文件 .au audio/basic
MIDI音樂文件 mid,.midi audio/midi,audio/x-midi
RealAudio音樂文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二進制數據 application/octet-stream
通過使用 PHP 的全局數組 $_FILES,你可以從客戶計算機向遠程服務器上傳文件。
第一個參數是表單的 input name,第二個下標可以是 "name", "type", "size", "tmp_name" 或 "error"。就像這樣:
$_FILES["file"]["name"] - 被上傳文件的名稱
$_FILES["file"]["type"] - 被上傳文件的類型
$_FILES["file"]["size"] - 被上傳文件的大小,以字節計
$_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱
$_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼
分析代碼邏輯:首先會獲取到前端的提交請求,然后定義了一個數組(定義圖片上傳指定類型),然后通過upload_sick函數對上傳的文件進行一定的檢查。
分析upload_sick函數(定義在uploadfunction.php文件里面)存在漏洞的的原因是因為 $ _FILES() 這個全局的方法是通過瀏覽器http頭去獲取的content-type,content-type是前端用戶可以控制的。容易被繞過。
上傳一張正常的符合標准的圖片,對其content-type進行抓包操作。可見正常上傳符合要求的圖片中數據包中content-type為image/png對比符合條件,而php文件則不符合條件返回文件類型錯誤。
開啟代理功能攔截數據
將MIME類型修改為網站識別的image/jpeg再轉發
最后成功轉發
七、高安全上傳漏洞
點擊查看代碼
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
// Is it an image?
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
( $uploaded_size < 100000 ) &&
getimagesize( $uploaded_tmp ) ) {
// Can we move the file to the upload folder?
if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
?>
7.1、代碼注入繞過getimagesize()
getimagesize() 函數用於獲取圖像大小及相關信息,成功返回一個數組,失敗則返回 FALSE 並產生一條 E_WARNING 級的錯誤信息,如果用這個函數來獲取類型,從而判斷是否是圖片的話,會存在問題。
語法格式:
array getimagesize ( string $filename [, array &$imageinfo ] )
getimagesize() 函數將測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 圖像文件的大小並返回圖像的尺寸以及文件類型及圖片高度與寬度。
7.2、文件包含漏洞之文件上傳漏洞利用
方法一:CMD方法,copy test.png/b+1.php/a muma.png
方法二:直接使用工具(edjpgcom.exe)增加備注寫入一句話木馬。
點擊查看代碼
<? fputs(fopen("shell20.php","w"),'<?php @eval($_POST[mima]);?>')?>
意思是生成shell20.php文件,文件內容包含一句話馬
方法三:直接偽造頭部
決定文件是否是jpeg格式?
二進制形式打開文件,文件開始字節為FFD8,文件結束兩字節為FF D9。則初步判定文件為jpeg。
jpeg的SOI(start ofimage) 為ff d8,EOD(end of image)為ff d9
注意:通過修改腳本文件后綴去上傳是沒有效果的,因為這個函數會去檢測圖片格式。
文件上傳后通過文件包含漏洞利用
如果出現上圖所示,服務器中還是沒有生成文件,在我多次嘗試換圖片,檢測代碼還是無效的情況下,最終換了別的瀏覽器嘗試,結果就可以了
八、其他文件上傳繞過的方法
8.1、路徑繞過白名單
0x00截斷或x.php%00.jpg
不過這需要對文件有足夠的權限,如:上傳的文件名save_path后面改成../upload/x.php%00其實就是改變文件路徑%00后面的數據直接丟棄.
8.2、黑名單
(1)文件名大小寫繞過
(2)名單繞過
用黑名單里沒有的名單進行攻擊,比如黑名單里沒有.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess后綴文件之類
(3)特殊文件名或文件夾繞過(windows)
還有比如發送的http 包里把文件名改成test.asp. 或test.asp_(下划線為空格),這種命名方式在windows 系統里是不被允許的,所以需要在burp 之類里進行修改,然后繞過驗證后,會被windows 系統自動去掉后面的點和空格,但要注意Unix/Linux 系統沒有這個特性。
(4)雙后綴名繞過:x.pphphp
(5)::$DATA繞過
是Windows下NTFS文件系統的一個特性,即NTFS文件系統的存儲數據流的一個屬性 DATA 時,比如x.php::$DATA上傳成功后文件名其實就是x.php