【WEB開發】文件上傳常見防御與突破總結
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
一、簡介 文件上傳是指用戶上傳了一個可執行腳本,并通過此腳本文件獲得了執行服務器端命令的能力。通過就是上傳一句話木馬,然后通過菜刀來連接服務器。要完成這個攻擊,需要下面的三個條件: 1.上傳的文件能夠被web容器解釋執行,所以文件上傳后所在的目錄要是web容器所覆蓋到的路徑。 2.用戶能夠從web上訪問這個文件,如果文件上傳了,但用戶無法通過web訪問,或者無法使得web容器解釋這個腳本,那也不能稱之為漏洞、 3.用戶上傳的文件沒有被安全檢查,格式化,圖片壓縮等功能改變了內容;如果改變了內容則可能導致攻擊不成功。 PS:文件上傳功能在大多數的web應用中都存在,比如用戶頭像上傳,文章內容的圖片,視頻,音頻,附件上傳,一些cms系統上傳模板文件,數據庫備份文件,插件文件等地方 二、防御 在實際的測試過程中,我們總是發現程序對上傳了文件做了各種限制,導致文件上傳不成功。常用的限制文件上傳的方式有: 1.黑名單過濾(根據文件擴展名) 2.白名單過濾(根據文件擴展名) 3.檢測上傳文件的文件頭(服務器端MIME類型檢測) 4.服務器內容檢測,檢測是否有惡意代碼 5.服務端目錄路徑檢測(檢測和path相關的參數) 三、繞過限制上傳 找到了下面的一個圖片,總結的挺全的。 1.黑名單方式 1)文件大小寫繞過:嘗試使用大小寫來進行上傳,如ASP,PHp等文件名2)名單列表繞過:用名單里沒有的名單進行攻擊,例如可以上傳php2,php3,php4,inc,pwml,asa,cer等文件。
3)特殊文件名繞過:在windows中空格是不允許的,上傳文件以后會自動去掉空格,如上傳test.asp_(下劃線代替空格)4)0x00截斷繞過:假如這時候獲取到的文件名是 test.asp[\0].jpg(asp后面為 0x00) 而在 gettype()函數里處理方式是從后往前掃描擴展名,所以判斷為jpg;在很多語言的函數中,比如在c,PHP等語言的常用字符串處理函數中,0x00被認為是終止符。 5).htaccess文件攻擊 但是Apache版本高于2.3.9上傳.htaccess就不在生效。(實際測試生效) 配合名單列表繞過,上傳一個自定義的.htaccess,就可以輕松繞過各種檢測 該文件僅在Apache平臺上存在,IIS平臺上不存在該文件,該文件默認開啟,啟用和關閉在httpd.conf文件中配置。該文件的寫法如下:
保存為.htaccess文件。該文件的意思是,只要遇到文件名中包含有”_php.gif”字符串的,統一按照php文件來執行。該文件在Apache里默認是啟用的,如果沒啟用,啟用方法見:http://www.jb51.net/article/25476.htm 然后就可以上傳一個帶一句話木馬的文件,例如a_php.gif,會被當成php執行。該方法其實不是漏洞,是Apache的特性。該方法常用于黑客入侵網站之后,不想被發現,留一個隱蔽的后門。在PHP手冊中提到一句話,move_uploaded_filesection,there is awarning which states‘If the destination file already exists,it will be overwritten.’服務器端如果采用了黑名單的形式限制上傳,但是黑名單中卻沒有.htaccess文件,那么我們可以上傳.htaccess文件覆蓋掉原來的文件。 6)解析調用/漏洞繞過 這類漏洞直接配合上傳一個代碼注入過的非黑名單文件即可,再利用解析調用/漏洞。如下面的解析漏洞 Apache解析漏洞:Apache對于文件名的解析是后往前解析的,直到遇到一個Apache認識的文件類型。比如:phpshell.php.rar.rar.rar.rar,Apache不認識rar這個文件類型,所有會一直遍歷到php。Apache認識的文件類型定義在Apache的mime.type文件中。(Apache 1.x,2.x) nginx和iis7.5/7.0解析漏洞 此解析漏洞其實是php的配置錯誤導致。 php為了支持path info模式創造了fix_pathinfo這個選項,當它被打開時,fpm就會判斷請求的文件是否存在,如果不存在就去掉最后一個\開始的內容,再次查看文件是否存在,不存在再去掉從\開的內容,循環往復。所以當請求http://192.168.1.100/admin/upload/shell.jpg/.php這么個文件時,fpm會把/.php去掉把shell.jpg當作php執行。 后來出現了seccurity.limit_extensions選項,這個選項默認配置.php文件才能被fpm執行。
ISS文件解析漏洞:
7)PHP CGI路徑解析問題:nginx配置fastcgi使用PHP時,會存在文件解析漏洞。 2.白名單檢測 1).htaccess文件攻擊 白名單檢測可以通過.htaccess的文件方式來進行利用 四、文件頭檢測 1)偽造一個合法的文件頭,而將真實的php代碼附在合法的文件頭以后。圖像文件相關信息檢測常用的就是 getimagesize()函數 2)我們可以通過抓包,將content-type字段改為image/gif
3) 在木馬內容基礎上再加了一些文件信息,有點像下面的結構
五、文件加載檢測 繞過方法: 針對渲染加載測試:代碼注入繞過 針對二次渲染測試:攻擊文件加載器 六、配合操作系統文件命令規則 (1)上傳不符合windows文件命名規則的文件名
(2)linux下后綴名大小寫
七、zip數據包可能導致的問題 1.未處理解壓文件 2.為遞歸檢測上傳目錄導致繞過 3.條件競爭繞過 4.解壓產生異常退出實現逃過 5.解壓特殊文件實現繞過(../) 繞過方式做一個總結 八、防止文件上傳的方式 在做實際項目的時候,一般我們只會關注7,8,9。 文件權限做控制,上傳文件做控制,訪問權限做控制。
九、總結 本篇文章總結了常見的文件上傳方式,以及在一些過濾情況下的繞過方式,最后還說了如何通過正確的方式去防止文件上傳漏洞。 閱讀原文:原文鏈接 該文章在 2025/5/14 9:29:03 編輯過 |
關鍵字查詢
相關文章
正在查詢... |