0x00 什么是CSP

CSP是内容安全策略,Conetent Security Policy,主要是为了减缓XSS、clickjacking和其他一些代码注入的攻击,目的是尽量使可执行的内容从可信的目标传递过来。说到CSP,就不得不提到另一种web安全模型:同源策略。

0x01 同源策略

同源策略是为了只允许从同源的目标加载资源,防止恶意代码等。同源的定义是同协议、同域名、同端口。因为现在的web程序中,很多的认证信息是以cookie的方式存到本地,例如存储一个session id。如果我们通过XSS攻击获取到了其他人的session id,就可以登录他人的账号。所以同源策略在一定程度上减缓了XSS的攻击,但是并不能完全阻止。当然CSP也是一样不能完全阻止,下面会讲到一些bypass的方法。

同源策略规则

1.jpg
上面这个表出自wiki,https://en.wikipedia.org/wiki/Same-origin_policy
基本上说明了同源与不同源的情况。但是由于同源策略限制的太过于严格,大多数的网站都有子域名,于是有了一些减缓同源策略的方法,可以使得在某些情况下绕过同源策略,并进行跨域操作。

  • document.domain属性
  • CORS(Cross-Origin Resource Sharing)
  • Cross-document messaging
  • JSONP
  • WebSocket

0x02 CSP的浏览器支持情况

CSP主要有三个header,分别是:Content-Security-Policy,X-Content-Security-Policy,X-WebKit-CSP

  • Content-Security-Policy
    chrome 25+,Firefox 23+,Opera 19+
  • X-Content-Security-Policy
    Firefox 23+,IE10+,但是IE没有完全实现CSP,不知道现在怎么样。
  • X-WebKit-CSP
    Chrome 25+

我们日常中见到的大部分都为Content-Security-Policy Header,所以其他的两个暂时不提了。

0x03 CSP支持的指令

这里列出一些常用的指令:

default-src,script-src,object-src,style-src,img-src,media-src,frame-src,font-src,connect-src,form-action,sandbox,script-nonce,plugin-types,reflected-xss,report-uri

对于每个指令详细的说明可以参考:http://content-security-policy.com/

0x04 Bypass

关于CSP的绕过方式也比较多了,大部分内容可以参考这个PPT:
http://dl.lightless.me/CSP-kuza55.pptx