在Web的開發中,存在一些不合法的腳本或文本會被瀏覽器執行,這些腳本可能被黑客用於攻擊,造成一些安全問題,這其中就包括了跨站腳本攻擊(XSS)。本文將從多個方面對XSS測試做詳細的闡述。
一、XSS測試簡介
XSS測試是指通過構造一些惡意腳本代碼並通過數據輸入渠道將其注入到網站的頁面中,從而實現惡意攻擊的測試。XSS測試主要分為三種類型:反射型、存儲型與DOM-Based型。其中,反射型與存儲型是最為典型的兩種,這兩種XSS類型佔據了百分之八十的攻擊場景。DOM-Based型是近年來才出現的XSS類型,攻擊場景較少。
以下代碼是一個簡單的反射型XSS測試案例,該案例將在輸入框輸入惡意代碼後,以彈窗的方式被瀏覽器執行:
<html> <head> <title>反射型XSS測試</title> </head> <body> <form action="/" method="get"> <input type="text" name="input"> <button type="submit">提交</button> </form> <script> var urlParams = new URLSearchParams(window.location.search); var input = urlParams.get('input'); alert(input); </script> </body> </html>
二、反射型XSS測試
1、測試流程
反射型XSS測試的主要流程如下:
1)分析目標站點頁面,確定存在可注入的參數;
2)手動或利用測試工具構建包含惡意腳本的請求,發送至目標站點;
3)查看響應結果,在存在XSS漏洞的情況下,頁面將會被惡意腳本劫持,用戶無法正常操作。
2、測試案例
以下代碼是一個反射型XSS測試案例,該案例將在輸入框輸入惡意代碼後,以彈窗的方式被瀏覽器執行。此外,在這個案例中還演示了用JavaScript對用戶輸入進行轉義的方法:
<html> <head> <title>反射型XSS測試</title> <script> function escapeHTML(str) { return str.replace(/[<>"']/g, function(match){ return { '<': '<', '>': '>', '&': '&', '"': '"', "'": ''' }[match]; }); } function submitForm() { var input = document.getElementById("input").value; input = escapeHTML(input); document.getElementById("output").innerHTML = input; } </script> </head> <body> <form> <input type="text" id="input"> <button type="button" onclick="submitForm()">提交</button> </form> <div id="output"></div> </body> </html>
三、存儲型XSS測試
1、測試流程
存儲型XSS測試的主要流程如下:
1)分析目標站點頁面,確定存在可注入的參數;
2)手動或利用測試工具構建包含惡意腳本的請求,並將該請求提交至目標站點;
3)攻擊者在登錄時,將惡意腳本代碼存儲到數據庫中;
4)查看響應結果,在存在XSS漏洞的情況下,惡意腳本將在用戶再次進入該頁面時被執行。
2、測試案例
以下代碼是一個存儲型XSS測試案例,該案例將在輸入框輸入惡意代碼後,存儲到服務器上。用戶再次訪問該頁面時,存儲在服務器上的惡意腳本將被瀏覽器執行:
<html> <head> <title>存儲型XSS測試</title> </head> <body> <form action="/" method="post"> <input type="text" name="input"> <button type="submit">提交</button> </form> <script> var xhr = new XMLHttpRequest(); xhr.open('POST', '/', true); xhr.onload = function () { if (xhr.readyState === 4) { alert(xhr.responseText); } }; var input = prompt("請輸入惡意代碼:"); xhr.send('input=' + input); </script> </body> </html>
四、防範XSS攻擊
1、輸入時的處理
對於輸入時的處理,通常有兩種方法:
1)在後端對輸入進行過濾和轉義,防止特殊字符被當做代碼執行;
2)前端對輸入進行轉義,在輸出時再次轉義,防止腳本被執行。
以下是JavaScript中常見的防範XSS攻擊的轉義方法:
function escapeHTML(str) { return str.replace(/[<>"']/g, function(match){ return { '<': '<', '>': '>', '&': '&', '"': '"', "'": ''' }[match]; }); }
2、輸出時的處理
輸出時的處理需要保證用戶數據不被瀏覽器解析為代碼,以下是一些常見的防範XSS攻擊的轉義方法:
1)對於HTML,使用HTML實體代替特殊字符;
2)對於CSS,使用CSS實體代替特殊字符;
3)對於JavaScript,使用JSON轉義代替特殊字符;
以下是JavaScript中常見的防範XSS攻擊的輸出轉義方法:
function escapeHTML(str) { return str.replace(/[<>"']/g, function(match){ return { '<': '<', '>': '>', '&': '&', '"': '"', "'": ''' }[match]; }); } function escapeJS(str) { return str.replace(/[<>"']/g, function(match){ return { '<': '\\u003c', '>': '\\u003e', '&': '\\u0026', '"': '\\u0022', "'": '\\u0027' }[match]; }); } function escapeCSS(str) { return str.replace(/[<>"']/g, function(match){ return { '<': '\\003c', '>': '\\003e', '&': '\\0026', '"': '\\0022', "'": '\\0027' }[match]; }); }
以上三個函數分別對應了Html、Javascript和CSS三個場景的轉義方法。
原創文章,作者:BNURV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/369403.html