Security ❀ CSP Bypass 内容安全策略绕过

2023-05-16

文章目录

  • 内容安全策略绕过 CSP Bypass
    • 1 Low Level
    • 2 Medium Level
    • 3 High Level
    • 4 Impossible Level

内容安全策略绕过 CSP Bypass

CSP - 内容安全策略:为了缓解很大一部分潜在的跨站脚本XSS问题,浏览器的扩展程序系统引入了内容安全策略CSP 的概念。通过引入一些相当严格的策略使扩展程序在默认情况下更加安全,开发者可以创建并强制应用一些规则,管理网站允许加载的内容。

CSP以白名单的机制对网站加载或执行的资源起作用,在网页中策略通过HTTP头部信息或meta元素定义。CSP虽然提供了强大的安全保护,但是它也令eval()及相关函数被禁用、内嵌的JavaScript代码将不会执行、只能通过白名单来加载远程脚本。如果要使用CSP技术保护自己的网站,开发者就不得不花费大量时间分离内嵌的JavaScript代码和做一些调整。

1 Low Level

源码:

<?php

# 指定headerCSP变量,防置了一些url
$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com example.com code.jquery.com https://ssl.google-analytics.com ;"; // allows js from self, pastebin.com, hastebin.com, jquery and google analytics.

# 使用header函数调用变量headerCSP发送到客户端或浏览器
header($headerCSP);

# These might work if you can't create your own for some reason
# 绕过案例
# https://pastebin.com/raw/R570EE00
# https://hastebin.com/raw/ohulaquzex

?>
# 使用script src指令指向一个外部JavaScript文件
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
    <script src='" . $_POST['include'] . "'></script>
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
    <p>You can include scripts from external sources, examine the Content Security Policy and enter a URL to include here:</p>
    <input size="50" type="text" name="include" value="" id="include" />
    <input type="submit" value="Include" />
</form>
';

源码对HTTP头部定义了CSP标签,定义了可以接受外部JavaScript资源的白名单,可以通过抓包确认是哪些网站;

其中https://pastebin.com是一个快速分享文本内容的网站,若文本的内容是一段JavaScript代码,网页就会把代码包含起来;可以使用该域名进行创建包含JavaScript代码的URL,也可直接使用源码中的案例进行绕过操作。

# https://pastebin.com/raw/R570EE00
# URL回显内容:alert("pastebin");

在这里插入图片描述

2 Medium Level

源码:

<?php

# script src有了新的变化,unsafe-inline允许执行页面内嵌的<script>标签和事件监听函数,nonce值会在每次HTTP回应给出一个授权token
$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";

header($headerCSP);

# 禁用XSS保护
// Disable XSS protections so that inline alert boxes will work
header ("X-XSS-Protection: 0");

# 绕过案例
# <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>

?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
    " . $_POST['include'] . "
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
    <p>Whatever you enter here gets dropped directly into the page, see if you can get an alert box to pop up.</p>
    <input size="50" type="text" name="include" value="" id="include" />
    <input type="submit" value="Include" />
</form>
';

源码中nonce参数无任何过滤,对其进行注入即可。将绕过案例<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>内容复制到输入框内,进行绕过弹窗测试。
在这里插入图片描述

3 High Level

源码:

<?php

$headerCSP = "Content-Security-Policy: script-src 'self';";

header($headerCSP);

?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
    " . $_POST['include'] . "
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
    <p>The page makes a call to ' . DVWA_WEB_PAGE_TO_ROOT . '/vulnerabilities/csp/source/jsonp.php to load some code. Modify that page to run your own code.</p>
    <p>1+2+3+4+5=<span id="answer"></span></p>
    <input type="button" id="solve" value="Solve the sum" />
</form>

# script src指向了source/high.js代码文件
<script src="source/high.js"></script>
';

high.js代码:

function clickButton() {
  	// src指向source/jsonp.php?callback=solveNum,document对象使我们可以从脚本中对HTML页面中的所有元素进行访问,createElement()方法通过指定名称创建一个元素
    var s = document.createElement("script");
    s.src = "source/jsonp.php?callback=solveSum";
    // body 属性提供对 < body > 元素的直接访问,对于定义了框架集的文档将引用最外层的<frameset>,appendChild()方法可向节点的子节点列表的末尾添加新的子节点,也就是网页会把“source/jsonp.php?callback=solveNum”加入到DOM中
    document.body.appendChild(s);
}

function solveSum(obj) {
    if ("answer" in obj) {
        // 定义solveNum函数,函数传入参数obj,字符串“answer”在obj中就会执行下面代码
        document.getElementById("answer").innerHTML = obj['answer'];
        // getElementById()方法可返回对拥有指定ID的第一个对象的引用,innerHTML属性设置或返回表格行的开始和结束标签之间的HTML。这里的script标签会把远程加载的solveSum({"answer":"15"})当作js代码执行,然后这个函数就会在页面显示答案
    }
}

var solve_button = document.getElementById ("solve");

if (solve_button) {
    solve_button.addEventListener("click", function() {
        clickButton();
    });
}

jsonp.php代码:

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

if (array_key_exists ("callback", $_GET)) {
	$callback = $_GET['callback'];
} else {
	return "";
}
# 代码中对callback参数无任何过滤限制,对其进行注入即可进行绕过
$outp = array ("answer" => "15");

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

注入代码:include=<script src="source/jsonp.php?callback=alert(1);"></script>

4 Impossible Level

源码:

<?php

$headerCSP = "Content-Security-Policy: script-src 'self';";

header($headerCSP);

?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
    " . $_POST['include'] . "
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
    <p>Unlike the high level, this does a JSONP call but does not use a callback, instead it hardcodes the function to call.</p><p>The CSP settings only allow external JavaScript on the local server and no inline code.</p>
    <p>1+2+3+4+5=<span id="answer"></span></p>
    <input type="button" id="solve" value="Solve the sum" />
</form>

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

impossible.js代码:

function clickButton() {
    var s = document.createElement("script");
    s.src = "source/jsonp_impossible.php";
    // JSONP调用的回调函数是硬编码的,CSP策略被锁定为只允许外部脚本
    document.body.appendChild(s);
}

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

var solve_button = document.getElementById ("solve");

if (solve_button) {
    solve_button.addEventListener("click", function() {
        clickButton();
    });
}

jsonp_impossible.php代码:

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

$outp = array ("answer" => "15");
# outp值被锁死
echo "solveSum (".json_encode($outp).")";
?>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Security ❀ CSP Bypass 内容安全策略绕过 的相关文章

随机推荐

  • Spring Boot 接口统一前缀

    需求 需求如题 xff0c 想给一个 spring boot 项目的所有请求路径添加统一前缀 xff0c 可以通过 context path 来配置 但是在同时存在静态资源和 Controller 接口的项目中 xff0c 如果希望静态资源
  • 一文读懂pid控制器

    文章目录 PID控制器1 控制器1 1 电机速度控制系统1 2 温度或水位控制系统1 3 小小总结 2 PID3 模拟式PID4 数字式PID4 1 位置式PID算法4 1 2 位置式pid算法的缺点 4 2 增量式PID算法4 2 2 增
  • Gazebo创建围墙并生成.world文件

    Gazebo创建围墙并生成 world仿真环境文件 文件说明 world文件是gazebo中搭建的仿真环境保存后的文件格式 xff0c 其中包含了若干个模型文件 world文件如图所示 xff1a 其中相关参数是gazebo基于我们在gaz
  • Ubuntu18.04分区方案

    由于Ubluntu18 04安装和16 04基本一样 xff0c 因此就没什么好说的 xff0c 主要记录一下分区方案 硬盘总容量 xff1a 500G 分区方案 xff1a EFI分区 逻辑分区 xff0c 空间起始位置 xff0c 10
  • Ubuntu18.04搭建AirSim+ROS仿真环境

    AIRSIM在UBuntu 18 04上构建的官网文档 一 安装UE4引擎 AIRSIM是依赖于UE4引擎实现的 因此在安装AIRSIM之前要安装UE4引擎 1 获取UE4的github许可 在Ubuntu上安装UE4引擎需要从源文件进行编
  • OpenCV-Python学习笔记(使用opencv识别物体的位置,找到中心点位)

    使用opencv识别物体的位置 xff0c 找到中心点位 xff1a 步骤 xff1a 先拿到图像 gt 进行高斯滤波 gt 进行灰度处理 gt 进行二值化 gt 进行开运算 gt 轮廓提取 gt 计算中心点位 效果图如下 xff1a 代码
  • ROS下使用realsense-d435i跑通 rgbdslam_v2运行踩坑完成

    准备工作 rbgdslam v2 按照github 实验环境Ubuntu 16 04 ROS kinetic 如果你电脑安装PCL版本是1 7 xff0c 那么请直接跳到错误1 xff0c 如果你也不知道有没有 xff0c 或者版本多少 x
  • ROS学习 catkin CMakeList.txt详细介绍

    ROS中catkin CMakeLists txt的内容 CMakeList txt文件是CMake编译系统编译软件包过程的输入文件 任何CMake兼容包都包含一个或多个CMakeLists txt文件 xff0c 这些文件描述了如何编译代
  • ROS Catkin 教程之 CMakeLists.txt

    1 概览 CMakeLists txt 是用 CMake 构建系统构建 ROS 程序包的输入文件 任何兼容 CMake 的包都包含一个或多个 CMakeLists txt 文件 xff0c 用以描述怎样构建和安装代码 catkin 项目采用
  • ROS在roslaunch时,提示“is neither a launch file in package”或TAB时没有补全

    描述 已经设置了source devel setup bash xff0c 在同一终端用roslaunch可以 xff0c 但我在这个终端起的是roscore xff0c 新终端再用roslaunch就不行了 分析 报错是因为没找到对应的p
  • ros绑定串口

    本文主要介绍ros绑定串口设备的一种方法 1 检查有多少个设备 span class token function ls span dev ttyUSB 2 查看对应串口 查看KERNELS后面的设备的硬件端口号 udevadm info
  • Spring Boot 配置文件配置自动提示 Configuration Processor

    效果 在使用Idea等开发工具时 xff0c 配置文件中输入前缀就有对应的补全提示 xff0c 使开发者可以很方便配置相应属性 xff0c 效果截图如下 xff1a 元数据说明 这些提示来自于 spring 自动配置规范中的源数据文件 sp
  • ubuntu20.4安装python3.8

    ubuntu20 4中安装python3 8 注 ubuntu20 4自带python3 10 软连接python3与pip3指向的为python3 10本文意在安装python3 8 并将软连接python与pip指向python3 8
  • C/C++多线程、线程同步(互斥锁与信号量)

    参考链接2 中写的非常好 xff0c 简单易懂 xff0c 上手快 xff0c 非常好的博文 使用多线程及互斥锁样例 xff1a include lt iostream gt include lt windows h gt using na
  • Python ❀ 初学者学习笔记与知识点梳理

    软件安装与环境部署变量与数据类型列表与元组条件判断语句字典while循环函数类文件与异常 推荐代码练习地址 xff1a https www runoob com python python 100 examples html 点击此处直接跳
  • Shell ❀ Linux系统自动挂载本地yum源并安装rpm依赖包

    文章目录 1 脚本代码详解2 代码执行结果3 脚本参数调整 1 脚本代码详解 span class token comment bin bash span span class token builtin class name echo s
  • Windows ❀ Windows系统下端口连通性常见的验证方法

    文章目录 1 telnet1 1 telnet服务开启方法1 2 端口连通性验证 2 tcping2 1 tcping下载与安装2 2 端口连通性验证 3 netstat ano findstr3 1 findstr使用语法3 2 端口连通
  • Security ❀ 安全设备学习规范(第二版)

    文章目录 安全设备学习规范1 设备部署环境1 1 部署方式1 2 配置IP地址与路由1 3 设备冗余机制1 4 会话同步机制1 5 设备账户管理1 6 设备故障诊断 2 产品授权方式2 1 序列号2 2 Hash值 3 相关设备联动3 1
  • Windows ❀ 解决Google浏览器无法访问网页问题

    文章目录 问题 xff1a Google浏览器无法访问网页解决方法 问题 xff1a Google浏览器无法访问网页 使用Google浏览器打开某个已知安全网页时 xff0c 弹出如下信息 xff0c 错误内容如下 xff1a NET ER
  • Security ❀ CSP Bypass 内容安全策略绕过

    文章目录 内容安全策略绕过 CSP Bypass1 Low Level2 Medium Level3 High Level4 Impossible Level 内容安全策略绕过 CSP Bypass CSP 内容安全策略 xff1a 为了缓