Web 漏洞分析與防禦之 XSS(一)

moonlightL發表於2017-10-10

原文地址: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 節點的防禦

將 < 和 > 轉義成 &lt; 和 &gt;。

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

相關文章