檔案上傳漏洞&靶場通關詳解

hackerT發表於2024-12-01

檔案上傳漏洞&靶場通關詳解

什麼是檔案上傳漏洞?

大部分網站都擁有上傳檔案的部分,檔案上傳漏洞是由於網站開發者對使用者上傳檔案的過濾不夠嚴格,攻擊者可以透過這些漏洞上傳可執行檔案(如木馬,惡意指令碼和WebShell等等),從而達到隨意控制網站的目的。
img

檔案上傳漏洞有哪些危害?

攻擊者可以透過這些漏洞上傳可執行檔案(如php),使伺服器被控制,從而使攻擊者能夠植入後門程式,竊取敏感資訊,侵犯使用者隱私,上傳惡意軟體,造成資料篡改和損壞等等。

檔案上傳的過程?

使用者傳送的檔案被伺服器接收——>經過網站檢測——>產生臨時檔案——>移動到指定路徑
img

什麼是WebShell?

WebShell是攻擊者成功入侵網站後留下的後門程式,通常由asp,jsp和php編寫。攻擊者能夠隨時透過WebShell進入網站後端,隨意檢視和控制網站內容。
WebShell的分類如下:
img

檔案上傳漏洞的方法

img
接下來就圍繞以上型別進行介紹:

前端檢測

判斷

直接檢視:在瀏覽器中右鍵點選頁面,選擇 “檢視原始碼” 或 “檢查”,開啟開發者工具並切換到 “Sources” 或 “程式碼” 選項卡。然後搜尋與檔案上傳相關的 JavaScript 函式,通常會有一些函式用於驗證上傳檔案的型別、大小等屬性。比如,可能會找到名為 validateFileUpload 或類似名稱的函式,這很可能就是用於前端驗證的函式。

查詢特定關鍵詞:使用瀏覽器的搜尋功能(通常是快捷鍵 Ctrl+F 或 Command+F)在原始碼中查詢與檔案上傳驗證相關的關鍵詞,如 upload、file、validate、check 等,結合這些關鍵詞來定位前端驗證的 JavaScript 程式碼部分。

用瀏覽器開發者工具:開啟瀏覽器的開發者工具,切換到 “Network” 選項卡,然後嘗試上傳一個檔案。觀察在檔案上傳過程中發起的網路請求,檢視請求頭和請求體中的資訊。如果在請求傳送之前有 JavaScript 程式碼對檔案進行了驗證,那麼在請求頭或請求體中可能會體現出驗證的結果或相關引數。例如,可能會看到一個名為 X-File-Validated 的請求頭,其值表示檔案是否透過了前端驗證。

藉助抓包工具:除了瀏覽器開發者工具外,還可以使用專業的抓包工具,如 Wireshark 或 Fiddler。透過這些工具捕獲檔案上傳時的網路資料包,分析其中的 HTTP 請求和響應,以確定是否存在前端 JavaScript 驗證。如果有前端驗證,通常會在請求傳送之前看到一些與驗證相關的 JavaScript 操作。

嘗試繞過驗證:選擇一個不符合頁面要求的檔案進行上傳,例如檔案型別不被允許或者檔案大小超過限制。如果頁面只是簡單地彈出一個提示框告知檔案不符合要求,而沒有將檔案真正上傳到伺服器進行驗證,那麼很可能是使用了前端 JavaScript 進行驗證。因為如果是後端驗證,通常會先將檔案上傳到伺服器,然後伺服器再返回驗證結果。

修改前端程式碼:透過瀏覽器開發者工具找到與檔案上傳驗證相關的 JavaScript 程式碼,嘗試修改其中的驗證邏輯,例如將檔案型別的限制條件修改為允許所有型別的檔案。然後再次上傳檔案,如果此時檔案能夠成功上傳,而在修改程式碼之前不能上傳,那麼就可以確定該頁面使用了前端 JavaScript 驗證。

繞過方法

禁用JS檢測
1.F12開啟開發人員選項,右上角三個點開啟設定,禁用js
img
2.瀏覽器搜尋url:about:config,搜尋JavaScript,雙擊關閉

img

第一關

新建php檔案,寫入一句話木馬
img
禁用JS後上傳一句話木馬,之後直接用蟻劍連線即可
img

還有另外一種方法第三關提到

後端檢測

Content-Type檢測

原理

後端透過檢查HTTP請求頭中的Content-Type欄位來確定上傳檔案的型別。伺服器是透過ent-type判斷型別,content-type在客戶端可被修改,因此可以繞過。

第二關

根據以下程式碼可知檢測Content-Type確定檔案型別
img
則可以上傳php一句話木馬,用bp抓包,修改Content-Type為程式碼中任意一種,即可繞過
img

也可以直接上傳圖片馬,修改字尾為php,第三關會詳細介紹

黑名單繞過

黑名單

檔案上傳黑名單‌是指在檔案上傳過程中,伺服器明確禁止上傳的檔案型別列表。

第三關

img
分析原始碼可知後端將檢測檔案字尾型別,以上四種檔案字尾不被伺服器所接受,這時就可以透過上傳可支援檔案,之後抓包修改字尾實現繞過,如(phtml,php3,php5等等).
這裡我們嘗試phtml
先上傳php木馬,bp抓包改字尾
img
蟻劍連線失敗
![img](https://img2023.cnblogs.com/blog/3542155/202411/3542155-20241127230318243-424320538.
檢查配置檔案
img
img
發現phtml被註釋,開啟這串程式碼,重啟phpstudy,再次嘗試,成功連線蟻劍
img

.htaccess繞過

htaccess定義及作用

.htaccess檔案(或者分散式配置檔案),全稱是Hypertext Access(超文字入口)。提供了針對目錄改變配置的方法, 即,在一個特定的文件目錄中放置一個包含一個或多個指令的檔案, 以作用於此目錄及其所有子目錄。作為使用者,所能使用的命令受到限制。
透過htaccess檔案,可以幫我們實現:網頁301重定向、自定義404錯誤頁面、改變副檔名、允許/阻止特定的使用者或者目錄的訪問、禁止目錄列表、配置預設文件等功能。

繞過方法

因為.htaccess檔案擁有改變檔案字尾的作用,因此當改檔案未被禁止時,我們就可以透過上傳該類檔案實現改變隨後上傳檔案字尾的目的,從而繞過黑名單。

第四關

img
檢查原始碼,發現是檢測字尾是否在黑名單之中,黑名單中沒有.htaccess,則可以利用該漏洞入侵伺服器。
先新建.htaccess檔案,寫入如下內容img
作用是讓png,txt檔案也可以執行php檔案功能,也可以刪除這串程式碼中的最後.png .txt,表示將隨後上傳的所有檔案當作php檔案處理。
先上傳該檔案,再上傳黑名單之外的一句話木馬檔案(如圖片馬).
img
哦吼,連線失敗,查詢資料才知道啟用.htaccess,需要修改httpd.conf,啟用AllowOverride和rewrite,將none改成all即可,rewrite模組預設開啟。
img
再次嘗試,成功連線蟻劍

.user.ini繞過

原理

.user.ini在PHP_INI_USER的配置項之中,官方解釋如下
img
.user.ini實際上就是一個可以由使用者“自定義”的php.ini,它用於覆蓋或追加全域性配置檔案(如.php.ini)中的PHP配置選項,可以覆蓋php.ini檔案。

繞過

我們可以透過先上傳.user.ini檔案,內容如下(其中1.png為隨後上傳的檔名)
img
再上傳一個圖片馬,包含起來進行getshell。不過前提是含有.user.ini的資料夾下需要有正常的php檔案,從而導致伺服器對圖片檔案的錯誤處理而導致的檔案執行。

第五關

黑名單中沒有.ini字尾,先上傳.user.ini檔案,再上傳1.png
根據提示img
嘗試訪問readme.php
img
成功!
蟻劍連線即可img

大小寫繞過

原理

有些網站沒有嚴格過濾大小寫,這時就可以利用大小寫混合來繞過檢測。

第六關

img
網頁原始碼沒有過濾大小寫,這時就可以利用大小寫繞過檢測。
先上傳php木馬檔案,然後用bp抓包,修改字尾為大小寫混合,用蟻劍連線即可
img
img

空格繞過

如果網站沒有過濾空格時,就可以透過在檢測資料後新增空格實現繞過

第七關

檢測原始碼,發現函式trim,其解釋如下img
由於本題是透過判斷字尾檢測檔案是否能夠上傳,則在字尾後新增空格即可,步驟和第六關類似
img
蟻劍連線成功
img

點繞過

和空格繞過類似,這裡不再詳述。

第八關

img

NTFS交換資料流繞過

原理

window中,檔名+"::\(DATA"會把::\)DATA之後的資料當成檔案流處理,不會檢測字尾名,且保持"::$DATA"之前的檔名,不會檢查字尾名。

第九關

img
原始碼中沒有過濾::\(DATA,和前幾關步驟類似,bp抓包,改字尾,蟻劍連線 ![img](https://img2023.cnblogs.com/blog/3542155/202411/3542155-20241128212256028-774043099.bmp) 不過蟻劍連線時需要刪除::\)DATA
img

點空點繞過(. .)

原理

deldot()函式從後向前檢測,當檢測到末尾的第一個點時會繼續它的檢測,但是遇到空格會停下來,從而繞過檢測。

第十關

img
當從右往左檢測檔名時,會刪除最後的 '.'和' '然後停止,之後得到檔名'X.php.',和之後點繞過相同。
img
img

雙寫字尾繞過

原理

在上傳模組,有的程式碼會把黑名單的字尾名替換成空,例如a.php 會把php 替換成空,但是可以使用雙寫繞過例如 asaspp,pphphp,即可繞過上傳。

第十關

img
其中str_ireplace函式會從左往右檢測檔案字尾是否在黑名單之中,若在的話,就會將其刪除。
如果我們將檔案字尾變成pphphp時,他只會檢測到中間的php並刪除,然而剩餘字元依然構成php字尾,就能夠實現繞過。
步驟依然一樣,不再囉嗦。
img

%00截斷繞過

原理

如果黑名單上傳檢測後,沒有限定字尾名,繞過的方法很多,使用白名單驗證會相對比較安全,因為只允許指定的檔案字尾名。但是如果有可控的引數目錄,也存在被繞過的風險。
儲存檔案時處理檔名的函式會從左往右檢測,在遇到%00字元認為這是終止符,從而丟棄之後的字元。但是白名單檢測時會從右往左檢測,如果後面的字元符合字尾白名單要求時,就會透過檢測。

第十二關

img
先透過白名單檢測,之後從 GET 引數獲取的儲存路徑(透過 $_GET['save_path']),
和檔案字尾構成新的檔名。如果我們此時修改get請求的值,新增1.php%00
img
它雖然依然能後和檔案字尾構成檔名,但由於遇到%00後伺服器會以為已經結束,從而丟棄掉字尾名。
由於這要求php版本在5.3.4以下,因此我的靶場顯示上傳錯誤!

第十二關

img
這一關和上一關的區別就是本關是透過post傳參儲存檔案的儲存路徑。由於post傳參不會像get傳參那樣img對%00進行url解碼,因此需要手動對%00解碼

img
在php新增一個空格,然後選中空格在右側選中欄中將16進位制數修改為00相當於‘/0’。之後用蟻劍連線即可。

檔案頭檢測繞過

原理

所有的檔案都是以二進位制的形式進行儲存的,在每一個檔案(包括圖片,影片或其他的非ASCII檔案)的開頭(十六進位制表示)都有一片區域來顯示這個檔案的實際用法,這就是檔案頭標誌,伺服器對白名單進行檔案頭檢測,符合,則允許上傳,反之不允許。
主要分為三個方面:前兩位元組繞過,getimagesize繞過和exif_imagetype繞過。

常見檔案頭型別

img

第十四關(前兩位元組繞過)

img
關鍵函式fread,作用如下:
img
由於伺服器只會檢測上傳檔案二進位制的前兩個位元組,所以我們可以透過修改這部分資料實現繞過。
白名單中只有jpg,png,gif這三種檔案型別,這裡我選擇用png型別實現繞過:
先新建一個png圖片,用記事本開啟,並寫入一句話木馬
img
注意前面有兩個空格,方便用010修改前兩位元組
img
上傳該圖片,而提示需要使用檔案包含漏洞才能執行惡意程式碼
img
使用include包含:include.php?file=upload/檔名
img
成功連線

第十五關

img
原始碼中包含了getimagesize函式
img
透過終端用一個正常圖片和一個一句話木馬生成圖片馬繞過檢測
img
然後步驟和第十四關相同。

第十六關

img
原始碼使用exif_imagetype()檢查檔案型別是否合法
img
這關和第15關沒有什麼不同,做法是一樣,但這關使用exif_imagetype()檢查是否為圖片檔案,所以我們需要開啟開啟php_exif擴充套件,之後同第十五關
img

二次渲染繞過

原理

在我們上傳檔案後,網站會對圖片進行二次處理(格式、尺寸要求等),伺服器會把裡面的內容進行替換更新。
處理完成後,根據原有的圖片對比,找到沒被修改的部分,然後利用這一部分,生成一個新的圖片並放到網站對應的標籤進行顯示。

第十七關

img
img
原始碼對圖片進行二次渲染
img
經過二次渲染,圖片馬中的一句話木馬被刪除。這是就需要在渲染前後相同部分新增一句話木馬。
img
由於png圖片渲染前後相同部分很少,一句話木馬經過渲染會被刪除,因此選擇用gif圖片插入
這時有兩種方法,第一種是將渲染前後對比,在渲染前兩者的相同部分插入一句話木馬。
另外一種則是直接在渲染後的圖片中插入一句話木馬。
這裡用第一種方法
img
儲存後再次上傳該圖片,然後下載上傳後的圖片,用010開啟,發現經過渲染後一句話木馬仍然存在
img
之後利用檔案包含漏洞用蟻劍連線即可
img

條件競爭繞過

原理

img
檔案先上傳到伺服器上,然後再判斷是否符合白名單,雖然非法檔案在伺服器中的時間很短,但仍然可以訪問,可是一句話木馬需要一直連線伺服器才能進行操作,因此可以利用這短暫的時間執行非法檔案的一句程式語句, 我們這個時候就可以使用條件競爭的方式,透過bp傳送大量的上傳和檔案訪問請求。

第十八關

img
先新建一個php檔案並寫入
img
上傳檔案到伺服器,用bp抓包,傳送資料包到intruder模板
上傳請求:
img
clear清除payload
img
無限空發請求
img
將齊發執行緒數調大,之後是訪問請求,和上傳步驟相同,不過需要訪問生成的檔案地址,在本題中為http://127.0.0.1/upload-labs/Pass-18/index.php/shell.php
接下來開始攻擊,分別點選上傳請求的開始攻擊按鈕和檔案訪問的按鈕。因為需要大量的請求,所以時間可能要長一點。
最後發現我們的目錄下有shell.php
img
最後用蟻劍連線即可img

Apache解析漏洞

原理

Apache解析檔案的規則是從右到左開始判斷解析,如果字尾名為不可識別檔案解析,就再往左判斷。比如test.php.a.b的“.a”和“.b”這兩種字尾是apache不可識別解析,apache就會把test.php.a.b解析成test.php。

第十九關

程式碼審計
img
這裡定義了一個類,包含了一些白名單字尾。
img
這裡是先上傳檔案,然後重新命名檔案,所以存在條件競爭。
img
這裡對上傳後的檔案進行重新命名。
先複製php木馬,不過要利用apache解析漏洞,在字尾後可以新增.7z(只要apache不能解析就行)
img
與第十八關類似,透過bp傳送大量的上傳和檔案訪問請求。
上傳請求完全相同,但是檔案訪問請求不大相同,透過檢視伺服器檔案可知,上傳檔案並沒有儲存在upload目錄下,而是儲存在了upload-labs目錄下。
檔案訪問url http://127.0.0.1/upload-labs/upload1733053426.7z
其他方式與第18關相同。

相關文章