DVWA靶场 – CSP Bypass

blog 36
DVWA靶场 - CSP Bypass

标题简介

Content Security Policy简称CSP,即内容安全策略,CSP的诞生旨在减少xss(跨站脚本攻击),注意这里是减少,并不是销毁。其核心思想非常简单,通过设置响应头来告诉浏览器什么是被授权执行的,什么是禁止执行的,类似于一个白名单的操作。

CSP大大增加了网站的安全性,即是网站存在xss漏洞,但是也无法执行攻击脚本。因为黑客的主机并不再可信范围呢。除非劫持了一个可信的主机。

CSP的使用:

1、HTTP响应头中使用:

"Content-Security-Policy:" 策略
"Content-Security-Policy-Report-Only:" 策略

2、在HTML的meta标签属性中使用

<meta http-equiv="content-security-policy" content="策略">
<meta http-equiv="content-security-policy-report-only" content="策略">

Content-Security-Policy值为script-src 'self',表示只能从本域名下引用外部js文件。

如果值为Content-Security-Policy值为default-src 'self'表示只能从本域名下引用资源文件,具体指定的资源见如下:

资源加载限制

  • script-src:外部脚本
  • style-src:样式表
  • img-src:图像
  • media-src:媒体文件(音频和视频)
  • font-src:字体文件
  • object-src:插件(比如 Flash)
  • child-src:框架
  • frame-ancestors:嵌入的外部资源(比如<frame>、<iframe>、<embed>和<applet>)
  • connect-src:HTTP 连接(通过 XHR、WebSockets、EventSource等)
  • worker-srcworker脚本
  • manifest-src:manifest 文件

low级别

DVWA靶场 - CSP Bypass

后端的PHP代码逻辑也很简单,就设置了一个header头部为CSP内容安全策略。其Content-Security-Policy的值为:script-src 'self' https://pastebin.com hastebin.com example.com code.jquery.com https://ssl.google-analytics.com

表示script脚本只能引入本域名下的js脚本和来自于域名为https://pastebin.comhastebin.com 以及 example.comcode.jquery.com或者https://ssl.google-analytics.com下的js脚本才能被正常执行。如果引用于他们之外的则直接拒绝执行。

DVWA靶场 - CSP Bypass

可以看到,这里是通过http header引入了CSP。

首先我们先测试,从与dvwa靶场访问时的url域名(ip)下放入js文件,测试是否能被执行。

DVWA靶场 - CSP Bypass

我们在该ip(域名)的根目录下,创建123.js文件,内容为alert(/xss/);

DVWA靶场 - CSP Bypass

之后我们将该url复制,放到下面表单中点击include。

DVWA靶场 - CSP Bypass

之后页面就进行了弹窗,可以发现,这里是允许执行script来自本域名下的js文件。

DVWA靶场 - CSP Bypass

那么我们假设引入了http://127.0.0.1/123.js是否能执行呢?

DVWA靶场 - CSP Bypass

答案是不可以的,页面并没有进行弹窗,而是在控制台中输出了如上错误。大概意思是说,拒绝加载来自http://127.0.0.1/123.js的脚本文件,原因是由于它违反了内容安全策略CSP指定的Content-Security-Policy

我们已知可以引用来自如下网址的script文件。

https://pastebin.com
hastebin.com
example.com
code.jquery.com
https://ssl.google-analytics.com

我们首先访问pastebin.com好像是一个分享文字内容的平台,我们在新粘贴(New Paste)中输入alert(/xss/)

DVWA靶场 - CSP Bypass

之后点击下方的Create New Paste(创建新粘贴)

DVWA靶场 - CSP Bypass

之后选择raw,会跳转到一个url地址中,我们将url地址复制即可。

https://pastebin.com/raw/TZ6r6WL8

之后我们放入到CSP靶场表单中提交:

DVWA靶场 - CSP Bypass

发现报错,正常情况下,script标签引入的文件,是不看后缀的,也就是说,你引入一个txt后缀的文件,照样可以将其作为js文件执行。

<script src='./123.txt'></script>

但是我们这里由于外部引用了text/plain文件,浏览器出于安全考虑,并没有将其解析。

之后我将后端代码输出的script标签指定了type属性,但还是无法解决该问题。

DVWA靶场 - CSP Bypass

Google一下发现是chrome浏览器的安全策略。由于响应pastebin.com网站在响应内容的时候,在http头部存在x-content-type-options: nosniff,则script和 stylesheet 元素会拒绝包含错误的 MIME 类型的响应。这是一种安全功能,有助于防止基于 MIME 类型混淆的。

DVWA靶场 - CSP Bypass

因此chrome无法解析,那么我又换到了Firefox,发现也无法正常解析。但是网上大多数都是通过Firefox浏览器成功的。猜测可能是pastebin.com网站后期加上了x-content-type-options: nosniff,才导致现在无法成功。

DVWA靶场 - CSP Bypass

之后又尝试使用hastebin.com创建内容,但是由于时代久远,该当我们访问hastebin.com的时候,会重定向到另外一个域名。

DVWA靶场 - CSP Bypass

靶场作者提供的两个payload均无法使用,那么也问题不大,我们主要是学这个思路。这下来我修改hosts表,将hastebin.com这个域名,指向我本地的127.0.0.1ip。

Linux修改hosts表:

sudo vim /etc/hosts
DVWA靶场 - CSP Bypass

添加如上配置。

windows修改hosts表:

DVWA靶场 - CSP Bypass

之后我们在网站根目录下创建xss.txt(也可以直接为js)文件,内容为如下:

DVWA靶场 - CSP Bypass

之后我们复制url: http://hastebin.com/xss.txt

DVWA靶场 - CSP Bypass

之后提交即可弹窗,注意这里的url不能为http://www.hastebin.com,不然会被解析为公网的ip地址,除非在hosts表中将www.hastebin.com解析为本地地址。

medium级别

直接审计源码发现,这一关和上一关的源码类似,只不过在Content-Security-Policy属性进行了修改。之后又在http头部中添加了X-XSS-Protection为0的属性值。

在IE 8浏览器中引用了xss的防御机制,这种机制被称为xss过滤器,旨在缓解xss攻击。后来被webkit内核引进,也就是chrome浏览器,叫做xss审计,这个想法非常简单,如果用户恶意输入的内容别输出在页面之后,那么xss过滤器或审计会将其进行剔除。或者拒绝它的执行。

关于它的设置,网站可以通过http头部进行设置,该属性名为X-XSS-Protection,其值如下:

  • 值为0表示禁用xss过滤器/审核
  • 值为1表示删除不安全的部分,如果没有X-XSS-Protection,该值则为默认值。
  • 值为1;mode = block 则表示,如果找到了恶意代码,则不要渲染整个文档。
DVWA靶场 - CSP Bypass

script-src的特殊值:

'self' 告诉浏览器只允许本域名下的script文件成功执行,其他域名下的则直接拒绝加载。

'unsafe-inline' 告诉浏览器允许执行页面内嵌的<script>标签和其事件监听函数,比如onclick、javascript:url等。如果不指定该值,同时开启了CSP,那么浏览器则不会执行某些标签的内联js代码。

nonce元素可以白名单某些<script>标签和<style>标签,使他们不受CSP安全策略的影响。

因此我们可以在script标签中添加nonce属性,并且值为CSP内容安全策略设置的值:TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=,该值是一个base64编码的值。那么就可以将script标签带有nonce属性且值为左侧字符串的script标签设置为白名单。其执行不会受到CSP安全策略的限制。

<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(/xss/)</script>
DVWA靶场 - CSP Bypass

如果不指定nonce,则直接<script>alert(/xss/);</script>,那么该脚本会被浏览器拒绝执行。并在控制台输出具体的错误信息。

DVWA靶场 - CSP Bypass

大概意思为拒绝执行该脚本,原因是违反了CSP内容安全策略的规定。

high级别

DVWA靶场 - CSP Bypass

通过观察响应内容来看,这里的CSP内容安全策略只允许引用script脚本来自本域名才能够成功被加载,并且这里并没有了输入框,而是换成了求和的按钮。

DVWA靶场 - CSP Bypass

在源代码中发现引入了该js文件。看这个形式应该是处理我们表单内容的。

DVWA靶场 - CSP Bypass

代码的意思大致就是当我们点击Solve the sum按钮的时候,会在body的尾部创建一个script标签,该script标签的src执行一个php文件,并且进行了传参。

DVWA靶场 - CSP Bypass

那么为了弄清楚具体代码的逻辑,我们直接审计jsonp.php文件。

DVWA靶场 - CSP Bypass

jsonp.php这里的核心功能就输出solvesum({"anser":"15"})。之后script的src又引入了该页面返回的内容即:solvesum({"anser":"15"}),那么此时就回去调用solvesum()函数。

DVWA靶场 - CSP Bypass

solvesum()函数的核心功能就是替换idanswer元素原有的内容,将其替换为ojb['anser'],也就是替换为15了。

点击按钮前:

DVWA靶场 - CSP Bypass

点击按钮后:

DVWA靶场 - CSP Bypass

也就是将原有的空,替换为15,分析完代码后,发现在solvesum()函数有着替换功能,而其函数的参数,是由scriptsrc,也就是jsonp.php文件控制着的,但是jsonp.php并没有对参数callback进行过滤,而是直接引用,但是最终输出的值是固定的。

DVWA靶场 - CSP Bypass

后来又想了以下,发现创建script标签是由js控制的,并且该src的值也是由js控制的,那么我们直接通过浏览器修改本地的high.js文件即可。

DVWA靶场 - CSP Bypass

当我们再次点击Solve the sum的时候,生成的url就为如下:

DVWA靶场 - CSP Bypass

而经过jsonp.php处理之后,jsonp.php会将我们传入的参数输出到页面当中,并且与经过json_encode()函数编码之后的{"anser":"15"}和其()也随之输出到页面当中。

DVWA靶场 - CSP Bypass

因此页面jsonp.php返回给前端的内容就为:

DVWA靶场 - CSP Bypass

之后又经过script标签的引入,则就在页面弹窗。

DVWA靶场 - CSP Bypass

impossible级别

打印在页面的说明:

Unlike the high level, this does a JSONP call but does not use a callback, instead it hardcodes the function to call.

The CSP settings only allow external JavaScript on the local server and no inline code.

大概意思就是说,跟high级别的不同,

它执行 JSONP 调用但不使用回调,而是硬编码要调用的函数。

CSP 设置仅允许本地服务器上的外部 JavaScript 并且不允许内联代码。

impossible.php没有什么较大的变化。

DVWA靶场 - CSP Bypass
DVWA靶场 - CSP Bypass

impossible.js也没有什么大变化。唯独jsonp_impossible.php发生了变化

DVWA靶场 - CSP Bypass

这里直接将solveSun写死。并且没有任何从外接收的参数。因此我们无从下手。

分享