本期內容并不是很難,相信大家會學的很愉快,當然對于有后端基礎的朋友來說,本期內容更加容易了解,當然沒有基礎的也別擔心,本期內容會詳細解釋有關內容
本期用到的軟件:yakit(因為經過之前好多期的學習,我相信大家已經足夠了解yakit,哪怕不熟悉,至少也知道各個模塊有什么用)
我們先來翻譯一下這個單詞組合是什么意思(不安全的文件上傳),和之前我們學到的RCE,File inclusion有一點相似,但是希望大家仔細觀察,不要搞混
介紹
不安全的文件上傳漏洞概述
文件上傳功能在web應用系統很常見,比如很多網站注冊的時候需要上傳頭像、上傳附件等等。當用戶點擊上傳按鈕后,后臺會對上傳的文件進行判斷 比如是否是指定的類型、后綴名、大小等等,然后將其按照設計的格式進行重命名后存儲在指定的目錄。 如果說后臺對上傳的文件沒有進行任何的安全判斷或者判斷條件不夠嚴謹,則攻擊者可能會上傳一些惡意的文件,比如一句話木馬,從而導致后臺服務器被webshell。
所以,在設計文件上傳功能時,一定要對傳進來的文件進行嚴格的安全考慮。比如:
--驗證文件類型、后綴名、大小;
--驗證文件的上傳方式;
--對文件進行一定復雜的重命名;
--不要暴露文件上傳后的路徑;
--等等...
你可以通過“Unsafe file upload”對應的測試欄目,來進一步的了解該漏洞。
個人評價:會用到非常多的"米奇妙妙工具",只要有一定的開發基礎理解起來會非常容易(沒有的也別擔心,會一一解釋的,只是領悟的時間問題而已)
適用場景:有文件上傳功能的網站都可以
實際反饋:用起來很簡單,但是很多大廠會有過濾,而且沒有長時間的后端了解,盲目進行"米奇妙妙工具"的開發會非常艱難,甚至耗費大量時間,結果沒用(在此也強調,如果你幸運的擁有大佬們發出來的"米奇妙妙工具",請你使用時關掉殺軟或者斷網進行測試,不要亂傳,不僅可能會鋃鐺入獄,還會讓大佬們分享出來的東西被徹底分析透,導致工具失效)
一,client check
原理
它一般指檢查客戶端輸入的安全性。當用戶上傳文件時,系統會驗證文件的擴展名是否符合要求,防止惡意文件被上傳。比如,檢查上傳的文件是否是圖片(如.jpg、.png)而不是可執行文件或其他潛在危險的文件。
就好像一個高中的保安一樣,通過識別學生的胸牌和校服來決定他是否可以進入校園
但是同樣的,找個看起來很年輕的人,讓他穿校服,然后偽造一個胸牌,他也可以進入
實踐
有了前幾期的了解,我們會知道,前端的很多防護形同虛設,有了自由上傳的環境后,就到了我們大展拳腳的時候
因此,我就有了第一個最簡單的方法進行攻擊
也就是禁止JavaScript
這個在之前的暴力破解模塊中就有說到,通過禁止JavaScript可以使他簡單的前端防護失效
不過在此之前,我們需要先構建一個木馬(這個木馬是針對服務器的)(為了防止大家迷惑,所以關于木馬的知識我會之后單獨出一期的,大家先了解本期的理論內容)
<?php @eval($_POST['shell']); ?>
當然了,知己知彼,方能百戰百勝,我們先來分析一下這是什么東西
該代碼的主要功能是執行客戶端通過 POST 請求發送的 'shell' 參數中的 PHP 代碼。黑客可以將惡意 PHP 代碼放入 'shell' 參數,服務器端接收到后會直接執行,從而實現遠程代碼執行,對服務器進行控制、竊取數據、發起攻擊等惡意操作。
<?php 和 ?>這是PHP代碼的開始和結束標簽,用于包裹PHP腳本代碼。
@這是PHP的錯誤抑制運算符,它會關閉錯誤報告,即使代碼執行失敗,也不會輸出任何錯誤信息。這是一種隱藏惡意行為手段,使得代碼執行中的錯誤不會被發現。
eval()這是一個PHP函數,它會將傳入的字符串作為PHP代碼來執行。它是這段代碼的核心危險所在。
任何通過$_POST['shell']傳遞的字符串都會被當作PHP代碼執行。
$_POST['shell']這是PHP的超全局變量,用于接收通過POST方法發送的數據。
shell是一個鍵名,攻擊者可以通過構造特定的POST請求,將惡意代碼傳遞到這個鍵中。
不了解的朋友可能看不懂,但是別擔心,努力學習,都會明白的,畢竟我可以把理論說的通俗一點,但是專用性的內容真的沒辦法
我們來試一下,木馬后綴改為php(切記放入殺毒軟件的白名單里,不然剛做出來就被殺了)
可以看到,成功了
同樣在打開F12后我們可以看到他的前端防護暴露出來了
把
onchange="checkFileExt(this.value)"
刪掉就沒問題了
上傳之后我們可以通過各類連接方面的"米奇妙妙工具"來進行更大的破壞,我之后會同關于木馬的講解一起發出來的,因為我們首先要了解的是理論基礎
至此,client check完成
二,MIME type
原理
首先,翻譯一下什么是MIME 和MIME type
MIME(Multipurpose Internet Mail Extensions,多用途互聯網郵件擴展)類型,最初設計用于在電子郵件傳輸中標識內容格式,現廣泛應用于互聯網,向服務器和客戶端提供文件信息,幫助它們知道如何處理文件。
組成結構?:由兩部分組成,即類型(Type)和子類型(Subtype)。類型表示文件的通用類別,如文本、圖像、音頻、視頻等;子類型則進一步細化,具體說明文件的格式,如純文本、HTML 文檔、JPEG 圖像等。
作用機制?:當客戶端向服務器請求文件時,服務器會根據文件的 MIME type 來確定如何處理和傳輸文件。客戶端接收到文件和對應的 MIME type 后,根據已知的類型和子類型,判斷如何顯示或處理文件,比如用特定的程序打開、在瀏覽器中直接渲染等。
就好像超市進行商品分區一樣,哪怕你是從大山里剛被現代人類帶回來,只要認識中文后,進入商城后看分區牌子就知道這是干什么的,大概就是類似于日常生活中"標簽"這個概念
實踐
直接發送我們可以看到不行,但是我們現在知道MIME的概念了
我們還是用熟悉的yakit抓個包
我們直接換格式(也就是我們原理中談到的MIME這個東西的使用)
換成他要的格式(這里以image/jpg格式為例,別的格式可以自己嘗試比如image/jpeg)
發送,成功
三,getimagesize
原理
同樣,我們先來分析,解釋這是什么意思
getimagesize()
?是一個 PHP 函數,主要用于獲取圖像文件的尺寸信息(例如寬度和高度)以及其他相關信息,比如圖像的類型(格式)和 MIME 類型。如果函數感知不到是圖像類型就沒用
假設你有一堆照片,每張照片的背面都貼著一個小標簽(MIME),上面寫著這張照片的尺寸、照片的樣式(比如紙質打印的那種和正式的紅底,藍底,白底照片)和其他一些信息(比如拍攝日期)
檢查照片:想象你正拿著一張照片,首先確認這張照片是真的,而不是一張廢紙。
查看標簽:你在照片背面找到那個標簽,上面有它的尺寸信息,拍攝時間
讀取信息:你仔細看標簽上的內容,比如是2025年拍攝的,它是一張彩色的全家福。getimagesize()
?函數做的也是類似的事情,它讀取圖像文件中的標簽信息。
整理信息:你把這張照片的尺寸、格式等信息記錄下來,方便之后使用。getimagesize()
?也會把這些信息整理成一個數組,讓你可以方便地使用這些數據。
實踐
其實很簡單,既然他的函數要識別的到,那我們就給他圖片,但是后面加上東西(類似于上面說過的扮演成高中生的社會人士,因為穿了校服,保安就不容易發現)
由此我們就有了攻擊思路
也就是把圖片和木馬內容整合在一起
我們先用記事本打開一個圖片(記住要符合他的傳送內容的要求)
在這里也解釋一下為什么圖片用記事本打開會是亂碼
為了更好理解我們就用簡單的方式來說,如果有朋友想要詳細了解,可以自己查找,在此不過多贅述:圖片用記事本打開就好像用勺子吃牛排,牛排做的再好,用勺子你也吃不好
然后把木馬內容放在結尾(放在結尾是因為函數通常是通過文件特征來識別是什么格式的,放在末尾更安全)
當然用yakit也是可以的,也是將木馬內容放在末尾就好,再次便不再贅述
至于之后如何啟用連接的話,也會同之后的木馬內容一并發出來
至此Unsafe Fileupload模塊完成
通過本期內容,我們了解了一下關于木馬的知識點,也學會了如何制造一個簡單的木馬,雖然簡單,但是需要大家進行自主嘗試,比如這次是要圖片格式的,那以后用其他文件格式的應該怎么搞,需要舉一反三