天天看點

Web安全—檔案上傳(解析)漏洞

教學目标

了解檔案上傳漏洞原理

掌握幾種檔案上傳繞過方法

一、檔案上傳漏洞介紹

檔案上傳:檔案上傳是現代網際網路常見的功能,允許使用者上傳圖檔、視訊、及其他類型檔案,向使用者提供的功能越多,web受攻擊的風險就越大。

1、檔案上傳漏洞
上傳檔案時,如果未對上傳的檔案進行嚴格的驗證和過濾,就容易造成檔案上傳漏洞,上傳腳本檔案(asp、aspx、php、jsp等)
注:asp,aspx對應iis解析   php對應apache解析  jsp對應java(tomcat)
惡意上傳行為可能導緻網站甚至整個伺服器被控制。惡意的腳本檔案又被稱為Webshell。Webshell具有強大的功能。如檢視伺服器目錄、伺服器中檔案、執行系統指令等。
           

二、JS檢查繞過

1、檢測原理
調用JS的toLowerCase()函數,先将檔案名轉換為小寫,然後通過substr擷取檔案名後面最後一個點号後面的字尾(包括點号)進行判斷。
substr()傳回字元串
           

//enctype=“multipart/form-data” 專門處理檔案上傳的檔案流

//return selectFile() 提供點選送出按鈕,完成檔案上傳

(一)JS繞過

1、網站源碼構造

(1)前端代碼

Web安全—檔案上傳(解析)漏洞

(2)後端代碼

Web安全—檔案上傳(解析)漏洞
2、網站通路前端代碼,浏覽器前端繞過檔案上傳

注:這裡網站的過濾僅為前端過濾,這裡前端代碼隻允許字尾名僞".jpg"的檔案上傳。我們先去嘗試浏覽器前端過濾。

Web安全—檔案上傳(解析)漏洞

如圖:通過F12打開開發者子產品,将onsubmit的值删除,這裡οnsubmit=""調用的函數即為我們編寫的判斷(過濾)方法。将此處值删除後再次點選上傳我們想要上傳的任意檔案,觀察實驗結果并通路上傳後的檔案

Web安全—檔案上傳(解析)漏洞
Web安全—檔案上傳(解析)漏洞

注:這裡我們發現通過修改前端頁面的值,成功上傳并解析了檔案

3、使用burpsuit抓包,這裡必須先上傳jpg格式的檔案

注:這裡我們可以先将我們想要上傳的php檔案字尾直接改為jpg。也可使用合成圖檔碼的方式,抓包後将字尾再改回我們需要上傳的檔案字尾,放包後觀察結果。

Web安全—檔案上傳(解析)漏洞

注:這裡将33.jpg檔案字尾修改回.php後放包,檔案即可成功上傳。

Web安全—檔案上傳(解析)漏洞
Web安全—檔案上傳(解析)漏洞

這裡我們成功上傳并解析了我們想要上傳的檔案,同理,我們可以繞過上傳任何我們想要上傳的任何檔案。

注:圖檔碼合成方法,代碼

1、将圖檔與我們想要合成的代碼放入同一檔案夾下,在檔案夾下打開CMD指令框,輸入下面指令

copy 1.jpg/b +1.php/a 2.jpg

這裡是将1.jpg與1.php檔案合并,生成新圖檔2.jpg

三、檔案字尾繞過

1、檢測原理
通過函數pathinfo()擷取檔案字尾,将字尾轉為小寫後判斷是不是php
           

注:pathinfo() 傳回檔案路徑的資訊

2、繞過方法1
有些中間件允許解析其他檔案字尾的,如在httpd.conf配置檔案中,配置如下代碼,則能解析php、php3、phtml檔案。是以上傳一個字尾名為php3、phphtml的檔案即可繞過黑名單。
           
Web安全—檔案上傳(解析)漏洞

注:這裡添加消息的含義是要能夠解析php3,phtml 這裡是将添加的這兩種字尾按照php檔案解析

3、繞過方法2(apache解析漏洞)
結合Apache檔案解析機制,從右向左開始解析檔案字尾,若字尾名不可識别,則繼續判斷直到遇到可解析的字尾為止,若全部不認識,則會暴露檔案内容。
           
4、繞過方法3(windows特性:檔案流繞過)
在程式開發部署的時候,沒有考慮到系統的特性會導緻限制被繞過,利用windows特性。可以在字尾名中加"."或"::$DATA"繞過
注:這裡我們給檔案名直接加.  windows本身特性會自動删除,限制如此修改檔案字尾,這裡就需要使用burpsuit來進行修改
           

(二)檔案字尾繞過(黑名單繞過)

1、源碼構造

(1)前端代碼

Web安全—檔案上傳(解析)漏洞

(2)後端代碼

Web安全—檔案上傳(解析)漏洞
2、網站通路我們的前端代碼,進行檔案上傳,觀察相關結果
Web安全—檔案上傳(解析)漏洞

注:這裡我們嘗試上傳了.jpg .txt .php這裡我們發現隻有php的檔案無法上傳,通過代碼我們也可以知道,此處是将php的檔案加入了黑名單,不允許字尾為php的檔案上傳。

3、畸形檔案名上傳繞過
這裡我們上傳一個字尾名為php3的檔案,如下圖,我們發現上傳成功,但是通路該檔案時,php檔案未解析。
           
Web安全—檔案上傳(解析)漏洞
Web安全—檔案上傳(解析)漏洞

注:我們此子產品的内容主要講檔案解析及上傳,這裡檔案上傳已經成功,接下來要做的就是檔案解析

4、根據課件筆記提示,修改httpd.conf配置檔案

(1)打開phpstudy面闆,點選【設定】–>【配置檔案】–>【httpd.conf】–>點選apache的版本 打開檔案

Web安全—檔案上傳(解析)漏洞

(2)在檔案處使用Ctrl+F 進行查找,先去查找AddType

如圖:找到如下内容,在下面加入以下3條指令

Web安全—檔案上傳(解析)漏洞
AddType application/x-http-php .php
AddType application/x-http-php .php3
AddType application/x-http-php .phtml
           
Web安全—檔案上傳(解析)漏洞

注:這裡添加消息的含義是要能夠解析php3,phtml 這裡是将添加的這兩種字尾按照php檔案解析

5、修改完配置檔案後,重新開機apache服務,重新通路剛才上傳成功的.php3檔案

這裡我們再次通路上傳的.php3可以發現php檔案可以正常解析。

6、apache解析漏洞

修改檔案名為.php.XX 這裡XX可以是數字,也可以是字母,根據apache解析漏洞來進行上傳繞過

7、windows特性繞過
使用burpsuit抓包來對檔案字尾進行修改 可以在字尾名中加"."或"::$DATA"繞過
           

繞過上傳成功後在檔案根目錄注意觀察我們上傳檔案的字尾名。

Web安全—檔案上傳(解析)漏洞
Web安全—檔案上傳(解析)漏洞
Web安全—檔案上傳(解析)漏洞

四、檔案類型繞過

1、檢測原理
判斷$_FILES["file"]["type"]是不是圖檔格式(image/gif、image/jpeg、image/pjpeg),不是則不允許上傳。
$_FILES["file"]["type"]的值是從請求資料包中Content-type中擷取的
           

注:我們這裡的類型檢測,也是有相應的配置檔案與之對應的,檢測檔案類型的配置檔案為mime.types 檔案位置為:

D:\phpstudy_pro\Extensions\Apache2.4.39\conf\mime.types

Web安全—檔案上傳(解析)漏洞

注:這裡我們可以看到各種檔案類型與對應關系

2、繞過方法1
通過抓取資料請求包,上傳php檔案時,Content-Type值為application/octer-stream,上傳jpg的檔案時Content-Type值為image/jpeg。可修改檔案類型進行繞過。
           
3、繞過方法2
如果代碼使用getimagesize()函數擷取圖檔的寬高等資訊,如果上傳的不是圖檔,那麼則擷取不到資訊。
           

在圖檔檔案腳本檔案開頭補充圖檔對應的頭部值,或在圖檔後寫入腳本代碼(這裡就是第一節課講過的圖檔+代碼合成新圖檔的知識子產品)

(1)方法1 這裡我們将檔案頭部值寫入檔案即可

注:下圖顯示的47 49 46……這些是16進制數,可以通過01編輯器進行編輯,我們通過nt++編輯時可直接在代碼前面編寫GIF89a,我們可以通過編碼轉換進行驗證。

Web安全—檔案上傳(解析)漏洞

(2)方法2 合成圖檔這種方法前面已經講過,這裡不再講。下面再将一種方式

直接将圖檔使用記事本模式打開,在亂碼後面直接加入我們需要加入的PHP代碼。

注:這裡我們修改完後檔案字尾名依舊是.JPG 我們雖然修改了檔案内容,但是上傳成功後.JPG檔案依舊無法解析。這裡我們要将添加完代碼的圖檔字尾名改為.php後再次上傳,上傳後即可實作解析。但這裡操作沒有方法1友善,操作時也可将合成圖檔上傳後,在burpsuit中将字尾名改為php後放包,即可實作上傳繞過,也可實作解析。

(三)檔案類型繞過(白名單繞過)

1、源碼構造

(1)前端代碼

Web安全—檔案上傳(解析)漏洞

(2)後端代碼

Web安全—檔案上傳(解析)漏洞
2、通路源檔案,上傳各種類型檔案并觀察結果

這裡我們發現,無論是上傳jpg/png…凡是圖檔類型的檔案均可上傳,php/txt…其他類型檔案均不能上傳。通過代碼我們可以發現,這裡是通過白名單的方式,隻允許圖檔類型的檔案上傳,隻有在白名單之内的檔案才可以上傳,這裡我們發現,單純通過浏覽器,網頁前端,我們無法做任何繞過與修改。我們依舊需要使用burpsuit抓包的方式去進行繞過。

3、使用burpsuit抓包,修改檔案類型進行上傳繞過
Web安全—檔案上傳(解析)漏洞

(1)将檔案類型修改為Content-Type:image/jpeg放包後觀察是否檔案上傳成功

Web安全—檔案上傳(解析)漏洞
Web安全—檔案上傳(解析)漏洞

注:這裡我們發現檔案不僅上傳成功,并且成功解析

(四)檔案類型繞過(getimagesize繞過)

1、檔案代碼構造

(1)網站前端代碼構造

Web安全—檔案上傳(解析)漏洞

(2)網站後端代碼構造

Web安全—檔案上傳(解析)漏洞
2、 在圖檔檔案腳本檔案開頭補充圖檔對應的頭部值,進行繞過
Web安全—檔案上傳(解析)漏洞

這裡我們可以看到檔案成功繞過并上傳,通路檔案,觀察結果

Web安全—檔案上傳(解析)漏洞
3、合成圖檔碼,使用burpsuit抓包後,修改檔案字尾名,放包觀察實驗結果
Web安全—檔案上傳(解析)漏洞

如圖:圖檔亂碼後面就是我們寫入的代碼,根據圖檔步驟,抓包後修改字尾,放包,觀察結果

Web安全—檔案上傳(解析)漏洞

可以看到放包後成功上傳,通路該檔案,檢視能否成功解析執行

Web安全—檔案上傳(解析)漏洞

可以看到這裡檔案成功解析,圖檔在檔案中為亂碼形式,後面加入的php代碼phpinfo();成功解析

五、檔案截斷繞過

1、檢測原理
由于00代表結束符,PHP會把00後面的所有字元删除
           

截斷條件:PHP版本小于5.3.4、magic_quotes_gpc為OFF狀态

注:magic_quotes_gpc參數設定在phpstudy面闆中【設定】–>【配置檔案】–>【php.ini】–>【php5.2.17nts】打開檔案,然後查找(Ctrl+F)magic_quotes_gpc參數設定為OFF

這裡必須要下載下傳一個版本低于5.3.4的php,然後将網站的php版本修改為低版本。

Web安全—檔案上傳(解析)漏洞

注:魔術引号:magic_quotes_gpc=On時,會把引号進行轉義。 php版本更新後将magic_quotes_gpc函數丢棄,使用了新的轉義函數。

2、繞過方法

GET方法中加入%00截斷

POST方法中傳入00并解碼

注:我們上傳的檔案進行了重命名,是以才會有我們的上傳00截斷

(五)00截斷(GET)

1、網站源碼構造
Web安全—檔案上傳(解析)漏洞
2、通路網站,上傳相關檔案,觀察總結

這裡通過上傳我們發現,隻有白名單内的檔案字尾才能夠上傳,白名單外的檔案(如php)均不可上傳。我們通過浏覽器前端也無法再做什麼其他可繞過的方式,我們通過抓包去嘗試繞過。

Web安全—檔案上傳(解析)漏洞

如圖:上圖示記的地方是GET方式的GET請求表單,在jieduan=./upload/後加上2.php後放包進行觀察

Web安全—檔案上傳(解析)漏洞

注:我們這裡上傳了一個圖檔碼

放包後我們可以看到檔案上傳成功,但是我們上傳的檔案名這裡重疊了一個2.php(802020…)我們正常通路這個檔案依舊可以解析,解析後是一個圖檔。我們接下來嘗試去00截斷

3、上傳圖檔碼(内含代碼),通過burPOSTpsuit抓包使用00截斷進行繞過
Web安全—檔案上傳(解析)漏洞

如圖:在GET請求後加入2.php%00 後放包,觀察我們的頁面

Web安全—檔案上傳(解析)漏洞

如圖,根據回顯檔案位址,去通路該檔案

Web安全—檔案上傳(解析)漏洞

這裡我們發現回顯的檔案404錯誤,找不到檔案

4、去掉php後面的一長串字元串,僅通路php檔案
Web安全—檔案上傳(解析)漏洞

這裡我們發現,我們成功上傳并解析了剛才上傳的圖檔碼,這裡就是00截斷的一種繞過方式(GET方式)

(五)00截斷(POST)

1、網站源碼構造
Web安全—檔案上傳(解析)漏洞
2、點選通路檔案,上傳相應檔案,并觀察總結

這裡我們依舊發現隻有白名單内的檔案允許上傳,其他檔案均不允許上傳

3、使用burpsuit抓取資料包,并觀察與GET方式的不同
Web安全—檔案上傳(解析)漏洞

注:這裡我們發現POST請求與GET請求的不同之處。首先是URL處不帶請求,但是文本内容重點出現了./upload 這裡便是我們的POST請求,POST請求需要

4、在Raw視圖下将"./upload" 修改為"./upload/2.php00"并在Hex視圖下修改0處編碼
Web安全—檔案上傳(解析)漏洞
Web安全—檔案上傳(解析)漏洞

如圖,找到上步修改檔案名的位置,修改00處的編碼為00(30–>00)前面我們給php後面加的00是為了更快更準确的找到檔案字尾名所在的位置。16進制修改為00後再去觀察Raw視圖

如圖:修改完成後我們輸入的00會轉換為兩個框型圖案

5、釋放修改後的資料包,驗證是否上傳并解析成功。
Web安全—檔案上傳(解析)漏洞

如圖,我們看到檔案上傳成功,同上面操作過程,檢驗檔案是否能夠正常解析

Web安全—檔案上傳(解析)漏洞

這裡我們看到檔案成功上傳并成功解析,00截斷成功

六、檔案内容繞過

1、檢查原理
一些網站檔案檢測邏輯是先允許上傳任意檔案,然後檢查檔案内容是否包含可執行腳本,如果包含則删除。這裡使用sleep()函數來模拟判斷是否含有腳本所需要的時間。
           
2、繞過方法
利用成功上傳到删除的時間差,上傳一個.php檔案,在未删除之前立即通路,則會自動生成一個新php檔案,新檔案不會被删除。
           

(六)檔案内容繞過

1、源碼構造

(1)前端代碼

Web安全—檔案上傳(解析)漏洞

(2)後端代碼

Web安全—檔案上傳(解析)漏洞
2、點選通路檔案,上傳相應檔案,并觀察總結

這裡我們發現任意檔案均可上傳,這裡上傳時我們需要等待10s才可上傳成功,這裡我們模拟檔案上傳,上傳後再經過檢查将檔案删除的過程。

3、上傳下面代碼,點選通路該檔案,即可成功生成shell.php
這裡可以在10s等待,檔案還未上傳成功時,點選通路,即可生成新檔案shell.php
           

注:這裡是模拟競争上傳環境,我們一邊上傳,系統會自動删除我們上傳的檔案,這裡就需要快速通路上傳檔案,隻要通路到剛才上傳的檔案,即可實作我們想要寫入的檔案生成。

Web安全—檔案上傳(解析)漏洞

點選通路上傳後檔案,看是否會生成新的檔案

Web安全—檔案上傳(解析)漏洞

如圖,這裡的shell.php是我們通路上一步上傳檔案後生成的新檔案,這裡檔案内容可以自行控制,可以寫入我們想要的任何檔案。