
La faille PHP critique expose les sites Web aux attaques par injection SQL
Une vulnérabilité grave a été découverte dans PHP, exposant potentiellement des sites web et des applications aux attaques par injection SQL. Il est fortement conseillé aux utilisateurs de se mettre à jour dès que possible aux dernières versions de PHP.
Le défaut, identifié sous le nom de CVE-2022-31631 (CVSS 9.1), affecte les versions 8.0.x de PHP avant 8.0.27, 8.1.x avant 8.1.15 et 8.2.x avant le 8.2.2. Il réside dans la fonction PDO::quote() lorsqu’il est utilisé avec les bases de données SQLite. Cette fonction est couramment utilisée pour désinfecter les données fournies par l’utilisateur avant qu’elles ne soient utilisées dans les requêtes de base de données, une étape cruciale dans la prévention de l’injection de SQL.
La vulnérabilité du CVE-2022-31631 découle d’un problème de débordement d’un nombre entier. Lorsqu’une chaîne trop longue est transmise à PDO::quote(), la fonction peut ne pas échapper correctement à l’entrée. Cela peut conduire à la création de requêtes SQL mal formées, permettant aux attaquants d’injecter du code malveillant et potentiellement de prendre le contrôle de la base de données.
Le problème central réside dans la façon dont PHP gère les longueurs de chaîne. Alors que la fonction SQLite sous-jacente sqlite3’snprintf() utilise un entier de 32 bits pour les paramètres de longueur, POP::quote() de PHP utilise un zend-long, qui est typiquement de 64 bits sur les systèmes modernes. Cet écart peut conduire à un débordement d’un entier, où la valeur de longueur s’enroule, ce qui se traduit par une chaîne indûment citée.
Dans des scénarios spécifiques, ce débordement peut même entraîner un retour unique d’une apostrophe unique, neutralisant ainsi la désinfection prévue et ouvrant la porte à l’injection SQL. Bien que les limites de mémoire et les paramètres de taille post-max-size puissent offrir une certaine réduction, ils ne constituent pas une protection fiable contre cette vulnérabilité.
Alors que les systèmes 32 bits sont théoriquement moins sensibles en raison de la parité de taille entre les nombres entiers et les zend_longarchitectures longues, les architectures de 64 bits sont particulièrement vulnérables. Les scripts de test fournis montrent comment ce débordement peut être exploité sur ces systèmes.
Cette vulnérabilité présente un risque important pour toute application utilisant les versions PHP concernées avec les bases de données SQLite. L’injection SQL est une menace grave qui peut permettre aux attaquants de voler des données sensibles, de modifier le contenu de la base de données, voire de prendre le contrôle du serveur.
Par conséquent, il est absolument essentiel que tous les utilisateurs de PHP passent immédiatement aux versions patchées: PHP 8.0.27, 8.1.15, ou 8.2.2 (ou plus tard). Les administrateurs et les développeurs de sites Web devraient revoir de manière approfondie leur code pour s’assurer que des pratiques appropriées d’assainissement des données sont en place, même après la mise à jour.