CSP策略和绕过
什么是CSP策略
网页安全政策,“Content Security Policy”,缩写 CSP。
CSP的实质就是白名单制度
,明确告诉客户端哪些外部资源可以加载和执行。
一个CSP头由多组CSP策略组成,中间由分号分隔,就像这样:
Content-Security-Policy: default-src 'self' www.baidu.com; script-src 'unsafe-inline'
CSO誉为专门为解决XSS攻击而生的神器
如何启用CSP策略
一种是通过 HTTP 头信息的Content-Security-Policy的字段
一种是通过网页的标签
CSP是如何解析的
嵌套在CSP中的策略
script-src:定义了页面中Javascript的有效来源
style-src:定义了页面中CSS样式的有效来源
img-src:定义了页面中图片和图标的有效来源
connect-src:定义了请求、XMLHttpRequest、WebSocket 和 EventSource 的连接来源
child-src:指定定义了web workers 以及嵌套的浏览上下文(如和
default-src :一次性包括了上面的所有
内容源有三种:源列表、关键字和数据
内容源可以理解为上面的策略中的实际策略
源列表:
http://*.foo.com (匹配所有使用 http协议加载 foo.com 任何子域名的尝试。)
mail.foo.com:443 (匹配所有访问 mail.foo.com 的 443 端口 的尝试。)
https://store.foo.com (匹配所有使用 https协议访问 store.foo.com 的尝试。)
比如CSP策略为:,那么只允许dz.com这个域下的资源才能够进行引入
那么只有访问为http://dz.com/test.php?csp=,只有1.js才可以被引入被触发
关键字:
'none':代表空集;即不匹配任何 URL。两侧单引号是必须的
'self':代表和文档同源,包括相同的 URL 协议和端口号。两侧单引号是必须的
'unsafe-inline':允许使用内联资源,如内联的,这种情况只能在dz.com域下才能进行引入script资源
如果CSP策略为:Content-Security-Policy: script-src 'none' dz.com,
这种情况也是一样的,script-src包括了两者,none和dz.com,后者会覆盖前者,那么也就是允许script-src引入dz.com域下的资源,那么就跟上面的效果是一样的!
数据:
data:允许data: URI作为内容来源
mediastream:允许mediastream: URI作为内容来源。
比如CSP策略为:
Content-Security-Policy: default-src 'self'; img-src 'self' data:; media-src mediastream:
这里拿一段标签中的CSP策略来进行解释:
上面代码中,CSP 做了如下配置:
脚本script的src只信任当前域名(满足同源策略的条件)
CSP绕过方式
CSP的设置可能情况太多,这里只讨论几个比较典型的情况,其他的日后补充
url跳转
在default-src 'none'的情况下,可以使用meta标签实现跳转
在允许unsafe-inline的情况下,可以用window.location,或者window.open之类的方法进行跳转绕过。
标签预加载
CSP对link标签的预加载功能考虑不完善。
在Chrome下,可以使用如下标签发送cookie
在Firefox下,可以将cookie作为子域名,用dns预解析的方式把cookie带出去,查看dns服务器的日志就能得到cookie
利用浏览器补全
有些网站限制只有某些脚本才能使用,往往会使用
这样会拼成一个新的script标签,其中的src可以自由设定