WEB服務端安全---文件上傳漏洞


1、簡述

  文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,並通過此腳本文件獲得了執行服務端命令的能力。這種攻擊方式是最直接和有效的,而且互聯網中我們經常會用到文件上傳功能,它本身是沒有問題的,正常的業務需求,可是文件上傳后服務器如果不能安全有效的處理或解釋文件,往往會造成嚴重的后果。

常見的安全問題:

  上傳的文件是web腳本語言,服務器的web容器解釋並執行了用戶上傳的腳本,導致代碼執行;

  上傳的文件是flash的策略文件crossdomain.xml,黑客用以控制flash在該領域下的行為;

  上傳的文件是病毒、木馬文件,黑客用以誘騙用戶或管理員下載執行;

  上傳的文件是釣魚圖片或者包含了腳本的圖片,在某些版本的瀏覽器中會被作為腳本執行,被用於釣魚和欺詐

大多數情況下文件長傳漏洞一般都是值值指第一點(webshell問題),完成該攻擊的條件如下:

  上傳的文件能夠被web容器解釋執行;

  用戶能夠從web訪問該文件;

  上傳的文件不被安全檢查、格式化、圖片壓縮等改變內容。

 

2、文件上傳漏洞舉例

  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的圖片就會進行釣魚傳播。

    

 

3、安全措施

  a 文件上傳的目錄設置為不可執行

  只要web容器無法解析該目錄下的文件,及時供給者上傳了腳本文件,服務器本身也不會受到影響.

  b 判斷文件類型

  在判斷文件類型時,可以結合使用MIME Type 后綴檢查等方式.文件類型檢查中,強烈推薦白名單方式,黑名單的方式已經無數次被證明是不可靠的.此外對圖片的處理可以使用壓縮函數等,在處理圖片的同時破壞圖片中可能包含的html代碼.

  c 使用隨機數改寫文件名和路徑

  文件上傳如果要執行代碼,則需要能過訪問到上傳的文件,如果應用使用隨機數改寫了文件名和路徑,將極大的增加攻擊的成本.某些特定文件名的文件也將應為文件名的更改而無法成功實施攻擊.

  d 單獨設置文件服務器的域名

  由於瀏覽器同源策略的關系,一系列客戶端攻擊將失敗,如:上傳crossdomain.xml  上傳包含JavaScript的XSS利用等問題將得到解決.

 

總之,文件上傳往往與代碼執行聯系在一起,因此對於業務中要用到的上傳功能,都應該有安全工程師進行嚴格檢查。同時文件上傳又可能存在諸如釣魚、木馬、等危害到最終用戶的業務風險問題,因此這一領域我們也要充分考慮。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM