
Référence CVE-2023-45503
Dans le système de gestion de contenu (CMS) Macrob7 Macs Framework versions 1.1.4f et antérieures, une gestion non sécurisée des entrées utilisateur entraîne 16 vulnérabilités d'injection SQL. La capacité d'exécuter des requêtes SQL arbitraires peut entraîner la fuite de données privées, notamment les hachages de mots de passe des utilisateurs, ainsi que la possibilité de modifier les identifiants et le niveau de privilège d'autres utilisateurs. L'impact peut inclure une escalade de privilèges et une éventuelle exécution de code à distance (RCE).
Un tableur décrivant chaque point de terminaison affecté, paramètre vulnérable et fonctions vulnérables peut être trouvé à ce lien.
Classification CWE : CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
Signalé par : Ally Petitt
Produit affecté : Macrob7 Macs CMS
Versions affectées : 1.1.4f et antérieures
Dans 16 cas que j'ai repérés, les entrées utilisateur étaient reçues sans aucune sanitisation ni paramétrisation appropriée. Par exemple, dans la fonctionnalité 'Mot de passe oublié' de ce CMS, une adresse e-mail est demandée.
Application/plugins/CMS/controllers/CMS.php:224
public function forgotPasswordProcess()
{
$this->loadModels();
$emailAddress = Post::getByKey('emailAddress');
$user = $this->usersModel->getUserByEmailAddress($emailAddress);
L'adresse e-mail est ensuite transmise à la méthode , qui passe l'e-mail à , une méthode qui ne protège pas correctement contre les requêtes SQL injectées.
getUserByEmailAddress()selectSingle()Application/plugins/CMS/models/Users_Model.php:41
public function getUserByEmailAddress($emailAddress)
{
return $this->selectSingle( $this->getCMSTableNameUsers(), array('EmailAddress'=>$emailAddress));
}
Ensuite, selectSingle() appelle select() avec l'entrée utilisateur transmise.
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 fonction vulnérable select() concatène ensuite les paramètres qui lui sont passés dans une requête SQL qui est ensuite exécutée.
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);
}
En raison du manque de sanitisation, de validation et de paramétrisation des entrées, cette fonction reste vulnérable aux attaques par injection SQL.
Malheureusement, un manque de maintenance sur ce CMS signifie qu'une mise à jour corrigée n'est pas disponible. Les utilisateurs individuels peuvent modifier le code pour utiliser des requêtes SQL paramétrées au lieu de se reposer sur la concaténation pour passer les entrées utilisateur dans la base de données. Les instructions préparées sont un exemple d'atténuation qui peut accomplir cela.