CSP策略及绕过方法

JavaScript0123

CSP策略及绕过方法,第1张

XSS的时候经常要绕过CSP,这里总结一下

一个CSP头由多组CSP策略组成,中间由分号分隔,就像这样:

其中每一组策略包含一个 策略指令 和一个 内容源 列表

default-src 指令定义了那些没有被更精确指令指定的安全策略。这些指令包括:

script-src定义了页面中Javascript的有效来源

style-src定义了页面中CSS样式的有效来源

img-src定义了页面中图片和图标的有效来源

font-src定义了字体加载的有效来源

connect-src定义了请求、XMLHttpRequest、WebSocket 和 EventSource 的连接来源。

child-src 指定定义了 web workers 以及嵌套的浏览上下文(如<frame>和<iframe>)的源。

内容源有三种:源列表、关键字和数据

源列表是一个字符串,指定了一个或多个互联网主机(通过主机名或 IP 地址),和可选的或端口号。站点地址可以包含可选的通配符前缀 (星号, '*'),端口号也可以使用通配符 (同样是 '*') 来表明所有合法端口都是有效来源。主机通过空格分隔。

有效的主机表达式包括:

http://* .foo.com (匹配所有使用 http协议加载 foo.com 任何子域名的尝试。)

mail.foo.com:443 (匹配所有访问 mail.foo.com 的 443 端口 的尝试。)

https://store.foo.com (匹配所有使用 https协议访问 store.foo.com 的尝试。)

如果端口号没有被指定,浏览器会使用指定协议的默认端口号。如果协议没有被指定,浏览器会使用访问该文档时的协议。

CSP的设置可能情况太多,这里只讨论几个比较典型的情况。

在default-src 'none'的情况下,可以使用meta标签实现跳转

在允许unsafe-inline的情况下,可以用window.location,或者window.open之类的方法进行跳转绕过。

CSP对link标签的预加载功能考虑不完善。

在Chrome下,可以使用如下标签发送cookie(最新版Chrome会禁止)

在Firefox下,可以将cookie作为子域名,用dns预解析的方式把cookie带出去,查看dns服务器的日志就能得到cookie

有些网站限制只有某些脚本才能使用,往往会使用<script>标签的nonce属性,只有nonce一致的脚本才生效,比如CSP设置成下面这样:

那么当脚本插入点为如下的情况时

可以插入

这样会拼成一个新的script标签,其中的src可以自由设定

Blackhat2017上有篇 ppt 总结了可以被用来绕过CSP的一些JS库。

例如假设页面中使用了Jquery-mobile库,并且CSP策略中包含"script-src 'unsafe-eval'"或者"script-src 'strict-dynamic'",那么下面的向量就可以绕过CSP:

在这个PPT之外的还有一些库也可以被利用,例如RCTF2018中遇到的amp库,下面的标签可以获取名字为FLAG的cookie

1.如果页面A中有CSP限制,但是页面B中没有,同时A和B同源,那么就可以在A页面中包含B页面来绕过CSP:

2.在Chrome下,iframe标签支持csp属性,这有时候可以用来绕过一些防御,例如" http://xxx "页面有个js库会过滤XSS向量,我们就可以使用csp属性来禁掉这个js库。

meta标签有一些不常用的功能有时候有奇效:

meta可以控制缓存(在header没有设置的情况下),有时候可以用来绕过CSP nonce。

meta可以设置Cookie(Firefox下),可以结合self-xss利用。

CSP-J/S认证没有什么用。它是业余自愿的科学活动,最多是提升自己能力的作用。虽然CSP-J/S认证是非计算机专业人士证明自身软件能力的重要依据,但它并不是每个人的必然选项,也并不表明未来就没有前途,因为人的能力是多元的,而不是单一的。

CSP-J/S是由CCF主办的计算机非专业级别的软件能力认证。认证包括CSP-J(Junior,入门级)和CSP-S(Senior,提高级)两个级别,认证内容均包括算法设计能力和编程能力。

CCF为什么要举办CSP-J/S?

是为包括青少年在内的非计算机专业人士的软件能力(算法和编程)提供权威、公平、公正、公开和客观的评价体系,也通过认证鼓励更多的人学习算法和编程。

CSP-J/S和CSP的关系是什么?

CSP是专业级别的能力认证。在认证内容上,CSP-J/S与CSP相似,但其更基础更简单,其更关注基础的软件能力;在认证组织上,两者面向不同的目标人群,是两个平行的体系,没有直接关联。

CCF 为非盈利性社会团体,无任何挂靠和公共财政拨款。收取一定数量的认证费用,是保障 CSP-J/S 认证及其相关活动顺利举行的必要条件。