本文介紹了幾種可能被 XSS 攻擊的 jQuery 使用方法。
$
我們經常使用向 $ 內傳入一個字串的方式來選擇或生成 DOM 元素,但如果這個字串是來自使用者輸入的話,那麼這種方式就是有風險的。
先看一個 DEMO:http://jsbin.com/duwuzonife/1/edit?html,js,output
javascript
$("<img src=`` onerror=`alert();`>");
當使用者輸入的字串是像這樣的時,雖然這個 <img>
元素不會馬上被插入到網頁的 DOM 中,但這個 DOM 元素已經被建立了,並且暫存在記憶體裡。而對於 <img>
元素,只要設定了它的 src
屬性,瀏覽器就會馬上請求 src
屬性所指向的資源。我們也可以利用這個特性做圖片的預載入。在上面的示例程式碼中,建立元素的同時,也設定了它的屬性,包括 src
屬性和 onerror
事件監聽器,所以瀏覽器會馬上請求圖片資源,顯然請求不到,隨機觸發 onerror
的回撥函式,也就執行了 JavaScript 程式碼。
推薦閱讀 $ 的官方文件:http://api.jquery.com/jQuery/
類似的其他方法
javascript
.after() .append() .appendTo() .before() .html() .insertAfter() .insertBefore() .prepend() .prependTo() .replaceAll() .replaceWith() .unwrap() .wrap() .wrapAll() .wrapInner() .prepend()
以上這些方法不僅建立 DOM 元素,並且會馬上插入到頁面的 DOM 樹中。如果使用 <script>
標籤插入了內聯 JS 會立即執行。
不安全的輸入來源
javascript
document.URL * document.location.pathname * document.location.href * document.location.search * document.location.hash document.referrer * window.name document.cookie
document
的大多數屬性都可以通過全域性的 window
物件訪問到。加 *
的屬性返回的時編碼 (urlencode
) 後的字串,需要解碼才可能造成威脅。
不安全的操作
把可以被使用者編輯的字串,用在以下場景中,都是有隱患的。總體來說,任何把字串作為可執行的程式碼的操作,都是不安全的。
通過字串建立函式
- eval
- new Function
- setTimeout/setInterval
跳轉頁面
- location.replace/location.assign
修改
<script>
標籤的src
屬性
修改事件監聽器
總結
如果發生在用 jQuery 時被 DOM-XSS 攻擊的情況,大多是因為忽視了兩個東西:
1. 在給$
傳引數時,對引數來源的把控。
2. 使用者的輸入途徑不只有表單,還有位址列,還可以通過開發者工具直接修改 DOM ,或者直接在控制檯執行 JS 程式碼。
索引
本文很多資訊來自於以下幾篇文章,推薦進一步閱讀。
http://ma.la/jquery_xss/
http://erlend.oftedal.no/blog/?blogid=127
http://sec.omar.li/2012/05/overview-of-dom-xss.html