WEB安全漏洞中虚汛,與文件操作相關(guān)的漏洞類型就不少,在大部分的滲透測(cè)試過(guò)程中刺桃,上傳文件(大、小馬)是必不可少的一個(gè)流程吸祟,然而各種各樣的防火墻攔截了文件上傳瑟慈,遂整理文件操作相關(guān)漏洞的各種姿勢(shì),如有不妥之處屋匕,還望各位斧正葛碧,小東感激不盡。
最近在代碼審計(jì)某項(xiàng)目的時(shí)候發(fā)現(xiàn)了一個(gè)文件上傳漏洞过吻,但是在生產(chǎn)環(huán)境測(cè)試的過(guò)程中进泼,各種各樣的“狗”和“盾”都給攔截了,徒有漏洞纤虽,沒(méi)法兒利用乳绕,所以整理整理,殺狗破盾廓推,沖沖沖刷袍!
0×01 尋找文件操作相關(guān)漏洞
文件操作相關(guān)的漏洞主要有:任意文件上傳、任意文件下載樊展、任意文件刪除呻纹、任意文件讀取四大類(簡(jiǎn)單理解:增刪改查)
1.1 文件上傳:
文件上傳功能在大多數(shù)的?web?應(yīng)用中都存在,比如用戶頭像上傳专缠,文章內(nèi)容的圖片雷酪、視頻、音頻涝婉、附件上傳哥力,一些?CMS?系統(tǒng)上傳模版文件,數(shù)據(jù)庫(kù)備份文件,插件文件等地方吩跋。
而文件上傳寞射,在大部分的滲透測(cè)試進(jìn)一步利用漏洞的時(shí)候是比較關(guān)鍵的一步。
一般來(lái)說(shuō)锌钮,對(duì)于那些未校驗(yàn)文件類型的上傳操作的桥温,可以直接上傳我們的小馬、大馬文件梁丘。
有校驗(yàn)文件后綴侵浸、類型的,如果是黑名單的方式氛谜,比如某?WAF?設(shè)置了不允許上傳文件后綴為php,asp,apsx的文件掏觉,根據(jù)PHP的一些可解析后綴比如:php3?能犯、php4输吏、php5、phtml等等
黑名單:
array(
? ? ".php",".php5",".php4",".php3",".php2","php1",
? ? ".html",".htm",".phtml",".pht",".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"
);
1.2 文件刪除:
任意文件刪除漏洞巫财,一般來(lái)講刪除文件是一個(gè)比較危險(xiǎn)的操作惭嚣,都是管理員才具有的權(quán)限遵湖,所以對(duì)于文件的刪除必須有權(quán)限的控制,當(dāng)然如果沒(méi)有做好CSRF防護(hù)晚吞,同樣是可以以管理員權(quán)限進(jìn)行操作。
任意文件刪除漏洞一般存在于:用戶刪除文章的附件(圖片谋国、壓縮包等)槽地,管理員刪除文章(同時(shí)關(guān)聯(lián)刪除文章附件),管理員刪除插件芦瘾,刪除模版捌蚊,刪除數(shù)據(jù)庫(kù)備份文件等操作的地方。
1.3 文件修改:
文件修改其實(shí)比較少見(jiàn)近弟,其實(shí)現(xiàn)的一般思路是刪除原文件缅糟,替換成新上傳的文件。
修改文件的操作祷愉,在后臺(tái)的操作還比較常見(jiàn)窗宦,比如寫(xiě)后臺(tái)修改web應(yīng)用的配置文件config.php(配置網(wǎng)站標(biāo)題、關(guān)鍵詞二鳄、數(shù)據(jù)庫(kù)等等)赴涵,常見(jiàn)于安裝CMS系統(tǒng)時(shí)候的引導(dǎo)操作流程,所以會(huì)經(jīng)常去尋找類似于install.php等的文件订讼,檢查是否存在重裝漏洞髓窜。
1.4 讀取/下載文件:
在一個(gè)web應(yīng)用中,對(duì)于網(wǎng)站有風(fēng)險(xiǎn)的文件下載操作的是用戶可以讀取或下載任意文件。
常見(jiàn)存在此漏洞的地方比如:網(wǎng)站程序備份文件寄纵、數(shù)據(jù)庫(kù)備份文件鳖敷,文件備份(index.php.bak),.git程拭,VM?文件修改的時(shí)候異常退出的而生成的?.swp備份文件等
0×02 如何突破上傳文件
實(shí)際的環(huán)境中定踱,很少有直接可以任意上傳文件的漏洞(常見(jiàn)于前端限制),小東根據(jù)個(gè)人經(jīng)驗(yàn)整理出主要的三大類突破文件上傳攔截的方法:
操作說(shuō)明前端禁用JS前端限制哺壶,禁用JS屋吨,去除input標(biāo)簽的accept屬性修改文件后綴抓包工具,修改文件后綴為黑名單之外的后綴修改文件后綴修改文件后綴為index.jpg.php修改文件后綴%00截?cái)嗌奖觯热鏸ndex.php%00.jpg修改文件后綴文件名末尾添加::$DATA至扰,windows會(huì)把::$DATA之后的數(shù)據(jù)當(dāng)成文件流,不會(huì)檢測(cè)后綴名.且保持::$DATA之前的文件名修改文件后綴在linux主機(jī)上的文件名大小寫(xiě)敏感资锰,文件后綴大小混寫(xiě)修改文件后綴在文件末尾添加空格敢课,黑名單的方式?jīng)]法兒檢測(cè)修改文件類型抓包工具,修改Content-Type:image/png修改文件后綴修改文件名shell.php:.jpg绷杜,上傳后會(huì)得到一個(gè)空的文件shell.php直秆,然后修改文件名為shell.>>>或者shell.<、shell.<<<鞭盟、shell.>><再上傳圾结,重寫(xiě)shell.php換行解析Apache2.4.0~2.4.29換行解析漏洞%0d,%0a(CR,LF(回車齿诉,換行))未知后綴名Apache配置AddHandler application/x-httpd-php .php不當(dāng)導(dǎo)致未知后綴腳本執(zhí)行后綴名正則替換這種需要構(gòu)造筝野,使得替換之后的可以重組成為新的可執(zhí)行后綴,雙后綴名繞過(guò)修改上傳路徑name="upload_file/1.php%00"; filename="shell.jpg"條件競(jìng)爭(zhēng)條件競(jìng)爭(zhēng)刪除/重命名文件時(shí)間差繞過(guò)圖片馬copy code.jpg/b + shell.php/b hourse.jpg圖片重繪包含馬做一個(gè)就好了上傳壓縮包配合PHP偽協(xié)議粤剧、文件協(xié)議等讀取執(zhí)行本地文件數(shù)據(jù)庫(kù)寫(xiě)文件UDF歇竟,select查詢輸入
實(shí)戰(zhàn)示例:
來(lái)自Upload-labs漏洞演示靶場(chǎng)的文件上傳的第九關(guān)示例,一看到下面這種情況抵恋,是不是感覺(jué)完全沒(méi)思路焕议?
<?php
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
? ? if (file_exists(UPLOAD_PATH)) {
? ? ? ? $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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");
? ? ? ? $file_name = trim($_FILES['upload_file']['name']);
? ? ? ? $file_name = deldot($file_name);//刪除文件名末尾的點(diǎn)
? ? ? ? $file_ext = strrchr($file_name, '.'); // 獲取文件的后綴名,如`.php`
? ? ? ? $file_ext = strtolower($file_ext); //轉(zhuǎn)換為小寫(xiě)
? ? ? ? $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
? ? ? ? $file_ext = trim($file_ext); //首尾去空
? ? ? ? if (!in_array($file_ext, $deny_ext)) {
? ? ? ? ? ? $temp_file = $_FILES['upload_file']['tmp_name'];
? ? ? ? ? ? $img_path = UPLOAD_PATH.'/'.$file_name;
? ? ? ? ? ? if (move_uploaded_file($temp_file, $img_path)) {
? ? ? ? ? ? ? ? $is_upload = true;
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? $msg = '上傳出錯(cuò)弧关!';
? ? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? ? $msg = '此文件類型不允許上傳盅安!';
? ? ? ? }
? ? } else {
? ? ? ? $msg = UPLOAD_PATH . '文件夾不存在,請(qǐng)手工創(chuàng)建!';
? ? }
}
?>
面對(duì)這樣的情況梯醒,該怎么上傳繞過(guò)吶宽堆?各位不妨先思考一下!
小東看到這樣的情況是這樣思考的:
1茸习、什么操作系統(tǒng)畜隶?
2、如何繞過(guò)函數(shù)?
環(huán)境是自己的windows筆記本籽慢,那么通過(guò)windows系統(tǒng)特征可以嘗試正則繞過(guò)浸遗,文件流::$DATA,大小寫(xiě)繞過(guò)箱亿,換行截?cái)嗟确绞健?/p>
如果是linux跛锌,就有文件大小寫(xiě),換行截?cái)嘟焱铮馕鑫募蟼鞯鹊确绞健?/p>
分析上面的文件:黑名單限制文件后綴髓帽,限制文件后綴大小寫(xiě),去除::$DATA脑豹,限制上傳.htaccess郑藏,難道這個(gè)題是假的?
這里可以嘗試二次上傳的方式瘩欺,借助windows平臺(tái)的正則匹配規(guī)則:
如下符號(hào)在windows平臺(tái)下等效果
" => .
> => ?
< => *
首先隨便上傳一個(gè)shell.php必盖,使用抓包工具(比如:burpsuite),將文件后綴修改為:shell.php:.jpg
此時(shí)俱饿,會(huì)在upload目錄下生成一個(gè)名為shell.php的空文件:
然后歌粥,修改數(shù)據(jù)包文件名為:shell.<<<,這里在move_uploaded_file($temp_file, '../../upload/shell.<<<')類似與正則匹配拍埠,匹配到.../../upload/shell.php文件失驶,然后會(huì)將此次上傳的文件數(shù)據(jù)寫(xiě)入到shell.php文件中,這樣就成功寫(xiě)入我們的小馬了枣购。
試試能不能執(zhí)行吶突勇?
在這里,對(duì)于文件上傳的練習(xí)靶場(chǎng)坷虑,非常推薦Uplaod-labs這個(gè)項(xiàng)目:https://github.com/c0ny1/upload-labs。
0×03 如何突破文件刪除
任意刪除文件漏洞常存在于刪除頭像埂奈、文章附件迄损、CMS?管理插件、模版和數(shù)據(jù)庫(kù)備份刪除的地方账磺,同時(shí)文件重寫(xiě)的地方芹敌,通常來(lái)說(shuō)這些刪除的操作是需要嚴(yán)格控制用戶權(quán)限和資源所有對(duì)象,因?yàn)閯h除文件的操作垮抗,沒(méi)有太多的可研究性氏捞,其主要在于尋找類似在?PHP?中的?unlink()?函數(shù)或者文件覆蓋的一些函數(shù)(沒(méi)有重命名),對(duì)于有權(quán)限驗(yàn)證冒版,不好利用的?CSRF?漏洞配合一起利用
實(shí)戰(zhàn)示例:
來(lái)自?emlog 6.0.0?博客?CMS液茎,emlog?官方于不久前更新了?6.0.0?的正式版,小東在之前審計(jì)過(guò)測(cè)試版代碼,不知道修復(fù)了沒(méi)捆等?不清楚的老鐵滞造,可以先瞅瞅這篇文章:《[代碼審計(jì)]Emlog 6.0 Beta》。
安裝:
正常的下載安裝到本地環(huán)境栋烤,直接來(lái)到?/admin/data.php?文件谒养,這個(gè)文件內(nèi)的操作是用作數(shù)據(jù)庫(kù)的備份、導(dǎo)入和刪除明郭,如下代碼买窟,可以看到,通過(guò)構(gòu)造參數(shù)可以直接刪除?$_PSOT['bak']?參數(shù)傳遞的文件名薯定,這就形成了一個(gè)刪除任意文件的漏洞(不過(guò)這個(gè)CMS做了全局的文件訪問(wèn)權(quán)限控制始绍,此文件僅限管理員可以訪問(wèn),配合?CSRF?可以實(shí)現(xiàn)任意文件刪除3吝搿)疆虚。
那么Payload:
POST http://www.test.com/admin/?act=dell_all_bak
data:bak=../index.php
構(gòu)造一個(gè)?CSRF?網(wǎng)頁(yè),發(fā)到各大?emlog?QQ交流群满葛、論壇等等去径簿,emmmm~(太危險(xiǎn),不建議這樣做嘀韧,別說(shuō)是我說(shuō)的)篇亭。
那么修復(fù)的方法,自然是加上一個(gè)?TOKEN?身份判斷锄贷!
最后補(bǔ)充?emlog6.0.0?下載地址:點(diǎn)我下載译蒂。
0×04 如何突破文件修改
文件修改,是針對(duì)已存在的文件進(jìn)行修改谊却,比如有的?CMS?可以實(shí)現(xiàn)模版的在線編輯柔昼,利用一些規(guī)則特性可以直接寫(xiě)入木馬。當(dāng)然還有備份文件炎辨,配置文件捕透。
常見(jiàn)于一些配置文件沒(méi)有過(guò)濾參數(shù),使得單雙引號(hào)被閉合碴萧,寫(xiě)入小馬到配置文件乙嘀。
修改文件的時(shí)候,可能會(huì)遇到一些權(quán)限不足破喻,沒(méi)法兒寫(xiě)入的問(wèn)題虎谢,一般會(huì)尋找images,uplaod曹质,logs婴噩,runtime等可以執(zhí)行寫(xiě)操作的目錄(尋找方式也比較簡(jiǎn)單擎场,查看文章圖片的?URL,用戶頭像?URL等等)
此漏洞就不做實(shí)戰(zhàn)演示了讳推,基本都是配合上傳文件使用顶籽,比如某些?CMS?提供插件安裝,插件市場(chǎng)有修改模版文件的一些插件银觅,emmm~礼饱,好心幫助站長(zhǎng)安裝一個(gè),然后編輯一下究驴,Webshell就到手了镊绪!
0×05 如何突破文件讀取
文件的讀取,包括列目錄洒忧、讀取任意文件內(nèi)容蝴韭、任意文件包含、任意文件下載熙侍。任意文件讀取/包含漏洞常常在實(shí)戰(zhàn)場(chǎng)景有非常大的用處榄鉴,在尋找文件讀取漏洞的時(shí)候,需要根據(jù)網(wǎng)站的類型及CMS去代碼審計(jì)或者尋找?indexOf?列目錄尋找可能存在任意文件包含讀取的特殊文件蛉抓,比如一些:?file.php,download.php
通過(guò)御劍掃描庆尘,掃描到一些數(shù)據(jù)庫(kù)、源碼備份文件巷送,來(lái)一次代碼審計(jì)驶忌,那就賺大發(fā)了。
找到任意文件包含的漏洞笑跛,配合上傳圖片馬付魔,就可以輕松實(shí)現(xiàn)?Getshell,想想就覺(jué)得美滋滋~
在文件包含上飞蹂,可能存在一些無(wú)法讀取几苍,文件名限制等等,該如何處理吶陈哑?
實(shí)戰(zhàn)示例
簡(jiǎn)單構(gòu)造了一個(gè)典型的文件包含漏洞擦剑,簡(jiǎn)單看看利用?PHP?偽協(xié)議怎么玩兒?
<?php
//D:/server/htdocs/test/test.php
// 文件包含
@$file = isset($_GET[file])?$_GET['file']:'test.php';
include_once($file);
echo "這個(gè)文件可以包含任意的文件(⊙o⊙)哦芥颈!";
?>
在PHP中,include?和?require?兩個(gè)文件包含函數(shù)赚抡,將包含進(jìn)來(lái)的代碼當(dāng)作可執(zhí)行PHP代碼執(zhí)行爬坑,所以無(wú)論我們包含的文件格式后綴是什么,都會(huì)當(dāng)作?PHP代碼來(lái)執(zhí)行涂臣,即使是一個(gè)?txt?文件盾计。
在?upload/?文件夾下情況:
其中?shell.zip?是一個(gè)內(nèi)含名為?shell.php?的?zip?格式壓縮包售担。
開(kāi)始利用
第一種:讀取?hourse.jpg,通過(guò)圖片馬包含執(zhí)行署辉,$_GET?是一個(gè)超全局變量族铆,所以在包含的?shell.php?文件也可以接收參數(shù)?x執(zhí)行:
Payload:?http://www.test.com/test.php?file=upload/hourse.jpg&x=phpinfo()
第二種:文件協(xié)議讀取
其前提是得知道網(wǎng)站應(yīng)用的絕對(duì)路徑(物理路徑):
Payload:?http://www.test.com/test.php?file=file://D:/Server/htdocs/test/upload/hourse.jpg&x=phpinfo()
結(jié)果和上圖一樣,只是地址欄鏈接不一樣哭尝。
第三種:壓縮包文件讀取
依然需要知道壓縮包文件的絕對(duì)路徑:
第四種:phar://相對(duì)路徑運(yùn)行PHP文件
當(dāng)我們想要運(yùn)行自己的PHP文件哥攘,該咋做吶?通過(guò)文件包含(include,require這類函數(shù))材鹦,首先構(gòu)造一個(gè)這樣的文件逝淹,將?webshell.php?添加到壓縮文件?.zip,然后將壓縮包后綴名改為.jpg反正合法的文件后綴即可(一般的操作是這樣的桶唐,當(dāng)只能上傳圖片的時(shí)候)栅葡,最后使用phar://按照相對(duì)路徑讀取并執(zhí)行文件。
Payload:http://www.test.php?file=phar://upload/shell.jpg/shell.php?x=phpinfo()
第五種:讀取源碼
當(dāng)我們沒(méi)法兒上傳文件尤泽,但是又想讀取文件的源碼來(lái)尋找別的漏洞從而進(jìn)一步利用該怎么做吶欣簇?同樣的利用?php://filter/?協(xié)議可以實(shí)現(xiàn),要注意的是坯约,因?yàn)榫幋a問(wèn)題熊咽,一般我們會(huì)將讀取的文件先?Base64?編碼一下輸出:
Payload:http://www.test.com/test.php?file=php://filter/read=convert.base64-encode/resource=upload/shell.php
補(bǔ)充PHP偽協(xié)議的知識(shí):《PHP之偽協(xié)議深入理解》
0×06 簡(jiǎn)述突破攔截
某些網(wǎng)站總是存在一些“看門狗”和“XX盾”,攔截可謂是相當(dāng)?shù)谋┝淼辍?duì)于攔截來(lái)說(shuō)网棍,分兩種:一種是基于文件后綴,另一種是基于文件內(nèi)容妇智。
1.基于文件后綴:
一般來(lái)說(shuō)滥玷,在配置都是白名單的方式,我們可以?Fuzz?測(cè)試一下巍棱,可上傳文件類型惑畴,再配合上述說(shuō)到的方法,嘗試去繞過(guò)航徙。
2.基于文件內(nèi)容:
這種方式一定程度上減少了誤報(bào)如贷,根據(jù)一些表哥的經(jīng)驗(yàn):程序開(kāi)發(fā)人員會(huì)犯什么錯(cuò)誤,這樣的錯(cuò)誤我們是否可以利用起來(lái)到踏?比如?preg_replace('/e','',"$GET['x']")杠袱,反序列化,遠(yuǎn)程讀取文件窝稿,本地文件包含楣富,小馬混淆加密加殼,關(guān)鍵詞拆分替換組合等等伴榔,還有很多很多的騷思路纹蝴,歡迎各位表哥一起探討庄萎。
0×07 總結(jié)
總結(jié)了文件操作方面的漏洞,以及單純從文件操作上來(lái)獲取SHELL塘安,但真實(shí)的環(huán)境糠涛,我們常常是多種類型的漏洞組合利用,比如SQL注入寫(xiě)文件兼犯,命令執(zhí)行漏洞權(quán)限高可不直接就拿下服務(wù)器了么忍捡,服務(wù)器存在進(jìn)程溢出的程序,直接?MSF?給打過(guò)去免都,之后就是內(nèi)網(wǎng)一把梭锉罐。滲透測(cè)試,是一次充分活躍思維绕娘,跳出局限的腦力活動(dòng)脓规,不斷總結(jié)經(jīng)驗(yàn),才會(huì)不斷進(jìn)步险领,共勉侨舆!