XSS 探索

1. 什麼是XSS攻擊?html

正常的頁面被滲出了攻擊者的js腳本,這些腳本能夠非法地獲取用戶信息,而後將信息發送到attacked的服務端。前端

XSS是須要充分利用輸出環境來構造攻擊腳本的git

2. 危害github

  • 非法獲取用戶cookie、ip等內容web

  • 竊取用戶輸入的內容express

  • 劫持瀏覽器,造成DDOS攻擊瀏覽器

3. 類型安全

  • Reflected XSS:能夠理解爲參數型XSS攻擊,攻擊的切入點是url後面的參數
    // 合法頁面
    url: http://aa.com?test=1234
    <input type="text" value={test} />
    
    // result is:
    <input type="text" value="1234" />
    
    // XSS攻擊
    url: http://aa.com?test=" /><script>alert('xss')</script>
    <input type="text" value={test} />
    
    // result is:
    <input type="text" value="" /> <script> alert('xss')</script> />
  • stored XSS: 將攻擊js腳本上傳到服務器端,每次輸出時,也隨着內容將腳本輸出,這樣js惡意腳本就能夠起到攻擊做用。
    // input: 
    <textarea>
        hello  </div><script src="..."></script>
    </textarea>
    // 將hello及後面的內容一塊兒提交到服務上
    
    //輸出上述內容
    <div>
        hello</div><script src="..."></script>
    </div>
  • DOM based XSS:這種攻擊方式也是經過URL的參數,可是須要了解正常js的DOM操做,將js腳本注入到頁面中
    <div id="inner"></div>
    <script>
    var ele = document.querySelector('#inner');
    var search = window.location.search;
    var age = getAge(search) // 獲取search中age的內容
    ele.innerHTML = age;
    
    // if url: aa.com?age=23
    <div id="inner">23</div>
    </script>
    
    // if url: aa.com?age=</div><script src="..."></script>
    <div id="inner"></div><script src="..."></script>
  • 突變型XSS:是當不可信數據在DOM的innerHTML屬性的上下文被處理並經過瀏覽器發生突變,致使變成一種有效的XSS方向的一種XSS漏洞

4.解決方案服務器

  • 對內容進行編碼,包括server、client端均要進行編碼。可是不一樣的內容,就須要採用不一樣的編碼方式。

整體來說須要對HTML、Attribute、js context、URL、style context、JSON分別進行編碼處理。cookie

  • 對html內容進行過濾,例如html purifierjs-xss

  • X-XSS-Protection

    IE8+以上的瀏覽器均支持該http header,目前goole裏面已經添加該屬性:

    x-xss-protection:1; mode=block
  • 監控跨站資源:針對csp中存在的問題,進行監控。FEX團隊寫了幾篇很是好的文章:

    【XSS】利用 onload 事件監控跨站資源

    XSS 前端防火牆 —— 內聯事件攔截

    XSS 前端防火牆 —— 可疑模塊攔截

    XSS 前端防火牆 —— 無懈可擊的鉤子

    XSS 前端防火牆 —— 完美無缺的防禦

    XSS 前端防火牆 —— 整裝待發

  •  content security policy(CSP): W3C和各大瀏覽器廠商均推薦和實踐防護XSS的標準,限制執行、請求具備風險的外鏈資源,攻擊者沒法將目標信息傳出,並對relected XSS進行防護。

    在HTTP的response中部署CSP,指定資源白名單來限制瀏覽器訪問未經容許的外部資源。

    目前Google、facebook、twitter均支持該標準,例如twitter的配置信息:

    content-security-policy:default-src https:; 
    connect-src https:; font-src https: data:; 
    frame-src https: twitter:; frame-ancestors 'self'; 
    img-src https: blob: data:; media-src https: blob:; 
    object-src https:; 
    script-src 'unsafe-inline' 'nonce-w6FV5VZOKta+7JaW7PpR3A==' 'unsafe-eval' https:; 
    style-src 'unsafe-inline' https:; 
    report-uri https://twitter.com/i/csp_report?a=NVQWGYLXFVZXO2LGOQ%3D%3D%3D%3D%3D%3D&ro=false; 

    上述配置的詳細參數請參考CSP的相關規範,csp1.0,目前csp1.1草案已經出來。 然而,csp中不容許Eval、inline js、白名單獲取遠程腳本,這些阻礙着csp的推廣。

  • Template Engine:對處理輸出內容進行編碼,放置惡意代碼執行,對stored Xss進行防護。

    例如常常使用handlebars就對輸出的內容進行了編碼:

    Handlebars HTML-escapes values returned by a {{expression}}. 
    If you don't want Handlebars to escape a value,
    use the "triple-stash", {{{.
    
    <div class="entry">
        <h1>{{title}}</h1>
       <div class="body">
            {{{body}}}
      </div>
    </div>
    
    {
         title: "All about <p> Tags",
         body: "<p>This is a post about &lt;p&gt; tags</p>"
    }
    
    result is as below:
    
    <div class="entry">
        <h1>All About &lt;p&gt; Tags</h1>
        <div class="body">
            <p>This is a post about &lt;p&gt; tags</p>
      </div>
    </div>
  • Util Lib:提供安全的environment、Encode等工具,避免location、cookie封裝對DOM based XSS工具。

    首先在服務端端,對輸出的內容進行編碼,對request中的內容進行檢查編碼。

    在客戶端,對js獲取的widow.location、document.cookie等信息也須要相應處理。

  • 僅可能採用POST而非GET請求方式
  • 嚴格檢查refer

5.參考

https://developer.mozilla.org/zh-CN/docs/Web/Security/CSP

http://www.80sec.com/browser-hijacking.html

https://cure53.de/fp170.pdf

http://www.freebuf.com/articles/web/40520.html

http://www.freebuf.com/articles/web/42727.html

http://blog.knownsec.com/wp-content/uploads/2014/07/%E7%BB%99%E5%BC%80%E5%8F%91%E8%80%85%E7%9A%84%E7%BB%88%E6%9E%81XSS%E9%98%B2%E6%8A%A4%E5%A4%87%E5%BF%98%E5%BD%95.pdf

相關文章
相關標籤/搜索