csp php,CSP学习笔记(持续学习更新)
CSP——Content Security Policy
大佬光輝照耀我-學(xué)習(xí)鏈接
百度百科:CSP指的是內(nèi)容安全策略,為了緩解很大一部分潛在的跨站腳本問(wèn)題,瀏覽器的擴(kuò)展程序系統(tǒng)引入了內(nèi)容安全策略(CSP)的一般概念。這將引入一些相當(dāng)嚴(yán)格的策略,會(huì)使擴(kuò)展程序在默認(rèn)情況下更加安全,開發(fā)者可以創(chuàng)建并強(qiáng)制應(yīng)用一些規(guī)則,管理網(wǎng)站允許加載的內(nèi)容。
Content Security Policy 最早在firefox 23中實(shí)現(xiàn),當(dāng)時(shí)使用的是 X-Content-Security-Policy,它使用了前置詞的內(nèi)容安全性策略,并以W3C CSP1.0規(guī)范作為標(biāo)準(zhǔn)。
按照我的理解,CSP就是高級(jí)白名單機(jī)制,并且限制了網(wǎng)站的很多訪問(wèn)行為。
CSP編寫網(wǎng)站:https://www.cspisawesome.com/
CSP語(yǔ)法以及范例
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'
");
有那么一丟丟長(zhǎng)....里面包括了各種各樣的寫法:
1、none和self,none代表什么都不匹配,self代表匹配同源的來(lái)源
2、https://xxx/js/匹配目錄下所有文件,https://xxx/js/file.js匹配特殊文件
3、第三種是類似于https:,會(huì)匹配所有包含這個(gè)特殊的格式的來(lái)源。
4、也有可能是example.com這樣的,會(huì)匹配所有這個(gè)host的來(lái)源,或者會(huì)有*.example.com,會(huì)匹配這個(gè)host的所有子域。
5、第五種是類似于nonce-qwertyu12345會(huì)匹配一個(gè)特殊的節(jié)點(diǎn)。
6、當(dāng)然還有加密過(guò)的類似于sha256-abcd…同樣會(huì)匹配頁(yè)面中一個(gè)特殊的節(jié)點(diǎn)(每次修改這個(gè)值都會(huì)改變)。
感覺(jué)下面這個(gè)是一個(gè)比較詳細(xì)的字段說(shuō)明
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屬性
大佬的文章講的很好很好,這里不轉(zhuǎn)載贅述啦,總之就是不同屬性的對(duì)應(yīng)不同屬性請(qǐng)求作用規(guī)則。
圖片簡(jiǎn)單說(shuō)明
不同的配置參數(shù)
Bypass CSP
xxxx-src *
這個(gè)規(guī)則里的*符號(hào)表示,允許除了內(nèi)聯(lián)函數(shù)以外所有的url式的請(qǐng)求,這基本上就隨意開火了。
xxxx-src self
一般來(lái)說(shuō),self代表只接受符合同源策略的url,這樣一來(lái),大部分的xss和crsf都會(huì)失效,有個(gè)標(biāo)簽比較例外,雖然已經(jīng)被加入的現(xiàn)在的csp草案中,但是的確還沒(méi)有施行(這里的現(xiàn)在大概是16年,現(xiàn)在可不好說(shuō))。
這種請(qǐng)求在firefox上會(huì)被攔截(除非同源),其余的現(xiàn)在不好說(shuō)
此外,也可以在當(dāng)前域上傳,如果有上傳,直接加載就行了,完全么有限制。
攻擊范例
不知道有多少人了解過(guò)cctf2016,其中有一道web題目IDS-Chicken
題目環(huán)境就符合我說(shuō)的情況,CSP滴水不漏,幾乎沒(méi)辦法用任何方式構(gòu)造xss,但是內(nèi)網(wǎng)存在上傳點(diǎn),上傳文件會(huì)被重寫為文件,link包含形成xss漏洞。
script-src 'unsafe-inline'
如果加上這個(gè)參數(shù),就不會(huì)阻止內(nèi)聯(lián)腳本,但這被認(rèn)為是不安全的。
對(duì)于這個(gè)屬性有個(gè)特殊的配置叫unsafe-eval,他會(huì)允許下面幾個(gè)函數(shù)
eval()
Function()
setTimeout() with an initial argument which is not callable.
setInterval() with an initial argument which is not callable.
我們先嘗試構(gòu)造payload
payload
可以明顯的看到被攔了
攔截信息
但是我們嘗試構(gòu)造內(nèi)聯(lián)腳本
內(nèi)聯(lián)腳本
能看到成功執(zhí)行
結(jié)果
由于同源策略,這個(gè)請(qǐng)求不能發(fā)往別的域下,但是實(shí)戰(zhàn)環(huán)境中利用方式很多,就比如這個(gè)聊天版,可以通過(guò)發(fā)給別的用戶的方式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
來(lái)源:https://lorexxar.cn/2016/10/31/csp-then2/
首先要意識(shí)到如果我們構(gòu)造一個(gè)重定向,就可以bypass CSP的域限制
測(cè)試頁(yè)面(test.php):
header("Content-Security-Policy: script-src http://127.0.0.1/ http://xss.cc/the_only_allow_dir/");
?>
csp header test
整個(gè)站都在/test/下,/test/js/下包含正常的js.
條件一:必須有可以重定向的頁(yè)面
假設(shè)第一個(gè)域下的某個(gè)位置有個(gè)可以定義重定向的頁(yè)面,比如
這里測(cè)試的時(shí)候?qū)懺诹烁夸浵?#xff0c;不過(guò)是要是域內(nèi)允許的任何為之都可以,這樣的功能一般多出現(xiàn)在登陸頁(yè)面
條件二:我們需要一個(gè)被允許的域
比如 http://127.0.0.1/ 里一般會(huì)有js目錄被允許,然后可能存在upload域可以上傳一個(gè)js。這里我們?cè)试S了http://xss.cc/the_only_allow_dir/這個(gè)域,然后在http://xss.cc/myjs/a.js里面寫入js內(nèi)容,比如 alert(2333)這種。
然后訪問(wèn)測(cè)試頁(yè)面(test.php),就會(huì)重定向過(guò)去。
其它Bypass方式
CSP困境以及升級(jí)
總結(jié)
以上是生活随笔為你收集整理的csp php,CSP学习笔记(持续学习更新)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql和hive的sql语句,hiv
- 下一篇: php+imagick详解,PHP中im