跨網站指令碼(英語:Cross-site scripting,一般簡稱爲:XSS)是一種網站應用程式的安全漏洞攻擊,是代碼注入的一種。它容許惡意使用者將程式碼注入到網頁上,其餘使用者在觀看網頁時就會受到影響。這類攻擊一般包含了HTML以及使用者端腳本語言。php
咱們知道留言板一般的任務就是把用戶留言的內容展現出來。正常狀況下,用戶的留言都是正常的語言文字,留言板顯示的內容也就沒毛病。然而這個時候若是有人不按套路出牌,在留言內容中丟進去一行:html
<script>alert("hey!you are attacked")</script>
複製代碼
那麼留言板界面的網頁代碼就會變成形如如下:web
<html>
<head>
<title>留言板</title>
</head>
<body>
<div id="board">
<script>alert("hey!you are attacked")</script>
</div>
</body>
</html>
複製代碼
那麼別的用戶加載到留言板的時候,就會出現這個彈出框;瀏覽器
攻擊者固然不會僅僅彈出一個alert框,既然能夠插入腳本,那麼也能夠作一些其餘的事情,例如:安全
一、竊取網頁瀏覽中的cookie值,爲接下來的CSRF作準備bash
二、劫持流量實現惡意跳轉cookie
三、注入腳本得到其餘信息session
實際應用中web程序每每會經過一些過濾規則來組織代有惡意代碼的用戶輸入被顯示,如下是一些經常使用的xss攻擊繞過過濾的一些方法:frontend
一、大小寫繞過xss
http://192.168.1.102/xss/example2.php?name=<sCript>alert("hey!")</scRipt>
複製代碼
二、利用過濾後返回語句再次構成攻擊語句來繞過
http://192.168.1.102/xss/example3.php?name=<sCri<script>pt>alert("hey!")</scRi</script>pt>
複製代碼
發現問題了吧,這個利用原理在於只過濾了一個script標籤。 三、並非只有script標籤才能夠插入代碼
http://192.168.1.102/xss/example4.php?name=<img src='w.123' onerror='alert("hey!")'>
複製代碼
一、既然是代碼注入攻擊,那咱們能夠對敏感字符作轉義,以下:
function escape(str) {
str = str.replace(/&/g, "&");
str = str.replace(/</g, "<");
str = str.replace(/>/g, ">");
str = str.replace(/"/g, "&quto;");
str = str.replace(/'/g, "&##39;");
str = str.replace(/`/g, "&##96;");
str = str.replace(/\//g, "&##x2F;");
return str
}
複製代碼
二、CSP(接下來會談到)
三、過濾諸如<script>
、<img>
、<a>
標籤
三、爲防止cookie盜用,咱們還能夠在Http響應頭設置HttpOnly
上文提到了能夠用CSP來防止XSS攻擊,那CSP究竟是什麼呢?
內容安全策略 (CSP) 是一個額外的安全層,用於檢測並削弱某些特定類型的攻擊,包括跨站腳本 (XSS) 和數據注入攻擊等。不管是數據盜取、網站內容污染仍是散發惡意軟件,這些攻擊都是主要的手段;
前段時間王二想在知乎控制檯下插入一段腳本,以下:
則會提示報錯,而在有些網站(百度,Google)不會報錯;
這是由於在知乎遵循了CSP
,在網站的http頭部定義了 Content-Security-Policy
:
CSP 本質上是創建白名單,規定了瀏覽器只可以執行特定來源的代碼;
那麼即便發生了xss攻擊,也不會加載來源不明的第三方腳本;
跨站請求僞造(英語:Cross-site request forgery),也被稱爲 one-click attack 或者 session riding,一般縮寫爲 CSRF 或者 XSRF, 是一種挾制用戶在當前已登陸的Web應用程序上執行非本意的操做的攻擊方法。跟跨網站指令碼(XSS)相比,XSS 利用的是用戶對指定網站的信任,CSRF 利用的是網站對用戶網頁瀏覽器的信任。
假如一家銀行用以執行轉賬操做的URL地址以下:
http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
複製代碼
那麼,一個惡意攻擊者能夠在另外一個網站上放置以下代碼:
<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">
複製代碼
若是有帳戶名爲Alice的用戶訪問了惡意站點,而她以前剛訪問過銀行不久,登陸信息還沒有過時,那麼她就會損失1000資金。
上文說了xss能夠結合csrf使用;
在經過xss得到目標用戶的cookie後,打開目標網站的登陸界面,調出Chrome控制檯的Application面板,調至cookie選項卡:
再把目標用戶的cookie填進去,再把過時時間調長一些,
完成以後再次刷新頁面,發現已經不是以前的登陸界面了,而是登陸後的界面。至此,一個從cookie竊取到利用的過程就已完成。
對於上面說的第一個例子:
一、檢查Referer字段:HTTP頭中有一個Referer字段,這個字段用以標明請求來源於哪一個地址。在處理敏感數據請求時,一般來講,Referer字段應和請求的地址位於同一域名下。
二、添加校驗token
對於上面說的第二個例子,則作好防止xss攻擊的相應措施。
原文參考