🕹️SSRF

Server-Side Request Forgery

Mindmaps

Description

La contrefaçon de requête côté serveur (également connue sous le nom de SSRF) est une vulnérabilité qui permet à un attaquant d'inciter l'application côté serveur à effectuer des requêtes vers un emplacement non souhaité.

Dans une attaque SSRF typique, l'attaquant peut amener le serveur à établir une connexion avec des services internes uniquement au sein de l'infrastructure de l'organisation. Dans d'autres cas, ils peuvent être en mesure de forcer le serveur à se connecter à des systèmes externes arbitraires, ce qui risque de divulguer des données sensibles telles que les informations d'identification d'autorisation.

Exploitation

Rechercher des fonctionnalitées potentiellement sensibles aux SSRF

Parmis ces fonctionnalitées, on retrouve toutes celles qui nécessitent de visiter et de récupérer des ressources externes.

C'est-à-dire:

Utiliser des URLs internes fréquentes

Parmis les urls internes que l'on retrouve souvent dans les entreprises, on retrouve principalement les éléments suivant:

  • localhost

  • 127.0.0.1

  • 0.0.0.0

  • 192.168.0.1

  • 10.0.0.1

Plages IP

  • 10.0.0.0/8

  • 127.0.0.1/32

  • 172.16.0.0/12

  • 192.168.0.0/16

Observer le résultat

Dans le cas de SSRF standard, voyez si le serveur renvoie une réponse qui révèle toute information sur le service interne. Par exemple, la réponse contiennent des bannières de services ou le contenu de pages internes ?

Exemple:

REQUETE:

POST /upload_profile_from_url
Host: public.example.com

...
...
user_id=1234&url=127.0.0.1:22

REPONSE:

500 Internal Error
...
...
Error: cannot upload image: SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4

Le moyen le plus simple de détecter les SSRF aveugles consiste à utiliser une technologie hors bande. On fait en sorte que la cible envoie des requêtes à un serveur externe sous notre contrôle, puis on vérifie les réponses dans les logs du serveur. Pour ce faire, vous pouvez utiliser un service d'hébergement en ligne, tel que GoDaddy ou Hostinger qui fournissent les journaux d'accès au serveur. On peut aussi utiliser burp collaborator dans le cas où on possède burp pro.

SSRF via parser PDF

Si des entrées utilisateur sont reflété dans un PDF lors de sa génération, il est parfois possible d'obtenir une SSRF en utilisant XMLHttpRequest comme ceci par exemple:

<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open("GET","file:///etc/passwd");x.send();</script>

SSRF via domain fronting

Les serveurs web traitent naturellement le domaine présent dans le header HTTP "Host:" avant l'hôte fourni dans l'URL.

Le principe du domain fronting est donc de remplacer le domaine du header Host par un domaine contrôlé par l'attaquant (Host header injection). Cependant, pour que cela fonctionne, il est nécessaire que les deux domaines (dans le header Host et l'URL) aient leur fichier de configuration Virtual Host présent sur le même serveur web.

Bypass

Bypass via redirection

http://nicob.net/redir6a => https://169.254.169.254/

Bypass de Allowlist

Via utilisation d'un open redirect ce qui permettrait de passer par un (sous-)domaine de confiance.

Bypass de regex

On peut également essayer de placer un domaine de confiance dans le point vulnérable tel que https://trusted.target.com@127.0.0.1

Bypass de blocklist

Via redirection

On peut par exemple essayer de passer par un domaine en notre possession qui contiendrait une redirection vers une IP interne.

Exemple:

Requête envoyée:

https://target.com/proxy?url=https://attacker.com/ssrf

Contenu de https://attacker.com/ssrf:

<?php header("location: http://127.0.0.1"); ?>

Via utilisation d'une IPv6

En effet si une protection a été mise en place sur les IPv4 il n'est pas impossible que les IPv6 aient été omises.

Via utilisation d'enregistrements DNS

Il est également tout a fait possible de faire pointer un enregistrement DNS A ou AAAA de votre serveur vers une IP interne type 127.0.0.1.

Dans ce cas, lorsque le serveur cible fera une requête vers votre serveur, il fera en fait une requête vers l'IP interne spécifié de son réseau.

Via hostname à la place d'IP

Exemple: 169.254.169.254 => 169.254.169.254.nip.io ou 169-254-169-254.nip.io

Via Encoding

Voir SSRF Bypass.

Outils

Gopherus

Gopherus est un outil permettant de tenter d'escalader une SSRF en RCE en générant des lien exploitant divers services. (Applications PHP seulement)

Exemple d'utilisation:

$ gopherus --exploit mysql

ressource: https://github.com/tarunkant/Gopherus

rbndr

Service de DNS rebinding pour SSRF en aveugle.

ressource: https://github.com/taviso/rbndr

Dernière mise à jour