Content-Security-Policy内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主要的手段。CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。
创新互联是一家专注于成都做网站、网站设计与策划设计,伊犁网站建设哪家好?创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:伊犁等地区。伊犁做网站价格咨询:028-86922220
注意:CSP开启可能会导致js、css出现报错,所以需要正确的配置开始CSP策略。
启用 CSP方法:一种是通过 HTTP 头信息的Content-Security-Policy的字段,另一种是通过网页的meta标签。
第一种:修改 nginx 配置文件
在nginx.conf 配置文件中,增加如下配置内容:
第二种:通过网页的meta标签
该指令说明:允许自身css、js和高德地图api、地图数据。
CSP 指令说明:
default-src : 定义针对所有类型(js/image/css/font/ajax/iframe/多媒体等)资源的默认加载策略,如果某类型资源没有单独定义策略,就使用默认的。
script-src : 定义针对 JavaScript 的加载策略。
style-src : 定义针对样式的加载策略。
worker-src:worker脚本。
img-src : 定义针对图片的加载策略。
font-src : 定义针对字体的加载策略。
media-src : 定义针对多媒体的加载策略,例如:音频标签audio和视频标签video。
object-src : 定义针对插件的加载策略,例如:object、embed、applet。
child-src : 定义针对框架的加载策略,例如: frame,iframe。
connect-src : 定义针对 Ajax/WebSocket 等请求的加载策略。不允许的情况下,浏览器会模拟一个状态为400的响应。
sandbox : 定义针对 sandbox 的限制,相当于 iframe的sandbox属性。
report-uri : 告诉浏览器如果请求的资源不被策略允许时,往哪个地址提交日志信息。
form-action : 定义针对提交的 form 到特定来源的加载策略。
referrer : 定义针对 referrer 的加载策略。
reflected-xss : 定义针对 XSS 过滤器使用策略。
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 的尝试。)
如果端口号没有被指定,浏览器会使用指定协议的默认端口号。如果协议没有被指定,浏览器会使用访问该文档时的协议。
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属性,这有时候可以用来绕过一些防御,例如" "页面有个js库会过滤XSS向量,我们就可以使用csp属性来禁掉这个js库。
meta标签有一些不常用的功能有时候有奇效:
meta可以控制缓存(在header没有设置的情况下),有时候可以用来绕过CSP nonce。
meta可以设置Cookie(Firefox下),可以结合self-xss利用。
1、首先我们选择鼠标单击打开服务器中的安全策略功能选项。
2、设定举例,这里选择设定限制一个IP范围。
3、首先创建两个网段规则,右键单击空白区域。
4、选择鼠标单击新IP筛选器的功能选项。创建IP地址范围。
5、设置两个网段后,设置两个策略,一个用于权限,一个用于阻止。