1、概述
一些網(wǎng)站的需求,可能會(huì)提供文件查看與下載的功能。如果對(duì)用戶查看或下載的文件沒有限制或者限制繞過(guò),就可以查看或下載任意文件。這些文件可以是源代碼文件,配置文件,敏感文件等等。
- 任意文件讀取會(huì)造成(敏感)信息泄露;
- 任意文件讀取大多數(shù)情況是由于其他漏洞引發(fā)的,如RCE、目錄遍歷、文件包含等。
- 任意文件讀取與任意文件下載本質(zhì)上沒有區(qū)別,信息都是從服務(wù)端流向?yàn)g覽器的。
任意文件讀取與下載可能形式不同,但是從本質(zhì)上講讀取與下載沒有區(qū)別,從權(quán)限角度來(lái)講,讀取與下載都需要讀權(quán)限
1.1、漏洞成因
不管是任意文件讀取還是任意文件下載,觸發(fā)漏洞的條件都是相同的:
- 存在讀取文件的功能(函數(shù)),也就是說(shuō),Web 應(yīng)用開放了文件讀取功能;
- 讀取文件的路徑客戶端可控,完全控制或影響文件路徑參數(shù);
- 沒有對(duì)文件路徑進(jìn)行校驗(yàn)或者校驗(yàn)不嚴(yán)導(dǎo)致校驗(yàn)被繞過(guò);
- 輸出了文件的內(nèi)容;
1.2、漏洞危害
下載服務(wù)器任意文件,包括源代碼文件、系統(tǒng)敏感文件、配置文件等等。
可以配合其他漏洞,構(gòu)成完整攻擊鏈。對(duì)源代碼文件進(jìn)行代碼審計(jì),查找更多的漏洞。
任意文件讀取與下載重點(diǎn)關(guān)注的文件:
- 源代碼
- 配置文件
- 敏感文件
- 日志文件
- 。。。。
1.3、漏洞分類
- 任意文件讀取
- 任意文件下載
1.4、任意文件讀取
以PHP 腳本為例子,有一些函數(shù)可以實(shí)現(xiàn)文件讀取功能。
1.4.1、文件讀取函數(shù)
相關(guān)函數(shù) | 特點(diǎn) |
---|---|
readfile() | 直接讀取文件內(nèi)容, 自帶輸出功能 |
file_get_contents() | 直接讀取文件內(nèi)容, 需要輸出讀取內(nèi)容 |
fread() | 打開文件, 計(jì)算文件大小, 讀取文件, 輸出文件, 關(guān)閉文件 |
readfile():
// readfile.php
$fp = "../phpinfo.php";
readfile($fp);
file_get_contents():
// file_get_contents.php
$fp = "../phpinfo.php";
echo file_get_contents($fp);
fread():
// fread.php
$fp = "../phpinfo.php";
$f = fopen($fp,'r');
$f_size = filesize($fp);
echo fread($f, $f_size);
fclose($f);
1.4.2、任意文件讀取
變量$fp,會(huì)捕獲GET 方式傳遞過(guò)來(lái)的filepath 參數(shù)。
$fp = @$_GET['filepath'];
filepath
客戶端可控,并且沒有經(jīng)過(guò)校驗(yàn),會(huì)造成任意文件讀取漏洞
?filepath=index.php
?filepath=/etc/passwd
?filepath=c:\windows\system32\drivers\etc\hosts
?filepath=c:\phpstudy_2016\apache\conf\httpd.conf
?filepath=c:\phpstudy_2016\mysql\my.ini
?filepath=../../../../../../../../../../phpstudy_2016/www/phpinfo.php
?filePath=../../../../../../../../windows\system32\drivers\etc\hosts
?filePath=../../../../../../etc/hosts
通過(guò)文件讀取方式讀取到 的文件內(nèi)容不會(huì)直接顯示在頁(yè)面上(不會(huì) 解析php代碼呈現(xiàn)在頁(yè)面上),而是以源碼的方式顯示在頁(yè)面源代碼中,可以右鍵查看頁(yè)面源代碼
1.5、任意文件下載
1.5.1、一般情況
直接下載:例如圖片另存為
a 標(biāo)簽下載:
<a href = './a.jpg'>點(diǎn)擊下載圖片</a>
1.5.2、PHP實(shí)現(xiàn)
PHP 文件下載實(shí)現(xiàn)過(guò)程:
- 先讀取文件
- 在輸出文件
- 提供下載
// file-download.php
$fp = './a.jpg';
header('Content-Type:image/jpg');
header('Content-Disposition:attachment;fileName='.basename($fp));
readfile($fp);
1.5.3、任意文件下載
任意文件下載的條件:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-687553.html
- 已知目標(biāo)文件路徑
- 目標(biāo)文件路徑,客戶端可控
- 沒有經(jīng)過(guò)校驗(yàn)或校驗(yàn)不嚴(yán)格
$fp = $_GET['filepath'];
2、任意文件讀取攻防
2.1、路徑過(guò)濾
2.1.1、過(guò)濾…/
$fp = @$_GET['filepath'];
$fp = str_replace("../","",$fp);
readfile($fp);
2.2、簡(jiǎn)單繞過(guò)
2.2.1、雙寫繞過(guò)
?filepath=..././..././..././..././..././..././..././windows\system32\drivers\etc\hosts
2.2.2、絕對(duì)路徑
?filepath=c:/windows\system32\drivers\etc\hosts
2.2.3、使用…\
?filepath=..\..\..\..\..\windows\system32\drivers\etc\hosts
3、任意文件讀取挖掘
3.1、手工挖掘
從文件名上看 | 從參數(shù)上看 |
---|---|
readfile.php filedownload.php filelist.php |
f= file= filepath= fp= readfile= path= readpath= url= menu= META-INF= WEB-INF= content= … |
3.2、案例
metinfo_6.0.0_readfile文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-687553.html
4、漏洞修復(fù)方案
4.1、輸入驗(yàn)證
- 讓web 用戶只能訪問(wèn)(讀?。?,所需要的文件和路徑。
4.2、避免其他漏洞
- 不能有文件包含漏洞,目錄遍歷漏洞或其他漏洞
4.3、限定文件的訪問(wèn)范圍
- 讓用戶不能訪問(wèn)Web 根目錄以外的路徑。
-
php.ini
配置文件中,可以通過(guò)選項(xiàng)open_basedir
來(lái)限定文件訪問(wèn)的范圍
open_basedir = c:\www\
到了這里,關(guān)于滲透測(cè)試漏洞原理之---【任意文件讀取漏洞】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!