
Referencia CVE-2023-45503
En Macrob7 Macs Framework Content Management System (CMS) versiones 1.1.4f y anteriores, el manejo inseguro de la entrada del usuario conduce a 16 vulnerabilidades de inyección SQL. La capacidad de ejecutar consultas SQL arbitrarias puede provocar la filtración de datos privados, incluidos los hash de contraseñas de los usuarios, y la capacidad de modificar las credenciales y el nivel de privilegios de otros usuarios. El impacto puede incluir escalada de privilegios y una posible ejecución remota de código (RCE).
Se puede encontrar una hoja de cálculo que describe cada endpoint afectado, parámetro vulnerable y las funciones vulnerables en este enlace.
Clasificación CWE: CWE-89: Neutralización incorrecta de elementos especiales utilizados en un comando SQL ('Inyección SQL')
Reportado por: Ally Petitt
Producto afectado: Macrob7 Macs CMS
Versiones afectadas: 1.1.4f y anteriores
En 16 casos que detecté, la entrada del usuario se recibía sin una sanitización o parametrización adecuada. Por ejemplo, en la funcionalidad "Forgot Password" de este CMS, se solicita una dirección de correo electrónico.
Application/plugins/CMS/controllers/CMS.php:224
public function forgotPasswordProcess()
{
$this->loadModels();
$emailAddress = Post::getByKey('emailAddress');
$user = $this->usersModel->getUserByEmailAddress($emailAddress);
La dirección de correo electrónico se pasa al método getUserByEmailAddress(), que pasa el correo electrónico a selectSingle(), un método que no protege adecuadamente contra consultas SQL inyectadas.
Application/plugins/CMS/models/Users_Model.php:41
public function getUserByEmailAddress($emailAddress)
{
return $this->selectSingle( $this->getCMSTableNameUsers(), array('EmailAddress'=>$emailAddress));
}
Luego, selectSingle() llama a select() con la entrada de usuario pasada.
Application/core/DB.php:200
public function selectSingle($tableName, array $where = array(), array $fields = array('*'))
{
$return = $this->select($tableName, $where, $fields);
$single = NULL;
if( count($return) > 0 )
$single = $return[0];
return $single;
}
La vulnerable función select() procede a concatenar los parámetros que se le pasan en una consulta SQL que posteriormente se ejecuta.
Application/core/DB.php:186
public function select($tableName, array $where = array(), array $fields = array('*'))
{
$fieldsString = $this->generatePair($fields, ',');
$whereString = $this->generateKeyValuePair($where, '=', 'AND');
$sql = 'SELECT '.$fieldsString.' FROM '.$tableName;
if($whereString !='')
$whereString = ' WHERE '.$whereString;
$sql = $sql.' '.$whereString.';';
return $this->execute($sql)->fetchAll($this->returnType, $this->className);
}
Debido a la falta de sanitización, validación y parametrización de la entrada, esta función sigue siendo vulnerable a ataques de inyección SQL.
Desafortunadamente, la falta de mantenimiento de este CMS significa que no hay una actualización parcheada disponible. Los usuarios individuales pueden modificar el código para que contenga consultas SQL parametrizadas, en lugar de depender de la concatenación para pasar la entrada del usuario a la base de datos. Las sentencias preparadas son un ejemplo de mitigación que puede lograr esto.