SSRF (wfuzz) - Pentesting Web

Installation premier scénario (vulnérabilité SSRF) :
docker pull ubuntu:latest
docker run -dit --name ssrf_first_lab ubuntu
docker exec -it ssrf_first_lab bash
apt update
apt install apache2 php nano python3 lsof -y
service apache2 start
lsof -i:80 # vérifier si le site web est actif
  • Dans le répertoire /var/www/html, créer un fichier utility.php avec le contenu suivant :

<?php
if (isset($_GET['url'])) {
    $url = $_GET['url'];
    echo "\n[+] Listing the content of the website " . $url . ":\n\n";
    include($url);
} else {
    echo "\n[!] No value has been provided for the URL parameter\n\n";
}
?>
  • Dans ce cas, le script ne fonctionne pas comme prévu. Il faut modifier le fichier "/etc/php/8.1/apache2/php.ini" en mettant allow_url_include à "on".

  • Créez un fichier login.html dans le répertoire /tmp/ simulant une page de connexion en production :

<!DOCTYPE html> 
<html> 
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> Login Page </title>
<style> 
Body {
  font-family: Calibri, Helvetica, sans-serif;
  background-color: pink;
}
button { 
       background-color: #4CAF50; 
       width: 100%;
        color: orange; 
        padding: 15px; 
        margin: 10px 0px; 
        border: none; 
        cursor: pointer; 
         } 
 form { 
        border: 3px solid #f1f1f1; 
    } 
 input[type=text], input[type=password] { 
        width: 100%; 
        margin: 8px 0;
        padding: 12px 20px; 
        display: inline-block; 
        border: 2px solid green; 
        box-sizing: border-box; 
    }
 button:hover { 
        opacity: 0.7; 
    } 
  .cancelbtn { 
        width: auto; 
        padding: 10px 18px;
        margin: 10px 5px;
    } 
      
   
 .container { 
        padding: 25px; 
        background-color: lightblue;
    } 
</style> 
</head>  
<body>  
    <center> <h1> Student Login Form (PRO) </h1> </center> 
    <form>
        <div class="container"> 
            <label>Username : </label> 
            <input type="text" placeholder="Enter Username" name="username" required>
            <label>Password : </label> 
            <input type="password" placeholder="Enter Password" name="password" required>
            <button type="submit">Login</button> 
            <input type="checkbox" checked="checked"> Remember me 
            <button type="button" class="cancelbtn"> Cancel</button> 
            Forgot <a href="#"> password? </a> 
        </div> 
    </form>   
</body>   
</html>
  • Redémarrez le service apache2 après la modification :

    service apache2 restart

  • Créez un serveur web Python3 visible uniquement depuis le réseau interne :

python3 -m 4646 --bind 127.0.0.1

Dessin technique pour comprendre le premier scénario (Il y a un site web sur le port 8089 qui n'est visible que depuis les ordinateurs du réseau interne):

Grâce au script utility.php, nous spécifions une URL et nous voyons qu'il l'interprète :

Si nous essayons de nous connecter depuis notre machine normale, nous n'avons pas accès au site web :

Mais si nous nous connectons avec le script utility.php en indiquant l'URL du réseau interne, nous voyons qu'il l'interprète :

Dans un cas hypothétique où nous ne connaissons pas le port, nous allons utiliser l'outil Wfuzz pour lancer une attaque de force brute :

Maintenant, nous filtrons pour n'indiquer que les sites web différents d'une taille de 4 caractères :

Il détecte les ports 80 et 4646 :

Mis à jour

Ce contenu vous a-t-il été utile ?