原文地址:Web 漏洞分析與防禦之 XSS(一)
部落格地址:www.extlight.com
一、全稱
跨站指令碼攻擊(Cross Site Scripting)
二、原理
通過在網站中的輸入框寫入 script 指令碼或引入 script 檔案,如果網站未過濾輸入內容,將會解析該指令碼。
如果指令碼的功能是獲取網站的 cookie,cookie 中又保留一些敏感資訊,則後果有可能很嚴重。
三、型別
反射型攻擊:指令碼當作 url 的引數進行注入執行
儲存型攻擊:指令碼被儲存到 DB 後,讀取時被解析執行
四、注入點
4.1 HTML 節點
頁面程式碼:
<div>${content}</div>複製程式碼
content 的內容為 <script>alert(1)</script>,指令碼攻擊後,會變成:
<div><script>alert(1)</script></div>複製程式碼
頁面將會執行 alert(1)。
4.2 HTML 屬性
頁面程式碼:
<img src="${imgSrc}" />複製程式碼
imgSrc 的內容為 2" onerror="alert(2),指令碼攻擊後,會變成:
<img src="2" onerror="alert(2)" />複製程式碼
頁面將會執行 alert(2)。
4.3 Javascript 程式碼
<script>
var mydata = "${data}";
</script>複製程式碼
data 的內容為 hello";alert(3);",指令碼攻擊後,會變成:
<script>
var mydata = "hello";alert(3);"";
</script>複製程式碼
頁面將會執行 alert(3)。
4.4 富文字
富文字需要保留 HTML 文字,HTML 文字中就有 XSS 攻擊的風險。
五、防禦
瀏覽器自帶一些防禦能力,但只能防禦 XSS 反射型別攻擊,且只能防禦上文描述的前二個注入點。
防禦手段原理也很簡單,就是將可能會執行指令碼的標籤或屬性進行轉義和過濾。
5.1 HTML 節點的防禦
將 < 和 > 轉義成 <; 和 >;。
5.2 HTML 屬性的防禦
將 " 轉義成 &quto;。
5.3 Javascript 程式碼的防禦
將 " 轉義成 \“ 。
5.3 富文字的防禦
使用白名單保留部分標籤和屬性。
需要前端第三方工具:cheerio。
案例:
function xssFilter(html) {
var cheerio = require("cheerio");
var $ = cheerio.load(html);
// 白名單列表,key:標籤,value:屬性
var whiteList = {
"img":["src"],
"a":["href"],
"font":["color","size"]
};
// html 的遍歷所有元素
$("*").each(function(index,elem) {
// 刪除不在白名單的標籤
if (!whiteList[elem.name]) {
$(elem).remove();
return;
}
// 刪除不在白名單的標籤的屬性
for (var attr in elem.attribs) {
if (whiteList[elem.name].indexOf(attr) == -1) {
$(elem).attr(attr,null);
return;
}
}
});
return $.html();
}複製程式碼
還有另一種第三方工具,名字就叫 xss