Une vulnérabilité SSRF est lorsque vous pouvez vous connecter à un site web qui utilise des bases de données comme elasticsearch ou mysql sur leur réseau local, mais vous ne pouvez y accéder directement. Si vous pouvez exécuter un script sur le serveur qui permet d’inclure un URL, il est possible que vous soyez capable d’y accéder et avoir accès à l’information souhaité.
Nous voyons ici qu’une image est incluse via le paramètre url. Nous pourrions par exemple utiliser http://localhost:9200 pour accéder au serveur elasticsearch sur le serveur web.
<?php
if (isset($_GET['url']))
{
$url = $_GET['url'];
$image = fopen($url, 'rb');
header("Content-Type: image/png");
fpassthru($image);
}?>
Il est possible qu’il y ait filtration (localhost ou 127.0.0.1 interdit). Il est possible de contourner cette protection (parfois)
- http://0.0.0.0:9200
- http://[::]:9200 #ipv6
- http://::::9200
- http://0x7f000001:9200 #encodage hexadécimal.
- https://gist.github.com/mzfr/fd9959bea8e7965d851871d09374bb72
http://2130706433:9200 #encodage décimal
- http://0/
- http://127.1
- http://127.0.1
- http://127.0.0.1/%61dmin #single encode
- http://127.0.0.1/%2561dmin #double encode
D’autres protocoles utilisés lors de l’exploit d’une vulnérabilité SSRF
- file:///etc/passwd
- phar://
- gopher://
- data://
- dict://
Sécuriser un code PHP pour contrer les attaques exposées par une vulnérabilité SSRF
<?php
// Obtenez l'URL à partir d'un formulaire ou d'une autre source
$url = $_POST['url'];
// Vérifiez que l'URL est un lien HTTP ou HTTPS valide
if (filter_var($url, FILTER_VALIDATE_URL) && (strpos($url, "http://") === 0 || strpos($url, "https://") === 0)) {
// Si l'URL est valide, faites une requête en utilisant la fonction file_get_contents()
$content = file_get_contents($url);
// Affichez le contenu de la réponse
echo $content;
} else {
// Si l'URL n'est pas valide, affichez un message d'erreur
echo "URL invalide";
}
?>
Dans cet exemple, nous utilisons la fonction PHP filter_var()
pour valider que l’URL fournie est un lien HTTP ou HTTPS valide. Ensuite, nous vérifions également que l’URL commence bien par “http://” ou “https://”. Si l’URL est valide, nous effectuons une requête en utilisant la fonction file_get_contents()
, qui est sécurisée car elle ne permet pas de forger des requêtes à des ressources internes. Si l’URL n’est pas valide, nous affichons simplement un message d’erreur.
Il est important de noter que même si ce code est sécurisé contre les vulnérabilités SSRF, il doit être utilisé avec prudence et uniquement avec des URL de confiance. Il est également recommandé de limiter l’accès à cette fonctionnalité à des utilisateurs de confiance, afin d’éviter toute tentative d’exploitation de la vulnérabilité SSRF.
Autres considérations
Si l’application est vulnérable à XXE, cela peut être utilisé pour performer un attaque SSRF
Types de SSRF
Conclusion
Une vulnérabilité SSRF (Server-Side Request Forgery) est une faille de sécurité qui permet à un attaquant de forger des requêtes depuis le serveur cible vers des systèmes internes ou externes, en exploitant des contrôles d’entrée inadéquats. Cette faille peut être utilisée pour accéder à des informations confidentielles, exécuter des attaques à distance, ou effectuer des actions malveillantes sur les systèmes cibles.
Autres ressources
Trouver et exploiter des services avec la faille SSRF : SSRFmap