原文地址:https://xz.aliyun.com/t/6357
1. 文件上傳漏洞
1.1 漏洞簡介
? 文件上傳,顧名思義就是上傳文件的功能行為,之所以會被發(fā)展為危害嚴重的漏洞号俐,是程序沒有對訪客提交的數(shù)據(jù)進行檢驗或者過濾不嚴固灵,可以直接提交修改過的數(shù)據(jù)繞過擴展名的檢驗磷杏。文件上傳漏洞是漏洞中最為簡單猖獗的利用形式,一般只要能上傳獲取地址庇楞,可執(zhí)行文件被解析就可以獲取系統(tǒng)WebShell榜配。
1.2 漏洞原理
? 網(wǎng)站W(wǎng)EB應用都有一些文件上傳功能,比如文檔吕晌、圖片蛋褥、頭像、視頻上傳睛驳,當上傳功能的實現(xiàn)代碼沒有嚴格校驗上傳文件的后綴和文件類型時烙心,就可以上傳任意文件甚至是可執(zhí)行文件后門膜廊。
1.3 漏洞危害
? 惡意文件傳遞給解釋器去執(zhí)行,之后就可以在服務器上執(zhí)行惡意代碼淫茵,進行數(shù)據(jù)庫執(zhí)行爪瓜、服務器文件管理,服務器命令執(zhí)行等惡意操作匙瘪。根據(jù)網(wǎng)站使用及可解析的程序腳本不同钥勋,可以上傳的惡意腳本可以是PHP、ASP辆苔、JSP、ASPX文件等扼劈。
2. 上傳點和繞過形式
2.1 文件上傳常見點
上傳頭像
上傳相冊
上傳附件
添加文章圖片
前臺留言資料上傳
編輯器文件上傳
......
例如如下編輯器上傳點:
文件管理處文件上傳:
前臺用戶發(fā)表文章處文件上傳:
個人頭像處文件上傳:
2.2 后綴繞過
PHP:
php2驻啤、php3、php5荐吵、phtml骑冗、pht(是否解析需要根據(jù)配置文件中設置類型來決定)
ASP:
asa、cer先煎、cdx
ASPX:
ascx贼涩、ashx、asac
JSP:
jsp薯蝎、jspx遥倦、jspf
2.3 繞過類型
Content-Type繞過
前端繞過
文件解析規(guī)則繞過
Windows環(huán)境特性繞過
文件名大小寫繞過
雙寫繞過
點空格繞過
文件頭繞過
條件競爭繞過
......
在以下的文章介紹中,將采取其中的幾種常見的繞過形式做演示占锯。
3. 漏洞在系統(tǒng)中的差異
? 上傳文件漏洞在不同的系統(tǒng)袒哥、架構(gòu)以及行為中,利用形式也是各不相同消略。常用的web容器有IIS堡称、Tomcat、Nginx艺演、Apache等却紧。以下主要以比較經(jīng)典的解析漏洞做解釋。
3.1 IIS 5.x/6.0解析漏洞
1胎撤、當創(chuàng)建.asp的文件目錄的時候晓殊,在此目錄下的任意文件,服務器都解析為asp文件哩照。例如如下:
漏洞目錄利用形式:www.xxx.com/xx.asp/xx.jpg挺物。
xx.jpg的內(nèi)容可以為一段合法的asp腳本文件。
2飘弧、服務器默認不解析”;“以后的內(nèi)容识藤,導致xx.asp;.jpg被解析成xx.asp
漏洞文件利用形式:www.xxx.com/xx.asp;.jpg
xx.jpg的內(nèi)容可以為一段合法的asp腳本文件砚著。
漏洞產(chǎn)生的原因參考詳細文章內(nèi)容:https://www.cnblogs.com/l1pe1/p/9210094.html
通過對IIS6的核心文件類型解析相關文件的逆向后,整理出下面的核心處理代碼痴昧。
//reverse code by golds7n with ida
int __thiscall Url(void *this, char *UrlStruct)
{
void *pW3_URL_INFO; // esi@1
int bSuccess; // eax@1
const wchar_t *i; // eax@2
wchar_t *wcsSlashTemp; // ebx@6
int wcsTemp; // eax@6
int wcs_Exten; // eax@6
int v8; // esi@9
int v10; // eax@11
int v11; // ST04_4@13
int v12; // eax@13
int ExtenDll; // eax@19
int Extenisa; // eax@20
int ExtenExe; // eax@21
int ExtenCgi; // eax@22
int ExtenCom; // eax@23
int ExtenMap; // eax@24
int Entry; // [sp+Ch] [bp-148h]@6
wchar_t *wcsMaohaoTemp; // [sp+10h] [bp-144h]@6
unsigned int dotCount; // [sp+14h] [bp-140h]@1
wchar_t *Str; // [sp+18h] [bp-13Ch]@3
char *url_FileName; // [sp+1Ch] [bp-138h]@1
char Url_FileExtenName; // [sp+20h] [bp-134h]@1
char v25; // [sp+50h] [bp-104h]@1
dotCount = 0;
pW3_URL_INFO = this;
STRU::STRU(&Url_FileExtenName, &v25, 0x100u);
url_FileName = (char *)pW3_URL_INFO + 228;
bSuccess = STRU::Copy((char *)pW3_URL_INFO + 228, UrlStruct);
if ( bSuccess < 0 )
goto SubEnd;
for ( i = (const wchar_t *)STRU::QueryStr((char *)pW3_URL_INFO + 228); ; i = Str + 1 )
{
Str = _wcschr(i, '.'); ***********N1************
if ( !Str )
break;
++dotCount;
if ( dotCount > W3_URL_INFO::sm_cMaxDots )
break;
bSuccess = STRU::Copy(&Url_FileExtenName, Str);
if ( bSuccess < 0 )
goto SubEnd;
wcsSlashTemp = _wcschr(Str, '/'); ***********N2************
JUMPOUT(wcsSlashTemp, 0, loc_5A63FD37);
wcsTemp = STRU::QueryStr(&Url_FileExtenName);
wcsMaohaoTemp = _wcschr((const wchar_t *)wcsTemp, ':'); ***********N3************
JUMPOUT(wcsMaohaoTemp, 0, loc_5A63FD51);
wcs_Exten = STRU::QueryStr(&Url_FileExtenName);
__wcslwr((wchar_t *)wcs_Exten);
if ( META_SCRIPT_MAP::FindEntry(&Url_FileExtenName, &Entry) )
{
*((_DWORD *)pW3_URL_INFO + 201) = Entry;
JUMPOUT(wcsSlashTemp, 0, loc_5A63FDAD);
STRU::Reset((char *)pW3_URL_INFO + 404);
break;
}
if ( STRU::QueryCCH(&Url_FileExtenName) == 4 )
{
ExtenDll = STRU::QueryStr(&Url_FileExtenName);
if ( !_wcscmp(L".dll", (const wchar_t *)ExtenDll)
|| (Extenisa = STRU::QueryStr(&Url_FileExtenName), !_wcscmp(L".isa", (const wchar_t *)Extenisa)) )
JUMPOUT(loc_5A63FD89);
ExtenExe = STRU::QueryStr(&Url_FileExtenName);
if ( !_wcscmp(L".exe", (const wchar_t *)ExtenExe)
|| (ExtenCgi = STRU::QueryStr(&Url_FileExtenName), !_wcscmp(L".cgi", (const wchar_t *)ExtenCgi))
|| (ExtenCom = STRU::QueryStr(&Url_FileExtenName), !_wcscmp(L".com", (const wchar_t *)ExtenCom)) )
JUMPOUT(loc_5A63FD89);
ExtenMap = STRU::QueryStr(&Url_FileExtenName);
JUMPOUT(_wcscmp(L".map", (const wchar_t *)ExtenMap), 0, loc_5A63FD7B);
}
}
if ( *((_DWORD *)pW3_URL_INFO + 201)
|| (v10 = *((_DWORD *)pW3_URL_INFO + 202), v10 == 3)
|| v10 == 2
|| (v11 = *(_DWORD *)(*((_DWORD *)pW3_URL_INFO + 204) + 0xC4C),
v12 = STRU::QueryStr(url_FileName),
bSuccess = SelectMimeMappingForFileExt(v12, v11, (char *)pW3_URL_INFO + 756, (char *)pW3_URL_INFO + 1012),
bSuccess >= 0) )
v8 = 0;
else
SubEnd:
v8 = bSuccess;
STRU::_STRU(&Url_FileExtenName);
return v8;
}
以上有三處被標記的位置稽穆,這三處是用來檢測點號赶撰、反斜杠否灾、分號。统刮、
可以理解為的檢測流程為:
www.xxx.com/xxx.asp;xxx.jpg
N1:從頭部查找查找"."號,獲得".asp;xxxx.jpg"
N2:查找";"號,如果有則內(nèi)存截斷
N3:查找"/",如果有則內(nèi)存截斷
因此,.asp將最終被保存下來炬丸,IIS6只簡單地根據(jù)擴展名來識別,所以從腳本映射表中里查找腳本與擴展名對比钥飞,并利用asp.dll來解析膀估。導致最終的問題產(chǎn)生具则。
對于此問題,微軟并不認為這是一個漏洞佣耐,同樣也沒推出IIS6.0解析漏洞的補丁薛窥。因此在IIS6.0的網(wǎng)站下,此問題仍然可以嘗試是否存在眼姐。
3.2 Nginx 解析漏洞
? Nginx是一個高性能的HTTP和反向代理web服務器诅迷,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點開發(fā)的众旗。
? 在低版本Nginx中存在一個由PHP-CGI導致的文件解析漏洞听皿。為什么是由于PHP-CGI的原因呢扒寄,因為在PHP的配置文件中有一個關鍵的選項cgi.fix_pathinfo在本機中位于php.ini配置文件中,默認是開啟的,當URL中有不存在的文件時侄旬,PHP就會默認向前解析钻注。
? 普遍的做法是在Nginx配置文件中通過正則匹配設置SCRIPT_FILENAME篮撑。訪問 ”www.xx.com/phpinfo.jpg/1.php” 這個URL時逞壁,$fastcgi_script_name會被設置為“phpinfo.jpg/1.php”,然后構(gòu)造成SCRIPT_FILENAME傳遞給PHP-CGI绍弟,但是PHP為什么會接受這樣的參數(shù)技即,并將phpinfo.jpg作為PHP文件解析呢?這就要說到fix_pathinfo這個選項了。如果開啟了這個選項樟遣,那么就會觸發(fā)在PHP中的如下邏輯:PHP會認為SCRIPT_FILENAME是phpinfo.jpg姥份,而1.php是PATH_INFO,所以就會將phpinfo.jpg作為PHP文件來解析了
? 在默認Fast-CGI開啟狀況下上傳名字為xx.jpg,內(nèi)容為:
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
然后訪問xx.jpg/.php,在這個目錄下就會生成一句話木馬shell.php年碘。同樣利用phpstudy說明澈歉,上傳1.jpg格式的文件,內(nèi)容為訪問phpinfo屿衅,如下即可觸發(fā):
3.3 Apache 解析漏洞
? Apache是世界使用排名第一的Web服務器軟件埃难。它可以運行在幾乎所有廣泛使用的計算機平臺上,由于其跨平臺和安全性被廣泛使用,是最流行的Web服務器端軟件之一涡尘。它快速忍弛、可靠并且可通過簡單的API擴充,將Perl/Python等解釋器編譯到服務器中考抄。
? Apache 在1.x和2.x版本中存在解析漏洞细疚,例如如下地址格式:
www.xxxx.com/apache.php.bbb.aaa
Apache從右至左開始判斷后綴,若aaa非可識別后綴川梅,再判斷bbb疯兼,直到找到可識別后綴為止,然后將該可識別后綴進解析贫途,因此如上地址解析為訪問apache.php文件吧彪。
? 那么為什么會產(chǎn)生此問題原因,在Apache的官方網(wǎng)站上丢早,有一句這么關于“extension”的解釋:
地址:http://httpd.apache.org/docs/current/mod/directive-dict.html
extension
In general, this is the part of the filename which follows the last dot. However, Apache recognizes multiple filename extensions, so if a filename contains more than one dot, each dot-separated part of the filename following the first dot is an extension. For example, the filename file.html.en contains two extensions: .html and .en. For Apache directives, you may specify extensions with or without the leading dot. In addition, extensions are not case sensitive.
? 通過這個解釋可以看出來姨裸,Apache允許文件有多個后綴名,并會按照第一個點來分析文件后綴怨酝,例如file.html.en傀缩。Apache按照每個點來分割后綴名,因此此文件名為.html农猬、.en扑毡。由于en后綴不被識別,便繼續(xù)向前解析盛险。
? 另外對于Apache解析漏洞的正確說法應該是,使用module模式與php結(jié)合的所有版本 apache存在未知擴展名解析漏洞勋又,使用fastcgi模式與php結(jié)合的所有版本apache不存在此漏洞苦掘。而是否解析的后綴名在文件mime.types中查找是否出現(xiàn)。
? 此處使用phpstudy測試楔壤,利用dvwa的文件上傳功能鹤啡,上傳1.php.wwe。結(jié)果解析如下:
4. 測試
以下采用手工測試和工具測試兩種方法來進行文件上傳測試蹲嚣。
4.1 手工測試
對于文件上傳漏洞方式和舉例此處采用一個文件靶場递瑰,地址:https://github.com/c0ny1/upload-labs
以下將利用靶場其中的一部分內(nèi)容來舉例說明文件上傳漏洞的產(chǎn)生和效果。
環(huán)境:Ubuntu 18隙畜、Windows phpStudy (采用不一樣的系統(tǒng)抖部,為了在不同系統(tǒng)的差異做演示)
WEB容器:Apache 2.0
語言:PHP
抓包工具:Burp Suite Pro
驗證工具:Hackbar插件
4.1.1 前端驗證
此種驗證形式在很多網(wǎng)站、CMS都有使用议惰,只在前端利用JS來做效驗慎颗,采用禁用JS上傳、抓包上傳都可以繞過此處限制。此處采用抓包演示俯萎。
點擊上傳文件傲宜,選擇已經(jīng)改成“.jpg”后綴的后門文件。修改burp中的文件后綴信息夫啊。
訪問已經(jīng)上傳的文件函卒,利用Hackbar訪問phpinfo()∑裁校可以看到后門已經(jīng)得到執(zhí)行报嵌。
4.1.2 .htaccess
規(guī)則文件繞過
? 在利用.htaccess文件之前,我們先來了解一下什么是.htaccess規(guī)則文件叛本。.htaccess文件(或者"分布式配置文件"),全稱是Hypertext Access(超文本入口)沪蓬。提供了針對目錄改變配置的方法, 即来候,在一個特定的文檔目錄中放置一個包含一個或多個指令的文件跷叉, 以作用于此目錄及其所有子目錄。作為用戶营搅,所能使用的命令受到限制云挟。
? 概述來說,.htaccess文件是Apache服務器中的一個配置文件转质,它負責相關目錄下的網(wǎng)頁配置园欣。通過htaccess文件,可以幫我們實現(xiàn):網(wǎng)頁301重定向休蟹、自定義404錯誤頁面沸枯、改變文件擴展名、允許/阻止特定的用戶或者目錄的訪問赂弓、禁止目錄列表绑榴、配置默認文檔等功能。
? 在一些啟用了.htaccess文件的網(wǎng)站上就可以使用此文件類型來繞過限制較全面的黑名單過濾盈魁。
? 先上傳一個.htaccess文件翔怎,內(nèi)容為:AddType application/x-httpd-php .aaa
。如下:
? 然后再上傳文件后綴為.aaa的文件杨耙,讓其解析為php類型文件赤套。
? 上傳成功后訪問此上傳文件,訪問如下:
4.1.3 文件名后綴大小寫混合繞過
? 在對后綴的判斷中珊膜,如果只是對字符串進行單獨的比較來判斷是不是限制文件容握,可以采用后綴名大小寫繞過形式。如下形式:
? 訪問上傳成功的文件:
4.1.4 Windows文件流特性繞過
? 在討論這種特性之前车柠,我們先來認識一下Windows文件流唯沮。流文件脖旱,即NTFS交換數(shù)據(jù)流(alternate data streams,簡稱ADS)介蛉,是NTFS磁盤格式的一個特性萌庆,在NTFS文件系統(tǒng)下,每個文件都可以存在多個數(shù)據(jù)流币旧,就是說除了主文件流之外還可以有許多非主文件流寄宿在主文件流中践险,它使用資源派生來維持與文件相關的信息。創(chuàng)建一個數(shù)據(jù)交換流文件的方法很簡單吹菱,命令為“宿主文件:準備與宿主文件關聯(lián)的數(shù)據(jù)流文件”巍虫。
? 詳細相關介紹和內(nèi)容可以查看文章:https://www.freebuf.com/column/143101.html。此處不做深入解釋鳍刷。
上傳文件為xxx.php::data输瓜。
我們訪問的時候就可以直接訪問xxx.php文件瓦胎。
4.1.5 %00截斷繞過
? 以上問題被繞過的根本原因是采用了一些有缺陷的黑名單限制,一般采用白名單的限制會減少相當多的繞過問題產(chǎn)生尤揣,但是并不意味著一定安全港粱,在某些沒有處理嚴格的程序上男旗,仍然可以采用截斷繞過的形式淤毛。
首先我們來看這段上傳的代碼:
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上傳失敗";
}
} else {
$msg = "只允許上傳.jpg|.png|.gif類型文件环葵!";
}
}
可以看出代碼采用的白名單校驗,只允許上傳圖片格式嗜愈,理論上這個上傳是不好繞過的旧蛾。但是后面采用保存文件的時候,是路徑拼接的形式蠕嫁,而路徑又是從前端獲取锨天,所以我們可以采用在路徑上截斷。如下上傳拌阴,顯示文件路徑中有個空格,這并不是真正意義上的空格奶镶,而是%00截斷后顯示成的空格迟赃。
訪問上傳地址路徑:
4.1.6 文件頭檢測繞過
? 提到文件頭檢測,我們就先來認識一下常見文件的文件頭格式厂镇。我們先打開一個正常的JPG圖片格式文件纤壁,查看文件的文件頭十六進制。采用010Editor捺信。
? 右邊欄中有明顯的JFIF存儲格式字樣酌媒,文件頭前十個字節(jié)為FF D8 FF E0 00 10 4A 46 49 46
欠痴,其中開頭標紅的為標記碼,F(xiàn)F D8代表SOI標記秒咨,意思是圖像文件開始值喇辽。4A 46 49 46
代表字符串JFIF標記。
關于JPEG文件格式介紹可以閱讀:https://www.cnblogs.com/sddai/p/5666924.html
? 然后我們再打開一份PNG文件格式的圖片雨席,同樣采用010Editor來查看其十六進制菩咨。
? 對于的開頭4字節(jié)為右欄中‰PNG
字樣,PNG的8字節(jié)文件署名域用來識別該文件是不是PNG文件陡厘。也就是89 50 4E 47 0D 0A 1A 0A
抽米。
關于PNG文件格式可以閱讀:https://blog.csdn.net/qq_21950929/article/details/79198814
? 同樣打開一份GIF文件格式圖片,用010Editor來打開查看文件糙置。
? 文件十六進制中可以看到云茸,其中47 49 46 38 39 61
,代表了右欄中的GIF89a谤饭,這六個字節(jié)作為了GIF文件格式頭的開頭文件标捺。而在其后的繞過中就采用了GIF89a這個字符串。
關于GIF文件格式可以閱讀:http://www.reibang.com/p/df52f1511cf8
了解過文件格式后网持,我們來看這個文件格式檢測繞過形式宜岛,首先查看代碼,為了方便演示修改了源代碼對文件格式的獲取功舀,此處只讀取文件的前兩個字節(jié)值:
function getReailFileType($filename){
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只讀2字節(jié)
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 255216:
$fileType = 'jpg';
break;
case 13780:
$fileType = 'png';
break;
case 7173:
$fileType = 'gif';
break;
default:
$fileType = 'unknown';
}
return $fileType;
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_type = getReailFileType($temp_file);
if($file_type == 'unknown'){
$msg = "文件未知萍倡,上傳失敗辟汰!";
}else{
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1); //此處為了方便演示添加了file_ext 變量
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上傳出錯列敲!";
}
}
}
然后上傳php文件,修改文件內(nèi)容帖汞,添加文件頭GIF89a:
這種添加形式類似于在hex中修改添加:
然后在訪問以上傳的文件:
4.2 利用工具進行FUZZ
? 很多網(wǎng)站對上傳進行攔截的時候采取的是黑名單校驗戴而,當我們看到黑名單的時候就可以考慮采取修改后綴、截斷等方式嘗試繞過翩蘸。
? 我們采用一個工具:https://github.com/c0ny1/upload-fuzz-dic-builder 來生成fuzz的字典所意。執(zhí)行命令:
python upload-fuzz-dic-builder.py -n test -a jpg -l php -m apache --os win -o upload_file.txt
? 把生成的字典導入burp中,同時取消payload-encoding的選中狀態(tài)催首。執(zhí)行后可以看到有些php文件上傳成功扶踊。然后訪問其中上傳成功的文件,查看是否執(zhí)行郎任。
訪問如圖中的地址文件秧耗,可以看到上傳成功:
5. 實戰(zhàn)演示
演示漏洞為:CVE-2018-2894
漏洞環(huán)境:Linux Weblogic 12.2
漏洞下載地址:https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2018-2894
漏洞介紹:WebLogic管理端未授權(quán)的兩個頁面存在任意上傳getshell漏洞,可直接獲取權(quán)限舶治。兩個頁面分別為/ws_utc/begin.do分井,/ws_utc/config.do车猬。
影響范圍為:Oracle WebLogic Server,版本10.3.6.0尺锚,12.1.3.0珠闰,12.2.1.2,12.2.1.3缩麸。
下載好vulhub后铸磅,進入相應的CVE目錄,執(zhí)行如下命令:
docker-compose up -d
等到docker構(gòu)建結(jié)束杭朱,會在7001端口開放一個服務阅仔,如下所示:
此處需要登陸賬號和密碼,正常情況下是嘗試弱口令進后臺上傳文件弧械,此處方便演示八酒,從構(gòu)建日志中查看密碼:
docker-compose logs | grep password
查看結(jié)果:
weblogic_1 | ----> 'weblogic' admin password: oZUcqr8j
weblogic_1 | admin password : [oZUcqr8j]
weblogic_1 | * password assigned to an admin-level user. For *
登陸后界面如下:
點擊左側(cè)中的base_domain選項,再點擊下面的高級選項刃唐,從高級中啟用web測試頁羞迷,保存。
然后訪問http://192.168.120.132:7001/ws_utc/config.do頁面画饥,設置Work Home Dir衔瓮,可以看到其中已經(jīng)填寫一個目錄,此目錄訪問需要登陸抖甘,修改為P牛的建議路徑:
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css
原路徑為:
/u01/oracle/user_projects/domains/base_domain/tmp/WSTestPageWorkDir
在當前頁面中選擇安全->添加热鞍,上傳webshell
然后從放回頁面中查看id項時間戳,訪問路徑/ws_utc/css/config/keystore/時間戳_文件名
然后執(zhí)行命令whoami:
6. CMS實戰(zhàn)演示
6.1 PHPOK 任意文件上傳
演示漏洞為:phpok 任意文件上傳
漏洞環(huán)境:Windows phpStudy
漏洞環(huán)境下載:https://download.phpok.com/4.8.338.zip
漏洞介紹:phpok 4.8.338版本管理后臺存在任意文件上傳漏洞衔彻,攻擊者可利用漏洞上傳任意文件薇宠,獲取網(wǎng)站權(quán)限。
下載文件后艰额,把解壓的文件放入phpstudy中的www目錄中澄港,此處修改了版本號目錄為phpok。然后訪問本地地址:http://localhost/phpok柄沮,會自動進入安裝頁面回梧,填寫數(shù)據(jù)庫密碼,創(chuàng)建賬號后自動進入安裝頁面祖搓,安裝完成后顯示如下:
使用一開始創(chuàng)建的賬號密碼登陸狱意,登陸成功后在后側(cè)的選擇欄處選擇工具->附件分類管理。
點擊右側(cè)上方的創(chuàng)建資源分類棕硫,然后在支持的附件類型中創(chuàng)建php文件類型髓涯。
選擇左側(cè)的內(nèi)容管理->資訊中心->行業(yè)管理
點擊頁面中的選擇圖片->上傳附近選擇添加的附件類型->選擇php文件上傳袒啼,上傳成功后點擊上傳的圖片哈扮,選擇預覽就可以看到文件目錄的地址
訪問地址文件后門纬纪,可以看到執(zhí)行代碼成功
漏洞修復:此問題在高版本修復,及時升級到高版本處理滑肉,目前最新版本為5.2.116包各。
6.2 FCKeditor 2.4.3 文件上傳
演示漏洞為:FCKeditor 2.4.3 文件上傳
漏洞環(huán)境:Windows phpStudy
漏洞環(huán)境下載:https://github.com/treadmillian/fckeditor.git
漏洞介紹:FCKeditor /fckeditor/editor/filemanager/upload/php/upload.php 文件上傳漏洞。
首先從GitHub下載文件靶庙,放到phpStudy的www目錄中问畅,同時修改config.php文件,修改UserFilesPath參數(shù)為fck目錄下的地址六荒,可以修改為網(wǎng)站根目錄下的任意目錄中护姆,此處修改如下:
文件地址: \fckeditor\editor\filemanager\browser\default\connectors\php\config.php
訪問地址:http://localhost/fckeditor/editor/filemanager/browser/default/connectors/test.html#
選擇文件上傳,由于2.4.3在文件配置已經(jīng)進行了后綴的限制掏击,默認限制為:
array('html','htm','php','php2','php3','php4','php5','phtml','pwml','inc','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','com','dll','vbs','js','reg','cgi','htaccess','asis','sh','shtml','shtm','phtm')
對于此處漏洞我們采用空格繞過卵皂,先上傳一個JPG的圖片,抓包修改后綴砚亭,添加空格如下:
訪問上傳產(chǎn)生的路徑文件灯变,路徑會顯示在頁面中:
http://localhost/fckeditor/editor/filemanager/browser/default/connectors/uploads/file/05091707156.php
執(zhí)行一句話木馬文件:
漏洞修復:由于此處使用黑名單校驗,可以根據(jù)需要的類型修改為白名單參數(shù)捅膘。
7. 漏洞修復
關于文件上傳漏洞的產(chǎn)生和修改此處討論兩種文件上傳漏洞的情況和修復:
7.1 代碼未判斷文件類型或者文件類型限制不完全添祸,一般這種是黑名單或者沒有限制,建議添加白名單限制參數(shù)數(shù)組寻仗,固定為圖片或文本格式文件刃泌。例如如下:
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上傳失敗";
}
} else {
$msg = "只允許上傳.jpg|.png|.gif類型文件!";
}
}
7.2 如果是使用WEB中間件存在上傳愧沟,或者是CMS存在文件上傳漏洞蔬咬,根據(jù)官方建議安裝補丁升級版本浦辨,或者使用官方推薦的臨時修改策略來限制問題的產(chǎn)生和利用式塌。