CSP 有三类:
- Content-Security-Policy (google Chrome)
- X-Content-Security-Policy (Firefox)
- X-WebKit-CSP (WebKit-based browsers, e.g. Safari)
"Content-Security-Policy:" 策略
"Content-Security-Policy-Report-Only:" 策略
HTTP Content-Security-Policy 头可以指定一个或多个资源是安全的,而Content-Security-Policy-Report-Only则是允许服务器检查(非强制)一个策略 。多个头的策略定义由优先采用最先定义的 。
HTML Meta :
<meta http-equiv="content-security-policy" content="策略">
<meta http-equiv="content-security-policy-report-only" content="策略">
3.2.3.2.1. 指令说明
3.2.3.2.2. 关键字
- -
- 允许从任意url加载,除了 data: blob: filesystem: schemes
- e.g. img-src -
- none
- 禁止从任何url加载资源
- e.g. object-src 'none'
- self
- 只可以加载同源资源
- e.g. img-src 'self'
- data:
- 可以通过data协议加载资源
- e.g. img-src 'self' data:
- domain.example.com
- e.g. img-src domain.example.com
- 只可以从特定的域加载资源
- *.example.com
- e.g. img-src *.example.com
- 可以从任意域名.com的子域处加载资源
- https://cdn.com
- e.g. img-src https://域名.com
- 只能从给定的域用https加载资源
- https:
- e.g. img-src https:
- 只能从任意域用https加载资源
- unsafe-inline
- 允许内部资源执行代码例如style attribute,onclick或者是sicript标签
- e.g. -src 'unsafe-inline'
- unsafe-eval
- 允许一些不安全的代码执行方式,例如js的eval()
- e.g. -src 'unsafe-eval'
- nonce-<-value>'
- 使用随机的nonce,允许加载标签上nonce属性匹配的标签
- e.g. -src 'nonce-bm9uY2U='
- <hash-algo>-<-value>'
- 允许hash值匹配的代码块被执行
- e.g. -src 'sha256-<-value>'
允许执行内联 JS 代码,但不允许加载外部资源
Content-Security-Policy: default-src 'self'; -src 'self' 'unsafe-inline';
3.2.3.3. Bypass
3.2.3.3.1. 预加载
浏览器为了增强用户体验,让浏览器更有效率,就有一个预加载的功能,大体是利用浏览器空闲时间去加载指定的内容,然后缓存起来 。这个技术又细分为DNS-prefetch、subresource、prefetch、preconnect、prerender 。
HTML5页面预加载是用link标签的rel属性来指定的 。如果csp头有unsafe-inline,则用预加载的方式可以向外界发出请求,例如
<!-- 预加载某个页面 -->
<link rel='prefetch' href=https://www.isolves.com/it/aq/fwq/2019-10-08/'http://xxxx'>
<link rel='prerender' href=https://www.isolves.com/it/aq/fwq/2019-10-08/'http://xxxx'>
<!-- 预加载某个图片 -->
<link rel='prefetch' href=https://www.isolves.com/it/aq/fwq/2019-10-08/'http://xxxx/x.jpg'>
<!-- DNS 预解析 -->
<link rel="dns-prefetch" href=https://www.isolves.com/it/aq/fwq/2019-10-08/"http://xxxx">
<!-- 特定文件类型预加载 -->
<link rel='preload' href=https://www.isolves.com/it/aq/fwq/2019-10-08/'//xxxxx/xx.js'>
另外,不是所有的页面都能够被预加载,当资源类型如下时,讲阻止预加载操作:
- URL中包含下载资源
- 页面中包含音频、视频
- POST、PUT和DELET操作的ajax请求
- HTTP认证
- HTTPS页面
- 含恶意软件的页面
- 弹窗页面
- 占用资源很多的页面
- 打开了chrome developer tools开发工具
举例来说,csp禁止跨站读取脚本,但是可以跨站读img,那么传一个含有脚本的img,再“< href=https://www.isolves.com/it/aq/fwq/2019-10-08/’http://xxx.com/xx.jpg’>“,这里csp认为是一个img,绕过了检查,如果网站没有回正确的mime type,浏览器会进行猜测,就可能加载该img作为脚本
3.2.3.3.3. 302跳转
对于302跳转绕过CSP而言,实际上有以下几点限制:
- 跳板必须在允许的域内 。
- 要加载的文件的host部分必须跟允许的域的host部分一致
当可以执行代码时,可以创建一个源为 css js 等静态文件的frame,在配置不当时,该frame并不存在csp,则在该frame下再次创建frame,达到bypass的目的 。同理,使用 ../../../ /%2e%2e%2f等可能触发服务器报错的链接也可以到达相应的目的 。
推荐阅读
- 如何测试电源的故障 测试电源好坏
- 瘦肉精快速检测试剂盒 瘦肉精检测卡
- 抑郁症在线测试
- 特斯拉|特斯拉Model Y中保碰撞测试:保费高的原因找到了!
- PHP防止跨站和xss攻击代码
- 小程序自动化测试实践
- 最全的网站渗透测试详细检测方法
- 4种出色的Python测试框架
- Java 程序员需要用到 10 个测试框架和库
- 苹果|iOS 16要来了!苹果突发iOS 15.5首个版本测试 坐等升级
