Mirror王宇陽
2019年10月28日
Web網(wǎng)站通常存在文件上傳(例如:圖片、文檔、zip壓縮文件^等)只要存在上傳功能,就有可能會(huì)有上傳漏洞的危機(jī)。和SQL注入漏洞相比較而言,上傳漏洞更加危險(xiǎn),因?yàn)樵撀┒纯梢灾苯由蟼饕粋€(gè)WebShell到服務(wù)器上。
利用上傳漏洞,通常需要結(jié)合Web容器(IIS、Nginx、Apache、Tomcat)的解析漏洞來讓上傳的漏洞得到實(shí)現(xiàn)
目錄名中含有.asp
字符串的(目錄下)均按照asp文件進(jìn)行解析;例如:index.asp/
目錄中的所有文件都會(huì)asp解析
當(dāng)出現(xiàn)
xx.asp
命名的文件名,訪問目錄下任意一個(gè)文件,均會(huì)送給asp.dll解析(執(zhí)行asp腳本)
文件名中含有.asp;
字符,即使時(shí)jpg格式文件,IIS也會(huì)按照asp對(duì)文件進(jìn)行解析
當(dāng)文件名
xx.asp;xx.jpg
,IIS6會(huì)將文件送給asp.dll解析(按照asp腳本解析);請(qǐng)求時(shí):IIS從左往右檢查
.
號(hào),查詢到;
或/
號(hào)則(內(nèi)存)截?cái)?;如此?zhí)行后,IIS認(rèn)識(shí)的就是xx.asp
默認(rèn)解析:.asa
.cer
.cdx
IIS6 同時(shí)默認(rèn)解析前面三個(gè)文件后綴,都會(huì)給asp.dll解析
修復(fù)方案:
設(shè)置權(quán)限,限制用戶創(chuàng)建、修改文件夾權(quán)限
更新微軟的補(bǔ)丁或者自定義修改IIS的檢測規(guī)則,阻止上傳非法的文件名后綴
默認(rèn)開啟 Fast-CGI 狀態(tài),在一個(gè)服務(wù)器文件URL地址后面添加xx.php
會(huì)將xx.jpg/xx.php
解析為PHP文件
修復(fù)方法:
修改php.ini文件,將
cgi.fi: x_pathinfo
設(shè)置為 0IIS7的解析漏洞主要是由于PHP的配置不當(dāng)導(dǎo)致的
Windows操作系統(tǒng)中,文件名不能以空格或“.”開頭,也不能以空格或“.”結(jié)尾。當(dāng)把一個(gè)文件命名為以空格或“.”開頭或結(jié)尾時(shí),會(huì)自動(dòng)地去掉開頭和結(jié)尾處的空格和“.”。利用此特性,也可能造成“文件解析漏洞”。
影響版本:0.5/0.6/<0.7.65/<0.8.37
Fast-CGI開啟狀態(tài)下,存在如同IIS7一樣的漏洞:URL地址后面添加xx.php
會(huì)將xx.jpg/xx.php
解析為PHP文件
空字節(jié):
xx.jpg%00.php
(部分版本中,F(xiàn)ast-CGI關(guān)閉下也會(huì)被執(zhí)行)
修復(fù)方法:
修改php.ini文件,將
cgi.fix_pathinfo
設(shè)置為 0 [關(guān)閉]再Nginx配置中設(shè)置:當(dāng)類似
xx.jpg/xx.php
的URL訪問時(shí)候,返回403;if ( $fastcgi_script_name ~ ..*/.*php) { return 403 ; }
Apache解析文件的規(guī)則時(shí)從右到左開始判斷,如果后綴名為不可識(shí)別文件解析,則會(huì)繼續(xù)向左判斷,直至可以正確識(shí)別
xxx.php.owf.zip
其中.owf
和.zip
文件后綴Apache不識(shí)別,直至判斷.php
才會(huì)按照PHP解析文件
修復(fù)方法:
Apache配置中,禁止
xx.php.xxx
類似的文件執(zhí)行<Files ~ "/.(php.|php3.)"> Order Allow,Deny Deny from all </Files>
Apache中存在一個(gè)上傳的判斷邏輯:(自定義)
<?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);
}
?>
判斷檢查上傳文件的后綴名,如果發(fā)現(xiàn)了,就進(jìn)行攔截。
利用CVE-2017-15715,上傳一個(gè)包含換行符的文件。注意,只能是\x0A
,不能是\x0D\x0A
,所以我們用hex功能在1.php后面添加一個(gè)\x0A
:
? 訪問/1.php%0A
,即課成功getShell;
客戶端使用JavaScript檢查上傳文件的后綴名
# js驗(yàn)證文件后綴
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校驗(yàn)
# php接收文件(沒有任何校驗(yàn))
<?php
if(isset($_POST['submit'])){
$name = $_FILES['file']['name']; //文件名
$naem = md5(date('Y-m-d h:m:s')).strrchr($name,'.');// 文件重命名保留擴(kuò)展
$size = $_FILES['file']['size']; //文件字節(jié)大小
$tmp = $_FILES['file']['tmp_name']; //臨時(shí)路徑
move_uploaded_file($tmp,$name); //移動(dòng)文件到tmp目錄下
echo '文件上傳成功'.$name;
}
?>
繞過客戶端校驗(yàn):
使用FireBug開發(fā)者工具,在本地構(gòu)造一個(gè)可以越過觸發(fā)校驗(yàn)函數(shù)即可提交表單的內(nèi)容;讓校驗(yàn)函數(shù)不被調(diào)用即可繞過。
另外也可以通過抓包方式在通過客戶端校驗(yàn)后修改數(shù)據(jù)包的內(nèi)容。(改包過程中可能會(huì)改動(dòng)數(shù)據(jù)包的大小,需要留意Content-Length
定義的長度要與實(shí)際相符)
Content-type
字段校驗(yàn)(MIME類型校驗(yàn))
文件擴(kuò)展名檢測(檢測文件Extension相關(guān)的內(nèi)容)采用黑白名單過濾的機(jī)制
文件內(nèi)容體檢測(檢測內(nèi)容是否合法或者惡意代碼)
目錄驗(yàn)證
Content-type
字段顯示文件的MIME類型,判斷MIME類型可以對(duì)文件做簡單的過濾
# 校驗(yàn)Content-type字段MIME類型
<?php
if($_FILES['file']['type'] != 'image/jpeg'){ // 判斷文件的MIME格式
echo "Sorry!文件上傳格式錯(cuò)誤 Error";
exit;
}
?>
繞過MIME校驗(yàn):
利用Burp抓包工具,將content-type
字段改為需要的MIME類型
黑名單策略:
存在一個(gè)專門的文件,記錄服務(wù)器不允許上傳的文件名
白名單策略:
存在一個(gè)專門的文件,記錄服務(wù)器允許上傳的文件名
# 擴(kuò)展名檢測
<?php
if(isset($_POST['submit'])){
$name = $_FILES['file']['name']; // 獲取文件名
$ext = substr(strrchr($name,"."),1); //獲取擴(kuò)展名[strrchr()找到符號(hào)"."并返回從該位置到結(jié)尾的所有字符(字符串),substr(str,1)獲得擴(kuò)展名字符串]
while($ext==xxx){}
// 調(diào)用黑白名單進(jìn)行循環(huán)對(duì)比,一旦命中則執(zhí)行相關(guān)的放過/攔截操作!
}
?>
讓上傳的文件存儲(chǔ)在一個(gè)統(tǒng)一的目錄
# 目錄驗(yàn)證
<?php
if(isset($_POST['submit'])){
$name = $_FILES['file']['name']; //文件名
$naem = date('Y-m-d h:m:s').strrchr($name,'.');// 文件重命名保留擴(kuò)展
$tmp = "./root/"; //存儲(chǔ)路徑,可以是服務(wù)器指定或者用戶原則或則機(jī)制選擇
move_uploaded_file($tmp,$name); //移動(dòng)文件到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;合俗稱“富文本編輯器”
筆者接觸文本編輯器不多,貢獻(xiàn)一個(gè)不錯(cuò)的參考文章: https://blog.yuntest.org/jszy/stcs/91.html
聯(lián)系客服