安全|常見的Web攻擊手段之XSS攻擊

對于常規(guī)的Web攻擊手段,如XSS、CRSF、SQL注入、(常規(guī)的不包括文件上傳漏洞、DDoS攻擊)等,防范措施相對來說比較容易,對癥下藥即可,比如XSS的防范需要轉(zhuǎn)義掉輸入的尖括號,防止CRSF攻擊需要將cookie設(shè)置為httponly,以及增加session相關(guān)的Hash token碼 ,SQL注入的防范需要將分號等字符轉(zhuǎn)義,等等做起來雖然筒單,但卻容易被忽視,更多的是需要從開發(fā)流程上來予以保障(這句話是給技術(shù)管理者的建議),以免因人為的疏忽而造成損失。

一、XSS介紹

XSS攻擊的全稱是跨站腳本攻擊(Cross Site Scripting),為不跟層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,它是Web應(yīng)用程序中最常見到的攻擊手段之一??缯灸_本攻擊指的是攻擊者在網(wǎng)頁中嵌入惡意腳本程序,當(dāng)用戶打幵該網(wǎng)頁時,腳本程序便開始在客戶端的瀏覽器上執(zhí)行,以盜取客戶端cookie、用戶名密碼,下載執(zhí)行病毒木馬程序,甚至是獲取客戶端admin權(quán)限等。

1.1、XSS的原理

假設(shè)頁面上有個表單,表單名稱為nick,用來向服務(wù)端提交網(wǎng)站用戶的昵稱信息:
<input type= "text" name= "nick" value= "xiaomaon>
表單nick的內(nèi)容來自用戶的輸入,當(dāng)用戶輸入的不是一個正常的昵稱字符串,而是XSS漏洞測試<script>alert("我是小怪,我在做XSS漏洞測試,我懷疑你們的網(wǎng)站有XSS攻擊安全漏洞")</script><!-時,由于某種原因,如nick服務(wù)端校驗(yàn)不通過,服務(wù)端重定向回這個頁面,并且?guī)现坝脩糨斎氲膎ick參數(shù),此時頁面則變成下面的內(nèi)容:
<input type="text" name="nick" value=""/><script>alert ("我是小怪,我在做XSS漏洞測試,我懷疑你們的網(wǎng)站有XSS攻擊安全漏洞") </script><!-/>
在輸入框input的后面帶上了一段腳本程序,當(dāng)然,這段腳本程序只是彈出一個消息“我是小怪,我在做XSS漏洞測試,我懷疑你們的網(wǎng)站有XSS攻擊安全漏洞”,如下圖1所示,并不會造成什么危害,攻擊的威力取決于用戶輸入了什么樣的腳本,
只要稍微修改,便可使攻擊極具危害性。

圖1 XSS攻擊的結(jié)果

攻擊者可以對該URL采用URLEncode,如下圖2所示,以迷惑用戶,讓它看起來像是一個正常的推廣鏈接,并且以郵件群發(fā)或者其他形式進(jìn)行推廣,一旦用戶點(diǎn)擊,腳本將在客戶端執(zhí)行,對用戶造成危害。

圖2 URLEncode編碼后的XSS鏈接地址

還有一種場景,用戶在表單上輸入一段數(shù)據(jù)后,提交給服務(wù)端進(jìn)行持久化,其他頁面需要從服務(wù)端將數(shù)據(jù)取出來展示。還是使用之前那個表單nick,用戶輸入昵稱之后,服務(wù)端會將nick保存,并在新的頁面中展現(xiàn)給用戶,當(dāng)普通用戶正常輸入zhangsan,頁面會顯示用戶的nick為zhangsan:

<body>
    zhangsan
</body>

但是,如果用戶輸入的不是一段正常的nick字符串,而是<script>alert ("我是小怪,我在做XSS漏洞測試,我懷疑你們的網(wǎng)站有XSS攻擊安全漏洞") </script>,服務(wù)端會將這段腳本保存起來,當(dāng)有用戶查看該頁面時,頁面會出現(xiàn)如下代碼:

<body>
    <script>alert ("我是小怪,我在做XSS漏洞測試,我懷疑你們的網(wǎng)站有XSS攻擊安全漏洞") </script>
</body>

同樣,攻擊的威力取決于用戶輸入的腳本,并且此種XSS攻擊比前一種具有更為廣泛的危害性,比如當(dāng)一個惡意用戶在一家知名博客網(wǎng)站上轉(zhuǎn)載了一篇非?;鸬牟┪?,文章中嵌入了惡意的腳本代碼,其他人訪問這篇文章時,嵌入在文章中的腳本代碼便會執(zhí)行,達(dá)到惡意攻擊用戶的目的。

1.2、XSS防范

XSS之所以會發(fā)生,是因?yàn)橛脩糨斎氲臄?shù)據(jù)變成了代碼。因此,我們需要對用戶輸入的數(shù)據(jù)進(jìn)行HTML轉(zhuǎn)義處理,將其中的“尖括號”、“單引號”、“引號”之類的特殊字符進(jìn)行轉(zhuǎn)義編碼:

HTML字符 HTML轉(zhuǎn)義后的字符
< &lt;
> &gt;
&amp;
&quot;

如今很多開源的幵發(fā)框架本身默認(rèn)就提供HTML代碼轉(zhuǎn)義的功能,如流行的jstl、Struts等,不需要開發(fā)人員再進(jìn)行過多的開發(fā)。使用jstl標(biāo)簽進(jìn)行HTML轉(zhuǎn)義,將變量輸出,代碼如下:
<c:out value= "${nick}" escapeXml="true" </c:out>
只需要將escapeXml設(shè)置為true,jstl就會將變量中的HTML代碼進(jìn)行轉(zhuǎn)義輸出。

二、總結(jié)

原本以為這個是最基本的,實(shí)際上很多網(wǎng)站沒有做到,所以特意編寫一下這個Web攻擊的系列,系列內(nèi)容包括XSS、CRSF、SQL注入、文件上傳漏洞、DDoS攻擊等。
文章內(nèi)容來源于《大型分布式網(wǎng)站架構(gòu) 設(shè)計(jì)與實(shí)踐》一書。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容