近期面试,面试官问了CSP相关的问题答得不是很好,以前看了也没有深入了解,所以决定学习记录加强一下~

  • 什么是CSP

官方说法,全称为 Content-Security-Policy,内容安全策略。 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。 你需要配置你的网络服务器返回 Content-Security-Policy HTTP头部
CSP个人感觉就是基于一系列键值对的白名单过滤器~

  • CSP键值对(规则)

比如下面的一条规则:

Content-Security-Policy: script-src 'self' 'unsafe-inline'

其中“script-src”指对script脚本的来源做限制;
后面的指则是具体的要求 “ ‘self’ ” 代表和文档同源,包括相同的 URL 协议和端口号 ;“ ‘unsafe-inline’ ” 允许使用内联资源,如内联的<script>元素、javascript: URL、内联的事件处理函数和内联的<style>元素
那么如上面的 “script-src”官方的说法就是策略指令 尾随其后的叫内容源;具体有以下几类。

策略指令
default-src 指令定义了那些没有被更精确指令指定的安全策略。这些指令包括:child-src,connect-src,font-src,img-src,media-src,object-src,script-src,style-src
script-src定义了页面中Javascript的有效来源
style-src定义了页面中CSS样式的有效来源
img-src定义了页面中图片和图标的有效来源
font-src定义了字体加载的有效来源
connect-src定义了请求、XMLHttpRequest、WebSocket 和 EventSource 的连接来源
child-src 指定定义了 web workers 以及嵌套的浏览上下文(如<frame>和<iframe>)的源

内容源
url形式,规定来自于该域名的可以访问
关键字形式,’self’ 代表和文档同源,包括相同的 URL 协议和端口号; ‘none’
代表空集;即不匹配任何 URL ; ‘unsafe-inline’ 允许使用内联资源,如内联的<script>元素、javascript: URL、内联的事件处理函数和内联的<style>元素;
‘unsafe-eval’ 允许使用 eval() 等通过字符串创建代码的方法 。

再看几个例子

Content-Security-Policy: script-src 'self' 'unsafe-inline'
Content-Security-Policy: default-src 'none'; script-src 'nonce-BXwvkDpdui1nFUwIDBfv7dE0miw=' 'strict-dynamic'; style-src 'self'; img-src 'self' data:; media-src 'self'; font-src 'self' data:; connect-src 'self'; base-uri 'none'

这其实是两条CSP了,那么遇到两条CSP的情况,这两条规则是与的关系,即两者都要满足才能通过。第一条即javascript只能来源于同源的链接和内联的模式,第二条里面额外涉及到一个nonce属性和strict-dynamic。nonce为必须匹配相同的属性值方可使用,strict-dynamic 对因为 nonce-{random} 匹配或者 hash 匹配(例如 sha256-{sha256sum}、sha512-{sha512sum}等)而加载的 js 代码赋予一定程度的信任,允许他们操作 DOM 来加载其他的 js

  • CSP绕过

url跳转
<link>标签预加载
利用浏览器补全
代码重用
iframe
meta标签

17年blackhat有议题专门讨论过这个问题:链接
以及相关参考链接:https://www.jianshu.com/p/f1de775bc43e
2018TCTF比赛相关知识点WP链接:https://paper.seebug.org/574/
总结很好,就不重复炒剩饭了,学习~