Mirror王宇陽javascript
2019年10月28日php
Web網站一般存在文件上傳(例如:圖片、文檔、zip壓縮文件^等)只要存在上傳功能,就有可能會有上傳漏洞的危機。和SQL注入漏洞相比較而言,上傳漏洞更加危險,由於該漏洞能夠直接上傳一個WebShell到服務器上。html
利用上傳漏洞,一般須要結合Web容器(IIS、Nginx、Apache、Tomcat)的解析漏洞來讓上傳的漏洞獲得實現java
目錄名中含有.asp
字符串的(目錄下)均按照asp文件進行解析;例如:index.asp/
目錄中的全部文件都會asp解析nginx
當出現
xx.asp
命名的文件名,訪問目錄下任意一個文件,均會送給asp.dll解析(執行asp腳本)web
文件名中含有.asp;
字符,即便時jpg格式文件,IIS也會按照asp對文件進行解析apache
當文件名
xx.asp;xx.jpg
,IIS6會將文件送給asp.dll解析(按照asp腳本解析);bash請求時:IIS從左往右檢查
.
號,查詢到;
或/
號則(內存)截斷;如此執行後,IIS認識的就是xx.asp
服務器
默認解析:.asa
.cer
.cdx
IIS6 同時默認解析前面三個文件後綴,都會給asp.dll解析編輯器
修復方案:
設置權限,限制用戶建立、修改文件夾權限
更新微軟的補丁或者自定義修改IIS的檢測規則,阻止上傳非法的文件名後綴
默認開啓 Fast-CGI 狀態,在一個服務器文件URL地址後面添加xx.php
會將xx.jpg/xx.php
解析爲PHP文件
修復方法:
修改php.ini文件,將
cgi.fi: x_pathinfo
設置爲 0IIS7的解析漏洞主要是因爲PHP的配置不當致使的
Windows操做系統中,文件名不能以空格或「.」開頭,也不能以空格或「.」結尾。當把一個文件命名爲以空格或「.」開頭或結尾時,會自動地去掉開頭和結尾處的空格和「.」。利用此特性,也可能形成「文件解析漏洞」。
影響版本:0.5/0.6/<0.7.65/<0.8.37
Fast-CGI開啓狀態下,存在如同IIS7同樣的漏洞:URL地址後面添加xx.php
會將xx.jpg/xx.php
解析爲PHP文件
空字節:
xx.jpg%00.php
(部分版本中,Fast-CGI關閉下也會被執行)
修復方法:
修改php.ini文件,將
cgi.fix_pathinfo
設置爲 0 [關閉]再Nginx配置中設置:當相似
xx.jpg/xx.php
的URL訪問時候,返回403;if ( $fastcgi_script_name ~ ..*/.*php) { return 403 ; }
Apache解析文件的規則時從右到左開始判斷,若是後綴名爲不可識別文件解析,則會繼續向左判斷,直至能夠正確識別
xxx.php.owf.zip
其中.owf
和.zip
文件後綴Apache不識別,直至判斷.php
纔會按照PHP解析文件
修復方法:
Apache配置中,禁止
xx.php.xxx
相似的文件執行<Files ~ "/.(php.|php3.)"> Order Allow,Deny Deny from all </Files>
Apache中存在一個上傳的判斷邏輯:(自定義)
<?php if(isset($_FILES['file'])){ $name = basename($_POST['name']); $ext = pathinfo($name,PATHINFO_EXTNSION); if(in_array($ext,['php','php3','php4','php5','phtml','pht'])){ exit("bad file"); } move_uploaded_file($_FILES['file']['tmp_name'],'./'.$name); } ?>
判斷檢查上傳文件的後綴名,若是發現了,就進行攔截。
利用CVE-2017-15715,上傳一個包含換行符的文件。注意,只能是\x0A
,不能是\x0D\x0A
,因此咱們用hex功能在1.php後面添加一個\x0A
:
訪問/1.php%0A
,即課成功getShell;
客戶端使用JavaScript檢查上傳文件的後綴名
# js驗證文件後綴 extArray = new Array('.gif','.jpg','.png'); // 白名單 function LimitAttach(form,file){ allowSubmit = false; if(!file) return; while(file.indexOf('\\')!=-1) file = file.slice(file.indexOf('\\')+1); ext = file.slice(file.indexOf('.')).toLowerCase(); for(var i = 0 ; i < extArray.length ; i++){ if(extArray[i] == ext){ allowSubmit = true ; break ; } } if(allowSubmit) form.submit(); else alert("bad Extension"); }
通常狀況能夠經過抓包繞過客戶端的 js校驗
# php接收文件(沒有任何校驗) <?php if(isset($_POST['submit'])){ $name = $_FILES['file']['name']; //文件名 $naem = md5(date('Y-m-d h:m:s')).strrchr($name,'.');// 文件重命名保留擴展 $size = $_FILES['file']['size']; //文件字節大小 $tmp = $_FILES['file']['tmp_name']; //臨時路徑 move_uploaded_file($tmp,$name); //移動文件到tmp目錄下 echo '文件上傳成功'.$name; } ?>
繞過客戶端校驗:
使用FireBug開發者工具,在本地構造一個能夠越過觸發校驗函數便可提交表單的內容;讓校驗函數不被調用便可繞過。
另外也能夠經過抓包方式在經過客戶端校驗後修改數據包的內容。(改包過程當中可能會改動數據包的大小,須要留意Content-Length
定義的長度要與實際相符)
Content-type
字段校驗(MIME類型校驗)文件內容體檢測(檢測內容是否合法或者惡意代碼)
目錄驗證
Content-type
字段顯示文件的MIME類型,判斷MIME類型能夠對文件作簡單的過濾
# 校驗Content-type字段MIME類型 <?php if($_FILES['file']['type'] != 'image/jpeg'){ // 判斷文件的MIME格式 echo "Sorry!文件上傳格式錯誤 Error"; exit; } ?>
繞過MIME校驗:
利用Burp抓包工具,將content-type
字段改成須要的MIME類型
黑名單策略:
存在一個專門的文件,記錄服務器不容許上傳的文件名
白名單策略:
存在一個專門的文件,記錄服務器容許上傳的文件名
# 擴展名檢測 <?php if(isset($_POST['submit'])){ $name = $_FILES['file']['name']; // 獲取文件名 $ext = substr(strrchr($name,"."),1); //獲取擴展名[strrchr()找到符號"."並返回從該位置到結尾的全部字符(字符串),substr(str,1)得到擴展名字符串] while($ext==xxx){} // 調用黑白名單進行循環對比,一旦命中則執行相關的放過/攔截操做! } ?>
讓上傳的文件存儲在一個統一的目錄
# 目錄驗證 <?php if(isset($_POST['submit'])){ $name = $_FILES['file']['name']; //文件名 $naem = date('Y-m-d h:m:s').strrchr($name,'.');// 文件重命名保留擴展 $tmp = "./root/"; //存儲路徑,能夠是服務器指定或者用戶原則或則機制選擇 move_uploaded_file($tmp,$name); //移動文件到tmp目錄下 } ?>
<?php if(isset($_POST['submit'])){ $name = $_FILES['file']['name'] ; $type = $_FILES['file']['type'] ; $tmp = "./image/"; } file_array = new array('jpeg','png','jpg','gif');// 白名單 for ($i=0; $i < file_array.length; $i++) { if (substr(strrchr($name, "."),1) == file_array[i]) { if( $type == "image/gif" | $type == "image/jpeg" ){ move_uploaded_file($tmp, $name); echo "圖片上傳成功……".$name; exit; } } } ?>
常見文本編輯器:FCKEditor、Ewebeditor、UEditor、KindEditor、XHditor;合俗稱「富文本編輯器」
筆者接觸文本編輯器很少,貢獻一個不錯的參考文章: https://blog.yuntest.org/jszy/stcs/91.html