Vulnérabilité SSRF (Server Side request forgery)

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

Les différents 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

Différentes façons d’exploiter SSRFmap

Leave a Reply