檔案上傳漏洞&靶場通關詳解
什麼是檔案上傳漏洞?
大部分網站都擁有上傳檔案的部分,檔案上傳漏洞是由於網站開發者對使用者上傳檔案的過濾不夠嚴格,攻擊者可以透過這些漏洞上傳可執行檔案(如木馬,惡意指令碼和WebShell等等),從而達到隨意控制網站的目的。
檔案上傳漏洞有哪些危害?
攻擊者可以透過這些漏洞上傳可執行檔案(如php),使伺服器被控制,從而使攻擊者能夠植入後門程式,竊取敏感資訊,侵犯使用者隱私,上傳惡意軟體,造成資料篡改和損壞等等。
檔案上傳的過程?
使用者傳送的檔案被伺服器接收——>經過網站檢測——>產生臨時檔案——>移動到指定路徑
什麼是WebShell?
WebShell是攻擊者成功入侵網站後留下的後門程式,通常由asp,jsp和php編寫。攻擊者能夠隨時透過WebShell進入網站後端,隨意檢視和控制網站內容。
WebShell的分類如下:
檔案上傳漏洞的方法
接下來就圍繞以上型別進行介紹:
前端檢測
判斷
直接檢視:在瀏覽器中右鍵點選頁面,選擇 “檢視原始碼” 或 “檢查”,開啟開發者工具並切換到 “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
2.瀏覽器搜尋url:about:config,搜尋JavaScript,雙擊關閉
第一關
新建php檔案,寫入一句話木馬
禁用JS後上傳一句話木馬,之後直接用蟻劍連線即可
還有另外一種方法第三關提到
後端檢測
Content-Type檢測
原理
後端透過檢查HTTP請求頭中的Content-Type欄位來確定上傳檔案的型別。伺服器是透過ent-type判斷型別,content-type在客戶端可被修改,因此可以繞過。
第二關
根據以下程式碼可知檢測Content-Type確定檔案型別
則可以上傳php一句話木馬,用bp抓包,修改Content-Type為程式碼中任意一種,即可繞過
也可以直接上傳圖片馬,修改字尾為php,第三關會詳細介紹
黑名單繞過
黑名單
檔案上傳黑名單是指在檔案上傳過程中,伺服器明確禁止上傳的檔案型別列表。
第三關
分析原始碼可知後端將檢測檔案字尾型別,以上四種檔案字尾不被伺服器所接受,這時就可以透過上傳可支援檔案,之後抓包修改字尾實現繞過,如(phtml,php3,php5等等).
這裡我們嘗試phtml
先上傳php木馬,bp抓包改字尾
蟻劍連線失敗
![img](https://img2023.cnblogs.com/blog/3542155/202411/3542155-20241127230318243-424320538.
檢查配置檔案
發現phtml被註釋,開啟這串程式碼,重啟phpstudy,再次嘗試,成功連線蟻劍
.htaccess繞過
htaccess定義及作用
.htaccess檔案(或者分散式配置檔案),全稱是Hypertext Access(超文字入口)。提供了針對目錄改變配置的方法, 即,在一個特定的文件目錄中放置一個包含一個或多個指令的檔案, 以作用於此目錄及其所有子目錄。作為使用者,所能使用的命令受到限制。
透過htaccess檔案,可以幫我們實現:網頁301重定向、自定義404錯誤頁面、改變副檔名、允許/阻止特定的使用者或者目錄的訪問、禁止目錄列表、配置預設文件等功能。
繞過方法
因為.htaccess檔案擁有改變檔案字尾的作用,因此當改檔案未被禁止時,我們就可以透過上傳該類檔案實現改變隨後上傳檔案字尾的目的,從而繞過黑名單。
第四關
檢查原始碼,發現是檢測字尾是否在黑名單之中,黑名單中沒有.htaccess,則可以利用該漏洞入侵伺服器。
先新建.htaccess檔案,寫入如下內容
作用是讓png,txt檔案也可以執行php檔案功能,也可以刪除這串程式碼中的最後.png .txt,表示將隨後上傳的所有檔案當作php檔案處理。
先上傳該檔案,再上傳黑名單之外的一句話木馬檔案(如圖片馬).
哦吼,連線失敗,查詢資料才知道啟用.htaccess,需要修改httpd.conf,啟用AllowOverride和rewrite,將none改成all即可,rewrite模組預設開啟。
再次嘗試,成功連線蟻劍
.user.ini繞過
原理
.user.ini在PHP_INI_USER的配置項之中,官方解釋如下
.user.ini實際上就是一個可以由使用者“自定義”的php.ini,它用於覆蓋或追加全域性配置檔案(如.php.ini)中的PHP配置選項,可以覆蓋php.ini檔案。
繞過
我們可以透過先上傳.user.ini檔案,內容如下(其中1.png為隨後上傳的檔名)
再上傳一個圖片馬,包含起來進行getshell。不過前提是含有.user.ini的資料夾下需要有正常的php檔案,從而導致伺服器對圖片檔案的錯誤處理而導致的檔案執行。
第五關
黑名單中沒有.ini字尾,先上傳.user.ini檔案,再上傳1.png
根據提示
嘗試訪問readme.php
成功!
蟻劍連線即可
大小寫繞過
原理
有些網站沒有嚴格過濾大小寫,這時就可以利用大小寫混合來繞過檢測。
第六關
網頁原始碼沒有過濾大小寫,這時就可以利用大小寫繞過檢測。
先上傳php木馬檔案,然後用bp抓包,修改字尾為大小寫混合,用蟻劍連線即可
空格繞過
如果網站沒有過濾空格時,就可以透過在檢測資料後新增空格實現繞過
第七關
檢測原始碼,發現函式trim,其解釋如下
由於本題是透過判斷字尾檢測檔案是否能夠上傳,則在字尾後新增空格即可,步驟和第六關類似
蟻劍連線成功
點繞過
和空格繞過類似,這裡不再詳述。
第八關
NTFS交換資料流繞過
原理
window中,檔名+"::\(DATA"會把::\)DATA之後的資料當成檔案流處理,不會檢測字尾名,且保持"::$DATA"之前的檔名,不會檢查字尾名。
第九關
原始碼中沒有過濾::\(DATA,和前幾關步驟類似,bp抓包,改字尾,蟻劍連線
![img](https://img2023.cnblogs.com/blog/3542155/202411/3542155-20241128212256028-774043099.bmp)
不過蟻劍連線時需要刪除::\)DATA
點空點繞過(. .)
原理
deldot()函式從後向前檢測,當檢測到末尾的第一個點時會繼續它的檢測,但是遇到空格會停下來,從而繞過檢測。
第十關
當從右往左檢測檔名時,會刪除最後的 '.'和' '然後停止,之後得到檔名'X.php.',和之後點繞過相同。
雙寫字尾繞過
原理
在上傳模組,有的程式碼會把黑名單的字尾名替換成空,例如a.php 會把php 替換成空,但是可以使用雙寫繞過例如 asaspp,pphphp,即可繞過上傳。
第十關
其中str_ireplace函式會從左往右檢測檔案字尾是否在黑名單之中,若在的話,就會將其刪除。
如果我們將檔案字尾變成pphphp時,他只會檢測到中間的php並刪除,然而剩餘字元依然構成php字尾,就能夠實現繞過。
步驟依然一樣,不再囉嗦。
%00截斷繞過
原理
如果黑名單上傳檢測後,沒有限定字尾名,繞過的方法很多,使用白名單驗證會相對比較安全,因為只允許指定的檔案字尾名。但是如果有可控的引數目錄,也存在被繞過的風險。
儲存檔案時處理檔名的函式會從左往右檢測,在遇到%00字元認為這是終止符,從而丟棄之後的字元。但是白名單檢測時會從右往左檢測,如果後面的字元符合字尾白名單要求時,就會透過檢測。
第十二關
先透過白名單檢測,之後從 GET 引數獲取的儲存路徑(透過 $_GET['save_path']),
和檔案字尾構成新的檔名。如果我們此時修改get請求的值,新增1.php%00
它雖然依然能後和檔案字尾構成檔名,但由於遇到%00後伺服器會以為已經結束,從而丟棄掉字尾名。
由於這要求php版本在5.3.4以下,因此我的靶場顯示上傳錯誤!
第十二關
這一關和上一關的區別就是本關是透過post傳參儲存檔案的儲存路徑。由於post傳參不會像get傳參那樣對%00進行url解碼,因此需要手動對%00解碼
在php新增一個空格,然後選中空格在右側選中欄中將16進位制數修改為00相當於‘/0’。之後用蟻劍連線即可。
檔案頭檢測繞過
原理
所有的檔案都是以二進位制的形式進行儲存的,在每一個檔案(包括圖片,影片或其他的非ASCII檔案)的開頭(十六進位制表示)都有一片區域來顯示這個檔案的實際用法,這就是檔案頭標誌,伺服器對白名單進行檔案頭檢測,符合,則允許上傳,反之不允許。
主要分為三個方面:前兩位元組繞過,getimagesize繞過和exif_imagetype繞過。
常見檔案頭型別
第十四關(前兩位元組繞過)
關鍵函式fread,作用如下:
由於伺服器只會檢測上傳檔案二進位制的前兩個位元組,所以我們可以透過修改這部分資料實現繞過。
白名單中只有jpg,png,gif這三種檔案型別,這裡我選擇用png型別實現繞過:
先新建一個png圖片,用記事本開啟,並寫入一句話木馬
注意前面有兩個空格,方便用010修改前兩位元組
上傳該圖片,而提示需要使用檔案包含漏洞才能執行惡意程式碼
使用include包含:include.php?file=upload/檔名
成功連線
第十五關
原始碼中包含了getimagesize函式
透過終端用一個正常圖片和一個一句話木馬生成圖片馬繞過檢測
然後步驟和第十四關相同。
第十六關
原始碼使用exif_imagetype()檢查檔案型別是否合法
這關和第15關沒有什麼不同,做法是一樣,但這關使用exif_imagetype()檢查是否為圖片檔案,所以我們需要開啟開啟php_exif擴充套件,之後同第十五關
二次渲染繞過
原理
在我們上傳檔案後,網站會對圖片進行二次處理(格式、尺寸要求等),伺服器會把裡面的內容進行替換更新。
處理完成後,根據原有的圖片對比,找到沒被修改的部分,然後利用這一部分,生成一個新的圖片並放到網站對應的標籤進行顯示。
第十七關
原始碼對圖片進行二次渲染
經過二次渲染,圖片馬中的一句話木馬被刪除。這是就需要在渲染前後相同部分新增一句話木馬。
由於png圖片渲染前後相同部分很少,一句話木馬經過渲染會被刪除,因此選擇用gif圖片插入
這時有兩種方法,第一種是將渲染前後對比,在渲染前兩者的相同部分插入一句話木馬。
另外一種則是直接在渲染後的圖片中插入一句話木馬。
這裡用第一種方法
儲存後再次上傳該圖片,然後下載上傳後的圖片,用010開啟,發現經過渲染後一句話木馬仍然存在
之後利用檔案包含漏洞用蟻劍連線即可
條件競爭繞過
原理
檔案先上傳到伺服器上,然後再判斷是否符合白名單,雖然非法檔案在伺服器中的時間很短,但仍然可以訪問,可是一句話木馬需要一直連線伺服器才能進行操作,因此可以利用這短暫的時間執行非法檔案的一句程式語句, 我們這個時候就可以使用條件競爭的方式,透過bp傳送大量的上傳和檔案訪問請求。
第十八關
先新建一個php檔案並寫入
上傳檔案到伺服器,用bp抓包,傳送資料包到intruder模板
上傳請求:
clear清除payload
無限空發請求
將齊發執行緒數調大,之後是訪問請求,和上傳步驟相同,不過需要訪問生成的檔案地址,在本題中為http://127.0.0.1/upload-labs/Pass-18/index.php/shell.php
接下來開始攻擊,分別點選上傳請求的開始攻擊按鈕和檔案訪問的按鈕。因為需要大量的請求,所以時間可能要長一點。
最後發現我們的目錄下有shell.php
最後用蟻劍連線即可
Apache解析漏洞
原理
Apache解析檔案的規則是從右到左開始判斷解析,如果字尾名為不可識別檔案解析,就再往左判斷。比如test.php.a.b的“.a”和“.b”這兩種字尾是apache不可識別解析,apache就會把test.php.a.b解析成test.php。
第十九關
程式碼審計
這裡定義了一個類,包含了一些白名單字尾。
這裡是先上傳檔案,然後重新命名檔案,所以存在條件競爭。
這裡對上傳後的檔案進行重新命名。
先複製php木馬,不過要利用apache解析漏洞,在字尾後可以新增.7z(只要apache不能解析就行)
與第十八關類似,透過bp傳送大量的上傳和檔案訪問請求。
上傳請求完全相同,但是檔案訪問請求不大相同,透過檢視伺服器檔案可知,上傳檔案並沒有儲存在upload目錄下,而是儲存在了upload-labs目錄下。
檔案訪問url http://127.0.0.1/upload-labs/upload1733053426.7z
其他方式與第18關相同。