DOM-based XSS in jQuery

本文介紹了幾種可能被 XSS 攻擊的 jQuery 使用方法。javascript

$

咱們常常使用向 $ 內傳入一個字符串的方式來選擇或生成 DOM 元素,但若是這個字符串是來自用戶輸入的話,那麼這種方式就是有風險的。html

先看一個 DEMO:http://jsbin.com/duwuzonife/1/edit?html,js,outputjava

javascript$("<img src='' onerror='alert();'>");

當用戶輸入的字符串是像這樣的時,雖然這個 <img> 元素不會立刻被插入到網頁的 DOM 中,但這個 DOM 元素已經被建立了,而且暫存在內存裏。而對於 <img> 元素,只要設置了它的 src 屬性,瀏覽器就會立刻請求 src 屬性所指向的資源。咱們也能夠利用這個特性作圖片的預加載。在上面的示例代碼中,建立元素的同時,也設置了它的屬性,包括 src 屬性和 onerror 事件監聽器,因此瀏覽器會立刻請求圖片資源,顯然請求不到,隨機觸發 onerror 的回調函數,也就執行了 JavaScript 代碼。jquery

推薦閱讀 $ 的官方文檔:http://api.jquery.com/jQuery/api

相似的其餘方法

javascript.after()
.append()
.appendTo()
.before()
.html()
.insertAfter()
.insertBefore()
.prepend()
.prependTo()
.replaceAll()
.replaceWith()
.unwrap()
.wrap()
.wrapAll()
.wrapInner()
.prepend()

以上這些方法不只建立 DOM 元素,而且會立刻插入到頁面的 DOM 樹中。若是使用 <script> 標籤插入了內聯 JS 會當即執行。瀏覽器

不安全的輸入來源

javascriptdocument.URL *
document.location.pathname *
document.location.href *
document.location.search *
document.location.hash
document.referrer *
window.name
document.cookie

document 的大多數屬性均可以經過全局的 window 對象訪問到。加 * 的屬性返回的時編碼 (urlencode) 後的字符串,須要解碼纔可能形成威脅。安全

不安全的操做

把能夠被用戶編輯的字符串,用在如下場景中,都是有隱患的。整體來講,任何把字符串做爲可執行的代碼的操做,都是不安全的。cookie

經過字符串建立函數app

  • eval
  • new Function
  • setTimeout/setInterval

跳轉頁面dom

  • 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

相關文章
相關標籤/搜索