Web滲透之文件上傳漏洞總結

轉自安全脈搏HACK_Learn

概述

文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,並通過此腳本文件獲得了執行服務器端命令的能力。常見場景是web服務器允許用戶上傳圖片或者普通文本文件保存,而用戶繞過上傳機制上傳惡意代碼並執行從而控制服務器。顯然這種漏洞是getshell最快最直接的方法之一,需要說明的是上傳文件操作本身是沒有問題的,問題在於文件上傳到服務器後,服務器怎麼處理和解釋文件。

常見校驗上傳文件的方法

客戶端校驗

  1. 通過javascript來校驗上傳文件的後綴是否合法,可以採用白名單,也可以採用黑名單的方式

  2. 判斷方式:在瀏覽加載文件,但還未點擊上傳按鈕時便彈出對話框,內容如:只允許上傳.jpg/.jpeg/.png後綴名的文件,而此時並沒有發送數據包。

服務器端校驗

(1).JPEG;.JPE;.JPG,”JPGGraphicFile”(FFD8FFFE00)

(2).gif,”GIF89A”(474946383961)

(3).zip,”ZipCompressed”(504B0304)

(4).doc;.xls;.xlt;.ppt;.apr,”MSCompoundDocumentv1orLotusApproachAPRfile”(D0CF11E0A1B11AE1

  1. 校驗請求頭 content-type字段,例如用PHP檢測

  2.  

    1. 
       

      if($_FILES['userfile']['type'] != "image/gif"){
       ....
      }

    2.  

  3. 通過自己寫正則匹配來判斷文件幻數(文件頭)內容是否符合要求,一般來說屬於白名單的檢測,常見的文件頭(文件頭標誌位)如下

  4. 文件加載檢測:一般是調用API或函數去進行文件加載測試,例如圖像渲染測試,當測試結果正常的時候才允許上傳

    1、一次渲染(代碼注入)

    2、二次渲染

  5. 後綴名黑名單校驗

  6. 後綴名白名單校驗

  7. 自定義

  • WAF校驗,即使用不同的WAF產品來進行過濾,通常是獨立與服務程序的一段中間程序或者硬件

     

 

對應校驗的繞過方法

1.客戶端校驗繞過:

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

2.服務端繞過

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

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


 

POST /upload.php HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: libwww-perl/5.803
Content-Type: multipart/form-data; boundary=xYzZY
Content-Length: 155
--xYzZY
Content-Disposition: form-data; name="userfile"; filename="shell.php"
Content-Type: image/gif (原爲 Content-Type: text/plain)
<?php system($_GET['command']);?>
--xYzZY-

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

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

  • 文件加載檢測:

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

  • 後綴名檢測

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

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

    • 擴展名:列表中如果忽略了某些後綴

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

    2.      jsp jspx jspf

    3.     asp asa cer aspx

    4.     php php php3 php4 pht

    5.     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還包含這三種 :


 

/test.asa
/test.cer
/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找到LoadModule rewritemodule modules/modrewrite.so 把#號去掉,重啓apache,在網站根目錄下建立.htaccess文件


 

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .(php.|php3.) /index.php
RewriteRule .(pHp.|pHp3.) /index.php
RewriteRule .(phP.|phP3.) /index.php
RewriteRule .(Php.|Php3.) /index.php
RewriteRule .(PHp.|PHp3.) /index.php
RewriteRule .(PhP.|PhP3.) /index.php
RewriteRule .(pHP.|pHP3.) /index.php
RewriteRule .(PHP.|PHP3.) /index.php
</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.php

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

IIS7.5解析漏洞

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

 

操作系統相關

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


 

test.asp.
test.asp(空格)
test.php:1.jpg
test.php::$DATA
shell.php::$DATA…….

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

  1. linux下後綴名大小寫

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

  • CMS、編輯器漏洞

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

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

可參考以下鏈接

https://www.leavesongs.com/PENETRATION/UseOfFckeditor.html

https://docs.google.com/document/d/1w_61xR8U7nmn4Y0CvBHpG1uFIU2ORx69QnqTxQt8Km0/edit?pli=1

 

常見WAF繞過姿勢

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

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

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

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

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

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

  4. 文件重命名繞過:如果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

僞代碼演示:


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

type =gettype(name)        //而在 gettype()函數裏處理方式是從後往前掃描擴展名,所以判斷爲 jpg

if(type == jpg)

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

//最後以 help.asp 存入路徑裏

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


 

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

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

 

文件校驗的建議

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

  • 文件內容服務端校驗。

  • 上傳文件重命名。

  • 隱藏上傳文件路徑。

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

 

參考文章:

http://www.cnblogs.com/shellr00t/p/6426945.html

http://www.freebuf.com/vuls/128846.html

https://thief.one/2016/09/22/%E4%B8%8A%E4%BC%A0%E6%9C%A8%E9%A9%AC%E5%A7%BF%E5%8A%BF%E6%B1%87%E6%80%BB-%E6%AC%A2%E8%BF%8E%E8%A1%A5%E5%85%85/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章