Web安全 - 文件上傳漏洞

  • 文件上傳漏洞原理

文件上傳漏洞是指由於程序員未對上傳的文件進行嚴格的驗證和過濾,導致用戶可以越過其本身權限向服務器上上傳可執行的動態腳本文件。這裏上傳的文件可以是木馬,病毒,惡意腳本或者WebShell等。這種攻擊方式是最爲直接和有效的,“文件上傳”本身沒有問題,有問題的是文件上傳後,服務器怎麼處理、解釋文件。如果服務器的處理邏輯做的不夠安全,則會導致嚴重的後果。
即文件上傳漏洞的原理是web應用程序沒有將用戶提交的數據文件和Web應用程序代碼進行有效的隔離,混淆了兩者的邊界,進而把惡意用戶提交的含有惡意代碼的文件被中間件解析執行。

  • 什麼是Web容器?

web容器是一種服務程序,在服務器一個端口就有一個提供相應服務的程序,而這個程序就是處理從客戶端發出的請求,如tomcat、apache、nginx等等。(可以理解爲給編程語言提供環境)

  • 什麼是中間件?

提供系統軟件和應用軟件之間連接的軟件,以便於軟件各部件之間的溝通。中間件處在操作系統和更高一級應用程序之間。

  • 什麼是容器?

給處於其中的應用程序組件(ASP,JSP,PHP)提供一個環境。使處於其中的應用程序組件之間跟容器中的環境變量接口交互,不必關注其他系統問題。

  • 什麼是服務器?

www服務器或http服務器。提供web信息遊覽服務。它只需支持http協議、html文檔格式以及url,向遊覽器提供服務的程序。

  • Webshell簡介:

WebShell就是以asp、php、jsp或者cgi等網頁文件形式存在的一種命令執行環境,也可以將其稱之爲一種網頁後門。攻擊者在入侵了一個網站後,通常會將這些asp或php後門文件與網站服務器web目錄下正常的網頁文件混在一起,然後使用瀏覽器來訪問這些後門,得到一個命令執行環境,以達到控制網站服務器的目的(可以上傳下載或者修改文件,操作數據庫,執行任意命令等)。
WebShell後門隱蔽較性高,可以輕鬆穿越防火牆,訪問WebShell時不會留下系統日誌,只會在網站的web日誌中留下一些數據提交記錄,沒有經驗的管理員不容易發現入侵痕跡。攻擊者可以將WebShell隱藏在正常文件中並修改文件時間增強隱蔽性,也可以採用一些函數對WebShell進行編碼或者拼接以規避檢測。除此之外,通過一句話木馬的小馬來提交功能更強大的大馬可以更容易通過應用本身的檢測。<?php eval($_POST[a]); ?>就是一個最常見最原始的小馬。

- 什麼是IIS?

IIS全稱是互聯網信息服務,包括FTP/FTPS、NNTP、HTTP/HTTPS、SMTP等服務。

- 什麼是文件解析?

當服務器接收到一個HTTP請求的時候,IIS首先需要決定如何去處理這個請求(服務器處理.aspx和.html肯定是不一樣的),根據的是文件的後綴名。

服務器獲取所請求的頁面(也可以是文件)的後綴名後接下來會在服務器端尋找可以處理這類後綴名的應用程序,如果IIS找不到可以處理此類文件的應用程序,那麼IIS將直接把這個文件返還給客戶端。

造成文件上傳漏洞的原因以及原理:

常見文件上傳漏洞位置:
  1. 上傳用戶頭像
  2. 上傳文章的附件
  3. 上傳個人身份認證信息
  4. 上傳提交相關的資料
    在這裏插入圖片描述
常見文件上傳漏洞分析

在這裏插入圖片描述

文件上傳漏洞的攻擊與防禦

1. 任意文件上傳(不做任何限制)
任意文件上傳漏洞是指web應用系統沒有對用戶上傳的文件做任何校驗就直接上傳到服務器,惡意用戶可以直接上傳一句話木馬到web服務器,從而控制web服務器。
2.客戶端檢測(前臺限制文件拓展名)
校驗方法:通過JavaScript來校驗上傳文件的後綴是否合法,可以採用白名單,也可以採用黑名單的方式

<html>
<head>
<title>圖片上傳</title>
<script type="text/javascript">
	function checkFile() {
		var flag=false;                                  //是否可以上傳的標誌位
		var str=document.getElementById("file").value;   //獲取文件名
		str=str.substring(str.lastIndexOf('.')+1);    	 //得到擴展名
		var arr=new Array('png','bmp','gif','jpg');		 //允許上傳的擴展名
		for(var i=0;i<arr.length;i++) {
			if(str==arr[i]) {
				flag=true; 								 //判斷文件名是否合法
			}
		}
		if(!flag) {
			alert('文件不合法');
		}
		return flag;
	}
</script>
</head>
<body>
 
		<from 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>
</body>
</html>		
upload.php用來接收文件,在接受文件後,將文件重命名放到本目錄下。
<?php
	if(isset($_POST["submit"])) {
		$name= $_FILES['file']['name'];                       //接收文件名
		$name=md5(data('Y-m-d h:m:s')).strrchr($name,".");    //文件名重命名操作,保留原有擴展名
		$size=$_FILES['files']['size'];                       //接收文件大小
		$tmp=$_FILES['file']['tmp_name'];                     //臨時路徑
		move_upload_file($tmp,$name);                         //移動臨時文件到當前文件目錄
		echo "文件上傳成功 path:".$name;
	}	
?>

原文鏈接:https://blog.csdn.net/weixin_39190897/article/details/85334893
判斷方式:在瀏覽器加載文件,但還未點擊上傳按鈕時便彈出對話框,內容如:只允許上傳.jpg/.jpeg/.png後綴名的文件,而此時並沒有發送數據包。
繞過方法:
(1)禁用JS:在本地瀏覽器客戶端禁用JS即可。可使用火狐瀏覽器的NoScript插件、IE中禁用掉JS等方式實現。
禁用JS操作手冊:禁用JS操作手冊
(2)修改JS:
a:修改JS,將自定義的文件類型後綴添加進去
在這裏插入圖片描述
b:刪除對js驗證腳本的調用,使其不能對上傳文件類型做檢測,從而達到繞過的目的。同樣的通過審查元素,查看到form表單的內容,form的開始標籤爲<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">,其中的οnsubmit="return checkFile()"的作用就是當點擊上傳按鈕的時候,就會觸發js驗證腳本,所以將這一部分刪除,就可以成功繞過檢測:
在這裏插入圖片描述

原文鏈接:https://blog.csdn.net/weixin_39190897/article/details/85334893
(3)用Burp抓包改包:過前臺腳本檢測擴展名,就是將所要上傳文件的擴展名更改爲符合腳本檢測規則的擴展名,通過BurpSuite工具,截取數據包,並將數據包中文件擴展名更改回原來的,達到繞過的目的。
例如:文件名本來爲【evil.jpg】,上傳時,用BurpSuite截包後,將數據包中的名字改爲【evil.php】(或其它腳本類型)即可
3.服務端校驗
(1)拓展名校驗
在這裏插入圖片描述
情況一:黑白名單驗證
(1)黑名單過濾方式
黑名單過濾是一種不安全的方式,黑名單定義了一系列不安全的擴展名,服務器端在接收文件後,與黑名單擴展名對比,如果發現文件擴展名與黑名單裏的擴展名匹配,則認爲文件不合法。

$postfix = end(explode('.','$_POST['filename']);
if($postfix=='php'||$postfix=='asp'||$postfix=='sh'){
  echo "invalid file type";
  return;
}

(2)白名單過濾方式
白名單的過濾方式與黑名單恰恰相反,黑名單是定義不允許上傳的文件擴展名,而白名單則是定義允許上傳的擴展名,白名單擁有比黑名單更好的防禦機制。如:

$WhiteList=
array(rar’,jpg’,png,bmpy,gif,jpg;doc);

在獲取到文件擴展名後對 WhiteList數組裏的擴展名迭代判斷,如果文件擴展名被命中,程序將認爲文件是合法的,否則不允許上傳。

$postfix = end(explode('.','$_POST['filename']);
if($postfix=='jpg'||$postfix=='png'||$postfix=='gif'){
  //save the file and do something next
} else {
  echo "invalid file type";
  return;
}

白名單策略是更加安全的,通過限制上傳類型爲只有我們接受的類型,可以較好的保證安全,因爲黑名單我們可以使用各種方法來進行注入和突破。
**原理:**當瀏覽器將文件提交到服務器端的時候,服務器端會根據設定的黑白名單對瀏覽器提交上來的文件拓展名進行檢測,如果上傳的文件拓展名不符合黑白名單的限制,則不予上傳,否則上傳成功。
繞過方法::在一些Web server中,存在解析漏洞
1.老版本的IIS6中的目錄解析漏洞,如果網站目錄中有一個 /.asp/目錄,那麼此目錄下面的一切內容都會被當作asp腳本來解析
2.老闆本的IIS6中的分號漏洞:IIS在解析文件名的時候可能將分號後面的內容丟棄,那麼我們可以在上傳的時候給後面加入分號內容來避免黑名單過濾,如 a.asp;jpg
3.舊版Windows Server中存在空格和dot漏洞類似於 a.php. 和 a.php[空格] 這樣的文件名存儲後會被windows去掉點和空格,從而使得加上這兩個東西可以突破過濾,成功上傳,並且被當作php代碼來執行
4.nginx(0.5.x, 0.6.x, 0.7 <= 0.7.65, 0.8 <= 0.8.37)空字節漏洞 xxx.jpg%00.php 這樣的文件名會被解析爲php代碼運行(fastcgi會把這個文件當php看,不受空字節影響,但是檢查文件後綴的那個功能會把空字節後面的東西拋棄,所以識別爲jpg)
5.apache1.x,2.x的解析漏洞,上傳如a.php.rar a.php.gif 類型的文件名,可以避免對於php文件的過濾機制,但是由於apache在解析文件名的時候是從右向左讀,如果遇到不能識別的擴展名則跳過,rar等擴展名是apache不能識別的,因此就會直接將類型識別爲php,從而達到了注入php代碼的目的
情況二:header MIME驗證
原理:HTTP協議規定了上傳資源的時候在Header中加上一項文件的MIMETYPE來識別文件類型,這個動作是由瀏覽器完成得,服務端可以檢查此類型,不過這仍然是不安全的,因爲HTTP header可以被髮出者或者中間人任意的修改。
MIME參考手冊
繞過方法:使用各種各樣的工具(如burpsuite)強行篡改Header就可以,將Content-Type: application/php改爲其他web程序允許的類型
Content-Type: image/jpg
Content-Type: image/png
Content-Type: text/plain。
情況三:目錄驗證
在文件上傳時,程序通常允許用戶將文件放到指定的目錄中,然而有些Web開發人員爲了讓代碼更健壯,通常會做一個操作,如果指定的目錄存在,就將文件寫入目錄中,不存在則先建立目錄,然後寫入。
https://www.cnblogs.com/bmjoker/p/8970006.html
情況四:截斷上傳攻擊
文件名後綴有一個%00字節,可以截斷某些函數對文件名的判斷。在許多語言函 數中,處理字符串的函數中0x00被認爲是終止符
例如: 網站上傳函數處理xxx.asp%00.jpg時,首先後綴名是合法的jpg格式,可以 上傳,在保存文件時,遇到%00字符丟棄後面的 .jpg,文件後綴最終保存的後綴 名爲xxx.asp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章