CSP Introduction

CSP全称Content Security Policy,即内容安全策略。CSP是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括XSS和注入。

CSP被设计为完全向后兼容,在不同的浏览器上,不会因是否支持CSP而产生冲突问题。在不进行特定设置之前,默认为网页使用标准的同源策略。

通常可以使用meta标签来设置CSP,或者使用php的header函数来进行相关属性的设置。

CSP的配置会直接影响到页面加载资源的方式,在适当配置的情况下,可以有效的防范XSS攻击。

CSP Configuration

我们通过Content-Security-Policy头信息来进行CSP的设置,通常格式如下:

Content-Security-Policy: policy

其中,policy部分对应的为具体的内容安全策略。

一个策略由一系列的策略指令组成,每个策略都描述了一个针对某个特定类型资源以及生效范围的策略。

网上对于相关指令和资源表的说明已经很多了,我就不再赘述。

Bypass CSP With Different Policy

Common Policy Bypass

目前在比赛中常见的绕过CSP一般是:

script-src ‘self’ ‘unsafe-inline’
script-src ‘self’ ‘unsafe-eval’
script-src ‘nonce-*****’

通常情况下,除了CSP之外,还都会搭配一定的过滤措施来让选手进行绕过。

这里有几个例子,我就不再多说:

  1. 0CTF 2018 h4x0rs.club2 writeup

http://sec2hack.com/ctf/0ctf2018-h4x0rs-club2.html

  1. Google CTF 2016 Wallowing Wallabies - Part Three

http://countersite.org/articles/web-vulnerability/83-web-writeup-googlectf-wallowing-wallabies.html

Bypass "script-src ‘self’ "

在前几天的PlaidCTF中,出现了如下的CSP:

Content-Security-Policy: style-src ‘self’ https://fonts.googleapis.com; font-src ‘self’ https://fonts.gstatic.com; media-src ‘self’ blob:; script-src ‘self’; object-src ‘self’; frame-src ‘self’

script-src 'self’代表着只能加载符合同源策略的文件,直接插入至html页面中的静态script标签将无法执行。结合其他CSP来看,常用的iframe,object等标签也是无法被绕过的。

我尝试着使用link的预加载机制去带出cookie,然而受限于script-src 'self’的限制,虽然能够通过dns带出信息,但是无法将cookie带出来,因此预加载也是无法使用的。

于是只能另外寻找突破口,在查阅大量资料后发现,可以通过引入正常的非js文件来达到引入js脚本的效果。考虑到题目中具有上传点,可以将js代码插入到尾部来进行绕过。

本地搭建环境进行测试:

xss.html内容为:

cc.wave内容为:

执行效果为:

可以看到注释部分并未对js的执行起到干扰,因此这种攻击手法是可行的。

在进行上传时,后端会进行文件格式校验,因此需要在保证文件格式验证正确的情况进行绕过,在录音选项中,上传的文件为webm格式,文件头是不可见字符,在引入js文件时,会产生错误,因此需要引入文件的文件头是可见字符。

这里对比下两者的文件格式便很明显了:

wav格式的文件是以RIFF明文开头的,可以使用我上面所用到的攻击方法去构造xss代码,而webm开头为乱码,在执行时,会因为产生报错而中止执行。
在绕过文件格式检查之后,js会根据文件格式给定一个MIME-TYPE,在带入src属性的时候,audio的Type会和可执行脚本产生冲突,因此wav文件无法代入,而wave在MIME转换的名单之外,因此在上传成功wave文件时,其MIME-TYPE并不会与src冲突。
因此直接在description中写入:

即可拿到cookie作为idolt1登陆,接下来的就是审计js,上传wave文件动态添加xss代码即可。

Bypass文件格式的重点在于javascript在遇到”变量+运算符+变量”格式的表达式时,可以将注释插入其中,并且不会产生干扰。

在这个题目中,难点有两个:

  1. 绕过self限制
  2. 构造出符合文件内容检查的文件

同样的,我对于php是否会有此类特性也感到好奇,在经过测试后发现,在插入注释后,php的执行也不会被干扰。而python因为不具有行内注释的操作而无法做到上述操作。

之前看某篇paper,其中曾提到使用GIF绕过CSP,其中的部分思路和我上面用到的有部分相似。Paper链接如下:

https://www.slideshare.net/x00mario/jsmvcomfg-to-sternly-look-at-javascript-mvc-and-templating-frameworks/3-TodayJavaScript_MVC_Templating_FrameworksWhy_Because

首先,同样是上传GIF,使得GIF与目标网站处于同源下,然后使用Angular的class去调用这个GIF文件,然后会生成script标签,并且其src属性是GIF文件,此时GIF中的内容被作为js代码解析了,并且因为处于同源情况下,因此可以顺利触发xss。

Comments On CSP

CSP作为内容安全策略,在合理配置的情况,可以极大的提高xss的攻击成本,以达到较好的防御效果,然而部署成本同样较高,一是熟练掌握相关策略带来的难度,一是配置CSP所带来的工作量。

CSP的不当配置不仅会引发安全问题,还有可能导致页面资源加载失败,但总的来说,CSP仍然是防范XSS攻击较为优秀的措施。