csp php,CSP学习笔记(持续学习更新)
CSP——Content Security Policy
大佬光輝照耀我-學習鏈接
百度百科:CSP指的是內容安全策略,為了緩解很大一部分潛在的跨站腳本問題,瀏覽器的擴展程序系統引入了內容安全策略(CSP)的一般概念。這將引入一些相當嚴格的策略,會使擴展程序在默認情況下更加安全,開發者可以創建并強制應用一些規則,管理網站允許加載的內容。
Content Security Policy 最早在firefox 23中實現,當時使用的是 X-Content-Security-Policy,它使用了前置詞的內容安全性策略,并以W3C CSP1.0規范作為標準。
按照我的理解,CSP就是高級白名單機制,并且限制了網站的很多訪問行為。
CSP編寫網站:https://www.cspisawesome.com/
CSP語法以及范例
header("Content-Security-Policy:
default-src 'none';
connect-src 'self';
frame-src 'self';
script-src xxxx/js/
'sha256-KcMxZjpVxhUhzZiwuZ82bc0vAhYbUJsxyCXODP5ulto='
'sha256-u++5+hMvnsKeoBWohJxxO3U9yHQHZU+2damUA6wnikQ=' ;
font-src xxxx/fonts/ fonts.gstatic.com;
style-src xxxx/css/ fonts.googleapis.com;
img-src 'self'
");
有那么一丟丟長....里面包括了各種各樣的寫法:
1、none和self,none代表什么都不匹配,self代表匹配同源的來源
2、https://xxx/js/匹配目錄下所有文件,https://xxx/js/file.js匹配特殊文件
3、第三種是類似于https:,會匹配所有包含這個特殊的格式的來源。
4、也有可能是example.com這樣的,會匹配所有這個host的來源,或者會有*.example.com,會匹配這個host的所有子域。
5、第五種是類似于nonce-qwertyu12345會匹配一個特殊的節點。
6、當然還有加密過的類似于sha256-abcd…同樣會匹配頁面中一個特殊的節點(每次修改這個值都會改變)。
感覺下面這個是一個比較詳細的字段說明
serialized-source-list = ( source-expression *( RWS source-expression ) ) / "'none'"
source-expression = scheme-source / host-source / keyword-source
/ nonce-source / hash-source
; Schemes:
scheme-source = scheme ":"
; scheme is defined in section 3.1 of RFC 3986.
; Hosts: "example.com" / "*.example.com" / "https://*.example.com:12/path/to/file.js"
host-source = [ scheme-part "://" ] host-part [ port-part ] [ path-part ]
scheme-part = scheme
host-part = "*" / [ "*." ] 1*host-char *( "." 1*host-char )
host-char = ALPHA / DIGIT / "-"
port-part = ":" ( 1*DIGIT / "*" )
path-part = path
; path is defined in section 3.3 of RFC 3986.
; Keywords:
keyword-source = "'self'" / "'unsafe-inline'" / "'unsafe-eval'"
; Nonces: 'nonce-[nonce goes here]'
nonce-source = "'nonce-" base64-value "'"
base64-value = 1*( ALPHA / DIGIT / "+" / "/" / "-" / "_" )*2( "=" )
; Digests: 'sha256-[digest goes here]'
hash-source = "'" hash-algorithm "-" base64-value "'"
hash-algorithm = "sha256" / "sha384" / "sha512"
CSP屬性
大佬的文章講的很好很好,這里不轉載贅述啦,總之就是不同屬性的對應不同屬性請求作用規則。
圖片簡單說明
不同的配置參數
Bypass CSP
xxxx-src *
這個規則里的*符號表示,允許除了內聯函數以外所有的url式的請求,這基本上就隨意開火了。
xxxx-src self
一般來說,self代表只接受符合同源策略的url,這樣一來,大部分的xss和crsf都會失效,有個標簽比較例外,雖然已經被加入的現在的csp草案中,但是的確還沒有施行(這里的現在大概是16年,現在可不好說)。
這種請求在firefox上會被攔截(除非同源),其余的現在不好說
此外,也可以在當前域上傳,如果有上傳,直接加載就行了,完全么有限制。
攻擊范例
不知道有多少人了解過cctf2016,其中有一道web題目IDS-Chicken
題目環境就符合我說的情況,CSP滴水不漏,幾乎沒辦法用任何方式構造xss,但是內網存在上傳點,上傳文件會被重寫為文件,link包含形成xss漏洞。
script-src 'unsafe-inline'
如果加上這個參數,就不會阻止內聯腳本,但這被認為是不安全的。
對于這個屬性有個特殊的配置叫unsafe-eval,他會允許下面幾個函數
eval()
Function()
setTimeout() with an initial argument which is not callable.
setInterval() with an initial argument which is not callable.
我們先嘗試構造payload
payload
可以明顯的看到被攔了
攔截信息
但是我們嘗試構造內聯腳本
內聯腳本
能看到成功執行
結果
由于同源策略,這個請求不能發往別的域下,但是實戰環境中利用方式很多,就比如這個聊天版,可以通過發給別的用戶的方式get cookie
var xmlhttp=new XMLHttpRequest();
xmlhttp.open("POST","submit.php",true);
xmlhttp.setRequestHeader(_Ctent-type_,_applicati/x-www-form-urlencoded_);
xmlhttp.send(_to=lorexxar&&message=_+document.cookie);
;
302 Bypass CSP
來源:https://lorexxar.cn/2016/10/31/csp-then2/
首先要意識到如果我們構造一個重定向,就可以bypass CSP的域限制
測試頁面(test.php):
header("Content-Security-Policy: script-src http://127.0.0.1/ http://xss.cc/the_only_allow_dir/");
?>
csp header test
整個站都在/test/下,/test/js/下包含正常的js.
條件一:必須有可以重定向的頁面
假設第一個域下的某個位置有個可以定義重定向的頁面,比如
這里測試的時候寫在了根目錄下,不過是要是域內允許的任何為之都可以,這樣的功能一般多出現在登陸頁面
條件二:我們需要一個被允許的域
比如 http://127.0.0.1/ 里一般會有js目錄被允許,然后可能存在upload域可以上傳一個js。這里我們允許了http://xss.cc/the_only_allow_dir/這個域,然后在http://xss.cc/myjs/a.js里面寫入js內容,比如 alert(2333)這種。
然后訪問測試頁面(test.php),就會重定向過去。
其它Bypass方式
CSP困境以及升級
總結
以上是生活随笔為你收集整理的csp php,CSP学习笔记(持续学习更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql和hive的sql语句,hiv
- 下一篇: php+imagick详解,PHP中im