程式碼安全之上傳檔案

FLy_鵬程萬里發表於2018-05-31

上傳資料包簡單分析

從下面的資料包中我們可以看出,驗證檔案型別的引數有:Content-Type、Filename、Filedata。


客戶端JS驗證

原理介紹

通過JS驗證上傳檔案型別是最不安全的做法,因為這個方式是最容易被繞過的。我們先來看下JS實現檔案檢測的程式碼如下:


客戶端JS驗證通常做法是驗證上傳檔案的副檔名是否符合驗證條件。

繞過姿勢

1 通過firefox的F12修改js程式碼繞過驗證

2 使用burp抓包直接提交,繞過js驗證

服務端MIME型別檢測

MIME型別介紹

不同的檔案型別有不同的MIME頭,常見的MIME頭如下:


驗證MIME頭的測試程式碼


以上是一個簡單的伺服器上傳驗證程式碼,只要MIME頭符合image/gif就允許上傳。

繞過方式

使用Burp擷取上傳資料包,修改Content-Type的值,改為image/gif即可成功繞過上傳webshell。

服務端副檔名檢測

擴充套件驗證測試程式碼


預設上傳後的檔案儲存的名字是以獲取到名字。

繞過技巧

1 使用大小寫繞過(針對對大小寫不敏感的系統如windows),如:PhP

2 使用黑名單外的指令碼型別,如:php5

3 藉助檔案解析漏洞突破副檔名驗證,如:test.jpg.xxx(apache解析漏洞)

4 藉助系統特性突破副檔名驗證,如:test.php_(在windows下下劃線是空格,儲存檔案時下劃線被吃掉剩下test.php)

5 雙副檔名之間使用00截斷,繞過驗證上傳惡意程式碼如:test.php%00.jpg

6 藉助.htaccess檔案上傳惡意程式碼並解析。如:上傳一個.htaccess檔案,內容為AddTypeapplication/x-httpd-php .jpg,上傳的jpg檔案就可以當作php來解析

7 使用00截斷,繞過字尾驗證獲取webshell(php<5.3.4+關閉GPC)

8 超長檔名截斷上傳(windows 258byte | linux 4096byte)

服務端檔案內容檢測

檢測檔案頭

檔案頭簡介

不同的圖片檔案都有不同檔案頭,如:

PNG: 檔案頭標識 (8 bytes) 89 50 4E 47 0D 0A 1A 0A

JPEG: 檔案頭標識 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 檔案標識)

GIF: 檔案頭標識 (6 bytes) 47 49 46 38 39(37) 61

繞過方式

繞過這個檢測只需要在惡意指令碼前加上允許上傳檔案的頭標識就可以了。

檔案內容檢測

檢測方式

使用正則對內容進行匹配,一旦匹配到惡意程式碼,就中斷上傳,提示使用者重新上傳。

繞過方式

通過fuzz,繞過正則上傳。

安全建議

1 使用白名單限制可以上傳的檔案擴充套件

2 驗證檔案內容,使用正則匹配惡意程式碼限制上傳

3 對上傳後的檔案統一隨機命名,不允許使用者控制副檔名

4 修復伺服器可能存在的解析漏洞

5 嚴格限制可以修改伺服器配置的檔案上傳如:.htaccess


相關文章