web安全之文件上傳漏洞總結


一 前言:

       在針對web的攻擊中,攻擊者想要取得webshell,最直接的方式就是將web木馬插入服務器端進行成功解析,那么如何歷劫成功解析?假設服務器為php語言結構,那么針對上傳點就是利用PHP木馬,並且要求木馬的后綴為.php進行保存。因此,上傳木馬的過程中就是在web系統中新增一個頁面,如果能成功上傳,我們就可以用菜刀工具進行連接,成功拿下webshell。er

二 文件上傳的業務流程 :

     上傳功能看似簡單,用戶選擇需上傳的文件,點擊上傳即可。但是事實上,服務器需要進行多個步驟,方可完成整個上傳流程。

  上傳攻擊思路如圖(畫的太丑請見總體來說,上傳功能的期間涉及的功能點較多,整個過程可分為三大步驟:

(1)客戶端上傳功能:

  用戶提交上傳表單,利用HTML格式,實現上傳格式的編制,在封裝到HTTP包中,開始傳輸。

(2)中間件上傳功能:

  中間件主要有三個流程:

    1.接收用戶提交的表單

    2.將表單內容存儲為臨時文件

    3.根據安全規范,將臨時文件保存為正式文件

(3)服務器存儲及調研

  服務器會存儲正式文件,並將其存放在中間件規定的真實路徑中。

  上面給出了完整的上傳業務流程,那么接下來我們再看看上傳功能的具體實現方式,通過具體的流程來分析其中的安全隱患

三 上傳攻擊的條件:

  1.目標網站具有上傳功能

  上傳攻擊的前提是:目標網站具有上傳功能,可以上傳文件,並且上傳文件,並且文件上傳到服務器能被存儲。

  2.上傳的目標文件能夠被Web服務器解析執行

  由於上傳文件需要依靠中間件解析執行,因此上傳文件后綴應為可執行格式。在APache+PHP環境下,要求上傳的web木馬采用.php后綴名(或者能有以PHP方式解析的后綴名),並且存放上傳文件的目錄要有執行腳本的權限。以上兩種缺一不可。

  3.知道文件上傳到服務器后的存放路徑和文件名稱

    許多web應用都會修改上傳文件的文件名稱,這時就需要結合其他漏洞獲取這些信息。

    如果不知道上傳的存放路徑和文件名稱,即使上傳成功也無法訪問。因此,如果上傳成功但不知道真實路徑,那么攻擊沒有任何意義。

  4.目標文件可被用戶訪問

    如果文件上傳后,卻不能通過Web訪問,或者真實路徑無法獲取,木馬這無法攻擊者打開,那么就不能成功實施攻擊。

四 上傳檢測繞過技術

  在上傳過程中,既要保證上傳功能的正常開展,又要對攻擊者的木馬情況進行過濾。

1.客戶端校驗繞過:

      (1)直接修改js代碼或者使用抓包的方法修改請求內容繞過,可以先上傳一個gif木馬,通過抓包修改為 jsp/php/asp,只用這種方法來檢測是肯定可以繞過的。

     (2)更簡單的方法是直接關掉JS

2.服務端繞過MIME 檢測

    校驗請求頭content-type字段繞過:

通過抓包來修改Http頭的content-type即可繞過,也肯定是可以繞過這種檢測

 

  1.   POST /upload.php HTTP/1.1

  2.   TE: deflate,gzip;q=0.3

  3.   Connection: TE, close

  4.   Host: localhost

  5.   User-Agent: libwww-perl/5.803

  6.   Content-Type: multipart/form-data; boundary=xYzZY

  7.   Content-Length:155

  8.   --xYzZY

  9.   Content-Disposition: form-data; name="userfile"; filename="shell.php"

  10.                       Content-Type: image/gif (原為Content-Type: text/plain)

  11.                       <?php system($_GET['command']);?>

  12.                       --xYzZY-

    文件幻數(文件頭)檢測繞過:

  在木馬內容的前面插入對應的文件頭內容,例如:GIF89a ,更保險的方法是在可上傳的文件中插入木馬代碼,然后修改后綴

 文件加載檢測:

  通過例如加載文件進行圖像渲染的方式來測試,這個時候就一般需要在正常的文件中插入木馬代碼了,例如圖像,那么插入的代碼一般會放在圖像的注釋區,因此不會影響圖像正常渲染繞過這種檢測,此時可以使用工具(稱為插馬器)來進行插入,例如edjpgcom,或者直接用copy命令來合成也可以。當然這種檢測不一定能夠完全繞過

   后綴名檢測

   后綴黑名單檢測:找查blacklist(黑名單列表)的漏網之魚,例如

  o  大小寫:如果檢測的時候不忽略大小寫,那么可以改變后綴名的大小寫繞過

  o  擴展名:列表中如果忽略了某些后綴

  3.       能被解析的文件擴展名列表:

  4.       jsp jspx jspf

  5.      asp asa cer aspx

  6.      php php php3 php4 pht

  7.      exe exee

   后綴白名單檢測:白名單檢測還是會比黑名單強一點,常見的繞過方法有%00截斷,還有服務器的解析漏洞

    %00截斷漏洞:如果存在這類漏洞,那么后綴名的檢測都可以繞過,此時我們可以如下命名一個上傳文件

   test.php%00.jpg

 解析漏洞:這類漏洞是本身服務器的中間件產生的,例如apache,nginx都被爆出過存在解析漏洞,存在解析漏洞的話,上傳的安全性幾乎就完全失去了,下面再詳細分析。

和其他漏洞結合的上傳

服務器解析漏洞

IS5.x-6.x解析漏洞

  使用iis5.x-6.x版本的服務器,大多為windows server 2003,網站比較古老,開發語句一般為asp;該解析漏洞也只能解析asp文件,而不能解析aspx文件。

目錄解析(6.0)

  形式:www.xxx.com/xx.asp/xx.jpg 原理: 服務器默認會把.asp,.asp目錄下的文件都解析成asp文件。

  文件解析

  形式:www.xxx.com/xx.asp;.jpg 原理:服務器默認不解析;號后面的內容,因此xx.asp;.jpg便被解析成asp文件了。 解析文件類型

  IIS6.0 默認的可執行文件除了asp還包含這三種 :

  1. /test.asa

  2./test.cer

  3./test.cdx

apache解析漏洞

  漏洞原理

  Apache 解析文件的規則是從右到左開始判斷解析,如果后綴名為不可識別文件解析,就再往左判斷。比如 test.php.qwe.asd “.qwe”和”.asd” 這兩種后綴是apache不可識別解析,apache就會把wooyun.php.qwe.asd解析成php。

漏洞形式

  www.xxxx.xxx.com/test.php.php123

  其余配置問題導致漏洞

  1.   如果在 Apache 的 conf里有這樣一行配置 AddHandler php5-script .php 這時只要文件名里包含.php 即使文件名是 test2.php.jpg 也會以 php 來執行。

  2.   如果在 Apache 的 conf里有這樣一行配置 AddType application/x-httpd-php .jpg 即使擴展名是 jpg,一樣能以 php 方式執行。

修復方案

  1.   apache配置文件,禁止.php.這樣的文件執行,配置文件里面加入

  2.   用偽靜態能解決這個問題,重寫類似.php.*這類文件,打開apache的httpd.conf找到LoadModulerewritemodule modules/modrewrite.so 把#號去掉,重啟apache,在網站根目錄下建立.htaccess文件

  1. <IfModulemod_rewrite.c>

  2. RewriteEngineOn

  3. RewriteRule.(php.|php3.) /index.php

  4. RewriteRule.(pHp.|pHp3.) /index.php

  5. RewriteRule.(phP.|phP3.) /index.php

  6. RewriteRule.(Php.|Php3.) /index.php

  7. RewriteRule.(PHp.|PHp3.) /index.php

  8. RewriteRule.(PhP.|PhP3.) /index.php

  9. RewriteRule.(pHP.|pHP3.) /index.php

  10.        RewriteRule .(PHP.|PHP3.) /index.php

  11.        </IfModule>

nginx解析漏洞

  漏洞原理

  Nginx默認是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通過正則匹配設置 SCRIPT_FILENAME。當訪問 www.xx.com/phpinfo.jpg/1.php這個URL時, $fastcgi_script_name會被設置為 phpinfo.jpg/1.php,然后構造成 SCRIPT_FILENAME傳遞給PHP CGI,但是PHP為什么會接受這樣的參數,並將phpinfo.jpg作為PHP文件解析呢?這就要說到fix_pathinfo這個選項了。如果開啟了這個選項,那么就會觸發在PHP中的如下邏輯:

PHP會認為SCRIPTFILENAME是phpinfo.jpg,而1.php是PATHINFO,所以就會將phpinfo.jpg作為PHP文件來解析了

  漏洞形式

  www.xxxx.com/UploadFiles/image/1.jpg/1.php

  www.xxxx.com/UploadFiles/image/1.jpg %00.php

  www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php

  另外一種手法:上傳一個名字為test.jpg,然后訪問test.jpg/.php,在這個目錄下就會生成一句話木馬shell.php。

IIS7.5解析漏洞

  IIS7.5的漏洞與nginx的類似,都是由於php配置文件中,開啟了 cgi.fix_pathinfo,而這並不是nginx或者iis7.5本身的漏洞。

操作系統相關

  1.   上傳不符合windows文件命名規則的文件名

  1. test.asp.

  2. test.asp(空格)

  3. test.php:1.jpg

  4. test.php::$DATA

  5. shell.php::$DATA…….

  會被某些版本的windows系統自動去掉不符合規則符號后面的內容。

  1.  linux下后綴名大小寫

  linux是大小寫敏感的,因此一般檢測也會區分大小寫,但某些解析器是不區分大小寫的,例如PHP,上傳php不被解析,可以試試上傳pHp后綴的文件名。

  2.  CMS、編輯器漏洞

   CMS漏洞: 可以針對不同CMS存在的上傳漏洞進行繞過。

   編輯器漏洞:比如FCK,ewebeditor等,可以針對編輯器的漏洞進行繞過。

常見WAF繞過姿勢

  1.  大小上限:WAF對校驗的用戶數據設置大小上限,此時可以構造一個大文件的木馬,前面都是填充的垃圾內容

  2.  filename:針對早期版本的安全狗,可以多加一個filename來繞過,

 

  或者可以通過吧filename放在非常規的位置來繞過(這里的filename指在http請求頭中上傳的文件名字)

 

  3.  post/get:如果WAF規則是:只檢測特定請求類型的數據包,但服務端接收的時候卻用了request來,此時通過修改請求頭的請求方法就可以繞過

  4.  利用waf本身的缺陷,對於不同的waf產品可以搜索其對應的漏洞缺陷,進行繞過

  5.  利用NTFS ADS特性:ADS是NTFS磁盤格式的一個特性,用於NTFS交換數據流。在上傳文件時,如果waf對請求正文的filename匹配不當的話可能會導致繞過

  6.  文件重命名繞過:如果web程序會將filename除了擴展名的那段重命名的話,那么還可以構造更多的點、符號等等。

和其他規則結合

  1.  截斷:例如 %00, 0x00等

  test.php(0x00).jpg

  test.php%00.jpg

  路徑/upload/1.php(0x00),文件名1.jpg,結合/upload/1.php(0x00)/1.jpg

偽代碼演示:

  1. name= getname(httprequest) //假如這時候獲取到的文件名是help.asp.jpg(asp 后面為 0x00)

  2. type =gettype(name)        //而在 gettype()函數里處理方式是從后往前掃描擴展名,所以判斷為 jpg

  3. if(type == jpg)

  4.    SaveFileToPath(UploadPath.name, name)   //但在這里卻是以 0x00 作為文件名截斷

  5. //最后以 help.asp 存入路徑里

  1.   可上傳.htaccesss,上傳當前目錄的.htaccess 文件然后修改為以下內容:

  1. AddTypeapplication/x-http-php .jpg   #(上傳的jpg 均以php執行)

  把.htaccess 上傳后,且上傳成功后,再上傳內容為一句話的jpg文件

文件校驗的建議

  § 文件擴展名服務端白名單校驗。

  § 文件內容服務端校驗。

  § 上傳文件重命名。

  § 隱藏上傳文件路徑。

以上幾點,可以防御絕大多數上傳漏洞,但是需要跟服務器容器結合起來。如果解析漏洞依然存在,那么沒有絕對的安全。

 

參考書籍《Web安全防護指南》

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

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



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