** 一些網(wǎng)站由于業(yè)務(wù)需求,往往需要提供文件查看或文件下載功能,但若對用戶(hù)查看或下載的文件不做限制,則惡意用戶(hù)就能夠查看或下載任意敏感文件,這就是文件查看與下載漏洞。**
一般鏈接形式:download.php?path=down.php?file=data.php?file=download.php?filename=或者包含參數:&Src=&Inputfile=&Filepath=&Path=&Data=**//當我們?yōu)g覽網(wǎng)頁(yè)時(shí),經(jīng)常見(jiàn)到此類(lèi)鏈接形式和參數,可能就存在漏洞** 2.1當遇到一個(gè)任意文件下載時(shí),我們的一般利用思路:
1)下載常規的配置文件,例如: ssh,weblogic,ftp,mysql等相關(guān)配置
2)下載各種.log文件,從中尋找一些后臺地址,文件上傳點(diǎn)之類(lèi)的地方,如果運氣好的話(huà)會(huì )獲得一些前輩們的后門(mén)。
3)下載web業(yè)務(wù)文件進(jìn)行白盒審計,利用漏洞進(jìn)一步攻入服務(wù)器。
嘗試讀取/root/.bash_history看自己是否具有root權限。如果沒(méi)有的話(huà)。我們只能按部就班的利用…/來(lái)回跳轉讀取一些.ssh下的配置信息文件,讀取mysql下的.bash_history文件。來(lái)查看是否記錄了一些可以利用的相關(guān)信息。然后逐個(gè)下載我們需要審計的代碼文件,但是下載的時(shí)候變得很繁瑣,我們只能?chē)L試去猜解目錄,然后下載一些中間件的記錄日志進(jìn)行分析。
2.2如果我們遇到的是java+oracle環(huán)境:
可以先下載/WEB-INF/classes/applicationContext.xml 文件,這里面記載的是web服務(wù)器的相應配置,然后下載/WEB-INF/classes/xxx/xxx/ccc.class對文件進(jìn)行反編譯,然后搜索文件中的upload關(guān)鍵字看是否存在一些api接口,如果存在的話(huà)我們可以本地構造上傳頁(yè)面用api接口將我們的文件傳輸進(jìn)服務(wù)器
2.3如果具有root權限:
在linux中有這樣一個(gè)命令 locate 是用來(lái)查找文件或目錄的,它不搜索具體目錄,而是搜索一個(gè)數據庫/var/lib/mlocate/mlocate.db。這個(gè)數據庫中含有本地所有文件信息。Linux系統自動(dòng)創(chuàng )建這個(gè)數據庫,并且每天自動(dòng)更新一次。當我們不知道路徑是什么的情況下,這個(gè)可以說(shuō)是一個(gè)核武器了,我們利用任意文件下載漏洞mlocate.db文件下載下來(lái),利用locate命令將數據輸出成文件,這里面包含了全部的文件路徑信息。
locate 讀取方法: locate mlocate.db admin //可以將mlocate.db中包含admin文件名的內容全部輸出來(lái)
(4)常見(jiàn)利用文件
/root/.ssh/authorized_keys //公鑰存放路徑
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //記錄每個(gè)訪(fǎng)問(wèn)計算機用戶(hù)的公鑰
/etc/passwd //用戶(hù)名存放文件
/etc/shadow //密碼存放文件
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用戶(hù)歷史命令記錄文件
/root/.mysql_history //mysql歷史命令記錄文件
/proc/mounts //記錄系統掛載設備
/porc/config.gz //內核配置文件
/var/lib/mlocate/mlocate.db //全文件路徑
/porc/self/cmdline //當前進(jìn)程的cmdline參數
(1)過(guò)濾".",使用戶(hù)在url中不能回溯上級目錄
(2)正則嚴格判斷用戶(hù)輸入參數的格式
(3)php.ini配置open_basedir限定文件訪(fǎng)問(wèn)范圍
我們打開(kāi)pikachu的下載配置文件:
<?php$PIKA_ROOT_DIR = "../../";include_once $PIKA_ROOT_DIR."inc/function.php";header("Content-type:text/html;charset=utf-8");// $file_name="cookie.jpg";$file_path="download/{$_GET['filename']}"; //這里?。?!//用以解決中文不能顯示出來(lái)的問(wèn)題 $file_path=iconv("utf-8","gb2312",$file_path);//首先要判斷給定的文件存在與否if(!file_exists($file_path)){ skip("你要下載的文件不存在,請重新下載", 'unsafe_down.php'); return ;}$fp=fopen($file_path,"rb");$file_size=filesize($file_path);//下載文件需要用到的頭ob_clean();//輸出前一定要clean一下,否則圖片打不開(kāi)Header("Content-type: application/octet-stream");Header("Accept-Ranges: bytes");Header("Accept-Length:".$file_size);Header("Content-Disposition: attachment; filename=".basename($file_path));$buffer=1024;$file_count=0;//向瀏覽器返回數據//循環(huán)讀取文件流,然后返回到瀏覽器feof確認是否到EOFwhile(!feof($fp) && $file_count<$file_size){ $file_con=fread($fp,$buffer); $file_count+=$buffer; echo $file_con;}fclose($fp);?> 仔細看,在GET這個(gè)參數沒(méi)有定義filename的匹配規則,同時(shí),filename可以設定為絕對路徑,這樣就只能在指定目錄文件中進(jìn)行下載。
** 大多數網(wǎng)站都有文件上傳的接口,但如果在后臺開(kāi)發(fā)時(shí)并沒(méi)有對上傳的文件進(jìn)行安全考慮或采用了有缺陷的措施,導致攻擊者可以通過(guò)一些手段繞過(guò)安全措施從而上傳一些惡意文件,從而通過(guò)該惡意文件的訪(fǎng)問(wèn)來(lái)控制整個(gè)后臺
首先觀(guān)察到提示只允許上傳圖片文件,那么前端的查看代碼,當頁(yè)面發(fā)生改變時(shí),會(huì )調用這個(gè)checkFileExt函數來(lái)檢查上傳的是不是圖片,我們只需要在前端將checkFileExt函數刪除,就能上傳一個(gè)一個(gè)非圖片文件。
MIME(Multipurpose Internet Mail Extensions)多用途互聯(lián)網(wǎng)郵件擴展類(lèi)型。是設定某種擴展名的文件用一種應用程序來(lái)打開(kāi)的方式類(lèi)型,當該擴展名文件被訪(fǎng)問(wèn)的時(shí)候,瀏覽器會(huì )自動(dòng)使用指定應用程序來(lái)打開(kāi)。多用于指定一些客戶(hù)端自定義的文件名,以及一些媒體文件打開(kāi)方式。
每個(gè)MIME類(lèi)型由兩部分組成,前面是數據的大類(lèi)別,例如聲音audio、圖象image等,后面定義具體的種類(lèi)。
常見(jiàn)的MIME類(lèi)型(通用型):
超文本標記語(yǔ)言文本 .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音樂(lè )文件 mid,.midi audio/midi,audio/x-midi
RealAudio音樂(lè )文件 .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
任意的二進(jìn)制數據 application/octet-stream
通過(guò)使用 PHP 的全局數組 $_FILES,你可以從客戶(hù)計算機向遠程服務(wù)器上傳文件。
第一個(gè)參數是表單的 input name,第二個(gè)下標可以是 “name”, “type”, “size”, “tmp_name” 或 “error”。就像這樣:
$_FILES[“file”][“name”] - 被上傳文件的名稱(chēng)
$_FILES[“file”][“type”] - 被上傳文件的類(lèi)型
$_FILES[“file”][“size”] - 被上傳文件的大小,以字節計
$_FILES[“file”][“tmp_name”] - 存儲在服務(wù)器的文件的臨時(shí)副本的名稱(chēng)
$_FILES[“file”][“error”] - 由文件上傳導致的錯誤代碼
詳細可參考:http://www.w3school.com.cn/php/php_file_upload.asp
分析代碼邏輯:首先會(huì )獲取到前端的提交請求,然后定義了一個(gè)數組(定義圖片上傳指定類(lèi)型),然后通過(guò)upload_sick函數對上傳的文件進(jìn)行一定的檢查。
分析upload_sick函數(定義在uploadfunction.php文件里面)存在漏洞的的原因是因為 $ _FILES() 這個(gè)全局的方法是通過(guò)瀏覽器http頭去獲取的content-type,content-type是前端用戶(hù)可以控制的。容易被繞過(guò)。
上傳一張正常的符合標準的圖片,對其content-type進(jìn)行抓包操作??梢?jiàn)正常上傳符合要求的圖片中數據包中content-type為image/png對比符合條件,而php文件則不符合條件返回文件類(lèi)型錯誤。
getimagesize() 函數用于獲取圖像大小及相關(guān)信息,成功返回一個(gè)數組,失敗則返回 FALSE 并產(chǎn)生一條 E_WARNING 級的錯誤信息,如果用這個(gè)涵數來(lái)獲取類(lèi)型,從而判斷是否是圖片的話(huà),會(huì )存在問(wèn)題。
語(yǔ)法格式:
array getimagesize ( string KaTeX parse error: Expected 'EOF', got '&' at position 19: …ename [, array &?imageinfo ] )
getimagesize() 函數將測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 圖像文件的大小并返回圖像的尺寸以及文件類(lèi)型及圖片高度與寬度。
文件包含漏洞之文件上傳漏洞利用
方法一:直接偽造頭部GIF89A
方法二:CMD方法,copy /b test.png+1.php muma.png
https://blog.csdn.net/Ro_kin/article/details/75578711
方法三:直接使用工具增加備注寫(xiě)入一句話(huà)木馬。
0x00截斷或test.asp%00.jpg
MIME繞過(guò)https://blog.csdn.net/weixin_43915842/article/details/90111207
(1)文件名大小寫(xiě)繞過(guò)
(2)名單繞過(guò)
用黑名單里沒(méi)有的名單進(jìn)行攻擊,比如黑名單里沒(méi)有.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后綴文件之類(lèi)
.
(3)特殊文件名或文件夾繞過(guò)(windows)
還有比如發(fā)送的http 包里把文件名改成test.asp. 或test.asp_(下劃線(xiàn)為空格),這種命名方式在windows 系統里是不被允許的,所以需要在burp 之類(lèi)里進(jìn)行修改,然后繞過(guò)驗證后,會(huì )被windows 系統自動(dòng)去掉后面的點(diǎn)和空格,但要注意Unix/Linux 系統沒(méi)有這個(gè)特性。
(4)0x00截斷
name = getname(http request) //假如這時(shí)候獲取到的文件名是test.asp .jpg(asp 后面為0x00)
type = gettype(name) //而在gettype()函數里處理方式是從后往前掃描擴展名,所以判斷為jpg
if (type == jpg)
SaveFileToPath(UploadPath.name, name) //但在這里卻是以0x00 作為文件名截斷
//最后以test.asp 存入路徑里
(5)把文件名改成test.asp. 或test.asp_(下劃線(xiàn)為空格),這種命名方式在windows 系統里是不被允許的,所以需要在burp 之類(lèi)里進(jìn)行修改,然后繞過(guò)驗證后,會(huì )被windows 系統自動(dòng)去掉后面的點(diǎn)和空格,但要注意Unix/Linux 系統沒(méi)有這個(gè)特性。
(6)雙后綴名繞過(guò)
(7):: D A T A 繞 過(guò) 是 W i n d o w s 下 N T F S 文 件 系 統 的 一 個(gè) 特 性 , 即 N T F S 文 件 系 統 的 存 儲 數 據 流 的 一 個(gè) 屬 性 D A T A 時(shí) , 就 是 請 求 a . a s p 本 身 的 數 據 , 如 果 a . a s p 還 包 含 了 其 他 的 數 據 流 , 比 如 a . a s p : l a k e 2. a s p , 請 求 a . a s p : l a k e 2. a s p : : DATA繞過(guò) 是Windows下NTFS文件系統的一個(gè)特性,即NTFS文件系統的存儲數據流的一個(gè)屬性 DATA 時(shí),就是請求 a.asp 本身的數據,如果a.asp 還包含了其他的數據流,比如 a.asp:lake2.asp,請求 a.asp:lake2.asp:: DATA繞過(guò)是Windows下NTFS文件系統的一個(gè)特性,即NTFS文件系統的存儲數據流的一個(gè)屬性DATA時(shí),就是請求a.asp本身的數據,如果a.asp還包含了其他的數據流,比如a.asp:lake2.asp,請求a.asp:lake2.asp::DATA,則是請求a.asp中的流數據lake2.asp的流數據內容。
IIS解析漏洞
Apache解析漏洞
.htaccess
配置文件LoadModule rewrite_module modules/mod_rewrite.so前的注釋去掉,尋找關(guān)鍵詞:AllowOverride,并把后面的參數從None全部改成All
Nginx解析漏洞
.htaccess文件解析
本地文件包含解析
針對文件上傳漏洞的特點(diǎn)和必須具備的三個(gè)條件,我們阻斷任何一個(gè)條件就可以達到組織文件上傳攻擊的目的:
1、最有效的,將文件上傳目錄直接設置為不可執行,對于Linux而言,撤銷(xiāo)其目錄的’x’權限;實(shí)際中很多大型網(wǎng)站的上傳應用都會(huì )放置在獨立的存儲上作為靜態(tài)文件處理,一是方便使用緩存加速降低能耗,二是杜絕了腳本執行的可能性;
2、文件類(lèi)型檢查:強烈推薦白名單方式,結合MIME Type、后綴檢查等方式(即只允許允許的文件類(lèi)型進(jìn)行上傳);此外對于圖片的處理可以使用壓縮函數或resize函數,處理圖片的同時(shí)破壞其包含的HTML代碼;
3、使用隨機數改寫(xiě)文件名和文件路徑,使得用戶(hù)不能輕易訪(fǎng)問(wèn)自己上傳的文件;
4、單獨設置文件服務(wù)器的域名;
聯(lián)系客服