0x00 什么是文件上傳
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:申請域名、網站空間、營銷軟件、網站建設、米林網站維護、網站推廣。為了讓用戶將文件上傳到網站,就像是給危機服務器的惡意用戶打開了另一扇門。即便如此,在今天的現代互聯(lián)網的Web應用程序,它是一種常見的要求,因為它有助于提高業(yè)務效率。企業(yè)支持門戶,給用戶各企業(yè)員工有效地共享文件。允許用戶上傳圖片,視頻,頭像和許多其他類型的文件。向用戶提供的功能越多,Web應用受到***的風險和機會就越大,這種功能會被惡意用戶利用,獲得到一個特定網站的權限,或危及服務器的可能性是非常高的。
0x01 為什么文件上傳存在漏洞
上傳文件的時候,如果服務器腳本語言,未對上傳的文件進行嚴格的驗證和過濾,就容易造成上傳任意文件,包括上傳腳本文件。
如果是正常的PHP文件,對服務器則沒有任何危害。
PHP可以像其他的編程語言一樣,可以查看目錄下的文件,查看文件中的嗎內容,可以執(zhí)行系統(tǒng)命令等。
上傳文件的時候,如果服務器端腳本語言,未對上傳的文件進行嚴格的驗證和過濾,就有可能上傳惡意的PHP文件,從而控制整個網站,甚至是服務器。這個惡意的PHP文件,又被稱為WebShell。
0x02 哪里存在文件上傳漏洞
服務器配置不當
開源編輯器的上傳漏洞
本地文件上傳限制被繞過
過濾不嚴或被繞過
文件解析漏洞導致文件執(zhí)行
文件路徑截斷
0x03 文件上傳實例(本地測試)
嘿嘿嘿?one
"; echo "文件大小:".$_FILES['upfile']['size']."文件信息
設置本地代理用Burp Suite 抓包,通過對比我們可以看到,PHP中的<文件名>和<文件類型>分別對應數據包中
嘿嘿嘿?two
"; echo "文件大?。?.$_FILES['upfile']['size']."文件信息
在這段代碼里,我們通過 <$_FILES['upfile']['type']> 來檢測文件上傳的類型,通過第一個圖里的對比我們知道Http數據包請求頭里的
看返回的頁面我們知道我們成功繞過了對文件類型的檢測,并且菜刀連接成功
嘿嘿嘿?three(一個十六進制的<00>截斷的ctf)
url:http://ctf4.shiyanbar.com/web/upload/
首先我們對抓取的數據包做出以上修改
通過16進制我們知道 <.>的16進制是<2e>在<2e>出插入一個字節(jié),右鍵菜單里有
ok,現在我們成功獲取了flag。
現在我們說下這個實驗的實現原理:
1.為什么在文件后面加上<.jpg>和在數據包后面加上修改后的文件名? PHP在對文件后綴進行判斷時是對最后一個 <.xxx> 來判斷的。這樣我們修改過后的文件 名,PHP會將其判斷為.jpg文件這樣我們可以繞過對文件名的檢測。 2.為什么我們對文件名修改過后還需要添加%00截斷? 盡管我們知道我們上傳的是一個PHP文件,但是如果不進行%00截斷,我們上傳的文件在服務 器上是以 格式保存也就是說這是一個圖片文件,PHP是不會解析這個文件。 當我們進行%00截斷后,服務器就會將%00后的<.jpg>進行截斷,這是我們的的文件將以 的形式保存在服務器上,我們的一句話***也就成功的時上傳成功了。
Part Four
"; echo "文件大?。?.$_FILES['upfile']['size']."文件信息
上傳一張正常的圖片。
上傳一句話***進行繞過檢測
為什么這次不能進行繞過? 我們對文件名進行截斷后,當數據包到Apache的時候,Apache會對截斷處理這時截斷的文件 名變?yōu)?xxx.php>當PHP判斷時會發(fā)現文件的后綴為,然后我們就上傳失敗了.... (以上只是我對上傳失敗的一點理解,歡迎指正。 歡迎技術討論,可以將上述方法繞過的同學歡迎指教。 致謝...)
0x04 上傳漏洞的防御
對面文件后綴進行檢測
對文件類型進行檢測
對文件內容進行檢測
設置上傳白名單
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。