Attaque d'injection SQL: points clés
L'attaque d'injection SQL est une menace de sécurité du site Web grave.
Pour éviter les attaques d'injection SQL, ne faites pas confiance à l'entrée de l'utilisateur et vérifiez toujours s'il existe un schéma d'attaque potentiel. Cela inclut non seulement l'entrée de texte, mais également les entrées cachées, les paramètres de chaîne de requête, les cookies et les téléchargements de fichiers.
La saisie de l'utilisateur doit être vérifiée du côté serveur pour s'assurer que son type est correct et pour éliminer les commandes malveillantes potentielles. Cela peut être réalisé de diverses manières, comme l'ajout de caractères d'échappement à la saisie qui peuvent modifier les commandes SQL, ou le remplacement de la saisie utilisateur dans les commandes SQL avec des paramètres de commande.
Il est crucial de vérifier régulièrement le code du site Web pour les vulnérabilités potentielles, et il est également important de se préparer pour les attaques d'injection SQL. Les mesures pour limiter les dommages potentiels incluent l'évitement de l'utilisation des droits de l'administrateur, le cryptage des données sensibles et le non-stockage de données sensibles sauf si vous avez absolument nécessaire.
D'autres mesures de protection incluent: l'utilisation d'une connexion distincte pour les opérations de base de données de lecture et d'écriture, la limitation de l'accès du compte utilisateur à une adresse IP spécifique, en utilisant le modèle d'authentification Windows dans MS SQL Server et en utilisant des algorithmes forts tels que le hachage de mot de passe Sha-2.
Merci à Chris Lienert et à Guido Tonnaer pour leur aide à examiner cet article.
Parmi toutes les attaques contre les sites Web, l'injection SQL est la plus dangereuse et la plus courante et a été utilisée pour causer des dommages réels aux entreprises et aux organisations au cours de la dernière année. Le programme a été utilisé pour attaquer des organisations et des entreprises bien connues, notamment TalkTalk, Vtech, le Wall Street Journal et le gouvernement américain.
En bref, l'injection SQL (également connue sous le nom de SQLI) exploite les vulnérabilités dans les canaux d'entrée du site Web pour attaquer la base de données du backend d'application Web, qui stocke les informations les plus sensibles et les plus précieuses. Les attaquants peuvent utiliser ce schéma pour voler ou altérer les données, gêner les fonctionnalités d'application et obtenir un accès administratif au serveur de base de données dans le pire des cas.
Voici ce que vous devez savoir sur l'injection SQL et comment protéger votre site Web contre ses attaques.
Comment fonctionne l'attaque par injection SQL
L'attaque d'injection SQL est effectuée en envoyant des commandes SQL malveillantes au serveur de base de données via des demandes Web. Tout canal d'entrée peut être utilisé pour envoyer des commandes malveillantes, y compris des éléments de formulaire, des chaînes de requête, des cookies et des fichiers.
Pour comprendre comment cela fonctionne, supposons que vous ayez un formulaire de connexion qui accepte un nom d'utilisateur et un mot de passe:
Lorsqu'un utilisateur entre ses informations d'identification et appuie sur le bouton "Connexion", les informations seront publiées sur votre serveur Web et combinées avec des commandes SQL. Par exemple, en PHP, le code ressemble à ceci:
$sql_command = "select * from users where username = '" . $_POST['username']; $sql_command .= "' AND password = '" . $_POST['password'] . "'";
La commande sera ensuite envoyée au serveur de base de données, et l'ensemble de données généré déterminera si le nom d'utilisateur et le mot de passe correspondent à un compte utilisateur valide. La saisie moyenne de l'utilisateur "John" comme nom d'utilisateur et "123456" comme mot de passe (en passant, ne jamais utiliser ce mot de passe) se convertira à la commande suivante:
SELECT * FROM users WHERE username='john' AND password='123456'
mais si l'utilisateur décide d'essayer autre chose, comme les suivants:
SELECT * FROM users WHERE username='john' OR 1=1; -- ' AND password='123456'
Il s'agit de l'une des formes les plus faciles d'injection SQL. Avec un peu plus d'efforts, le même utilisateur peut insérer un nouveau compte utilisateur, ainsi que supprimer ou modifier un compte utilisateur existant. Dans la page où les résultats sont affichés, le même schéma peut être utilisé pour afficher des enregistrements et des informations qui étaient à l'origine limités à la vue par les visiteurs ordinaires, ou pour modifier le contenu des enregistrements.
Dans les cas plus graves, un attaquant peut même détruire complètement le système d'exploitation du serveur s'il est connecté au serveur de base de données via un compte administrateur (tel que "root" dans MySQL ou "SA" dans MS SQL Server). Sur un serveur Windows, cela peut se manifester en tant qu'attaquant effectuant une procédure stockée étendue, telle que XP_CMDShell. Dans un cas, un attaquant a exploité la vulnérabilité d'injection SQL pour créer des comptes d'utilisateurs sur un serveur infecté, activer les fonctionnalités de bureau à distance, configurer des dossiers partagés SMB et télécharger des logiciels malveillants - en fait en fait tout gâcher tout stocké dans la base de données.
Comment vous protéger des attaques d'injection SQL
Étant donné que le canal d'entrée utilisateur est le principal moyen des attaques d'injection SQL, la plupart des défenses impliquent le contrôle et la censure de l'entrée des utilisateurs pour les modèles d'attaque.Voici quelques mesures qui peuvent garantir la sécurité de la saisie des utilisateurs.
Ne faites pas confiance à l'entrée de l'utilisateur
juste parce que l'interface utilisateur du navigateur ne permet pas aux utilisateurs de fonctionner les entrées, cela ne signifie pas qu'il ne peut pas être falsifié. Des outils simples tels que Burp Suite permettent aux utilisateurs de capturer les demandes HTTP et de modifier quoi que ce soit, y compris les valeurs de formulaire cachées, avant de les soumettre au serveur. Si vous pensez que vous êtes assez intelligent pour coder les données via Base64, les utilisateurs malveillants peuvent facilement décoder, les modifier et les recoder.
La vérification est le processus de garantie que l'utilisateur fournit le type d'entrée correct et élimine toutes les commandes potentiellement malveillantes qui peuvent être intégrées dans la chaîne d'entrée. Par exemple, dans PHP, vous pouvez utiliser mysql_real_escape_string () pour échapper aux caractères qui peuvent changer la nature des commandes SQL.
La version modifiée du code de connexion mentionné ci-dessus est la suivante:
$sql_command = "select * from users where username = '" . $_POST['username']; $sql_command .= "' AND password = '" . $_POST['password'] . "'";
Cette modification simple protégera votre code contre les attaques en ajoutant des caractères d'échappement () devant des citations uniques délibérément ajoutées par les utilisateurs malveillants.
Une petite note sur la validation: si vous ajoutez une fonction de vérification du client, il fait un excellent travail. Mais ne comptez pas sur cela en tant que défense contre les attaques d'injection SQL. Bien que les fonctions du client puissent rendre l'envoi de l'entrée malveillante à votre serveur plus dur, il est facile de contourner avec certains ajustements et outils de navigateur comme ceux susmentionnés. Vous devez donc le compléter avec une vérification côté serveur.
Certaines plates-formes de programmation (telles que ASP.NET) incluent des fonctionnalités intégrées qui évaluent automatiquement l'entrée des utilisateurs pour le contenu malveillant lorsque la page Postback. Mais les pirates peuvent les contourner avec suffisamment de compétences et de méticuleurs, vous devez donc exécuter la saisie des utilisateurs via votre propre vérificateur de sécurité. Vous ne serez jamais trop prudent.
Une meilleure alternative que Escape est d'utiliser les paramètres de commande. Les paramètres de commande sont définis en ajoutant des noms d'espaceurs dans les commandes SQL, qui seront remplacés plus tard par l'entrée utilisateur. ASP.NET fournit à cet effet un ensemble d'API très intuitif et facile à utiliser.
Ce qui suit est le code écrit en C # montrant comment utiliser les paramètres de commande pour protéger votre site Web des attaques d'injection SQL:
SELECT * FROM users WHERE username='john' AND password='123456'
Vous créez d'abord un objet SQLCommand et utilisez le paradigm @paramètre_name dans la chaîne de commande, dans laquelle l'entrée utilisateur doit être insérée.
Ensuite, vous créez une instance de l'objet SQLParameter, en insérant la saisie de l'utilisateur, au lieu de le concaténer directement avec la chaîne de commande.
Enfin, vous ajoutez l'objet SQLParameter à la collection de paramètres de l'objet SQLCommand, qui remplacera les paramètres par l'entrée fournie. ADO.NET est responsable du reste des travaux.
Dans PHP, l'équivalent est une instruction de prétraitement, qui est plus complexe que son homologue ASP.NET. Vous pouvez l'explorer ici.
Cette astuce fonctionne pour des langages de type faible comme PHP, ce qui signifie que vous ne définissez généralement pas les types de données pour les variables, et le langage gère automatiquement les conversions de différents types de données les uns des autres.
La conversion explicative peut être utilisée comme raccourci pour échapper à la saisie lorsque les types de cordes sont impliqués. Donc, si vous souhaitez que l'utilisateur entre un INT pour le paramètre d'âge, vous pouvez utiliser le code suivant en PHP pour vous assurer que l'entrée est sûre:
SELECT * FROM users WHERE username='john' OR 1=1; -- ' AND password='123456'
Notez que cet extrait de code ne vérifie que le type d'entrée, pas sa plage. Vous devez donc exécuter un autre code pour vous assurer que l'utilisateur n'entre pas un âge négatif ou un âge irréaliste, comme 1300.
De plus, une autre meilleure pratique consiste à éviter d'utiliser des devis uniques dans des commandes SQL impliquant une entrée non corporelle. Alors, n'utilisez pas le code suivant ...
$sql_command = "select * from users where username = '" . $_POST['username']; $sql_command .= "' AND password = '" . $_POST['password'] . "'";
… il sera plus sûr d'utiliser le code suivant:
SELECT * FROM users WHERE username='john' AND password='123456'
Comment éradiquer les vulnérabilités d'injection SQL
En tant que pratique générale, vous devez vérifier le code pour chaque page pour voir où vous combinez le contenu de la page, les commandes, les chaînes, etc. avec des sources qui peuvent provenir de l'utilisateur. La vérification de votre code source pour les vulnérabilités et les vulnérabilités de sécurité devrait être une partie inhérente du processus de développement logiciel.
Vous pouvez également utiliser des outils de numérisation tels que SQLMAP pour explorer les pages du site Web et trouver des vulnérabilités potentielles d'injection SQL. En fait, les pirates utilisent souvent cet outil pour trouver et tirer parti des vecteurs d'attaque d'injection SQL sur les sites Web cibles, alors pourquoi ne pas l'utiliser pour améliorer sa sécurité?
Votre dernière ligne de défense
Peu importe comment vous renforcez la sécurité de votre site Web, vous devez être préparé pour le jour où l'injection SQL se produit. Après tout, comme cela est bien connu dans l'industrie de la cybersécurité, les défenseurs doivent gagner chaque bataille, mais les pirates n'ont besoin de gagner qu'une seule fois.
Voici quelques conseils pour vous aider à minimiser les dommages lorsque vous devenez victime de l'injection SQL.
Connecter votre application Web à un serveur de base de données à l'aide d'un compte "root" ou "SA" est l'une des erreurs les plus graves que vous puissiez commettre. Comme je l'ai déjà mentionné, un compte administrateur compromis peut donner aux pirates accès à l'ensemble du système. Même les comptes non admings peuvent causer des dommages, ce qui peut accéder à toutes les bases de données du serveur, surtout si le serveur de bases de données est partagé entre différentes applications et bases de données.
Par conséquent, il est préférable d'utiliser un compte qui a des autorisations de lecture et d'écriture simples sur une base de données spécifique située sur le backend du site Web, donc si votre site Web est piraté via l'injection SQL, la portée des dommages sera limitée à cela base de données unique dans la gamme.
Une approche plus avancée consiste à utiliser des connexions distinctes pour les segments de code qui lisent ou écrivent dans la base de données et réduisent davantage les autorisations et les rôles de chaque segment. Par exemple, une page de liste (sans modifier la base de données, mais largement à l'aide de paramètres de recherche) peut être codée à l'aide de connexions en lecture seule à la base de données pour améliorer davantage la résistance aux défauts du code.
Dans MySQL, la sécurité est améliorée en limitant l'accès aux comptes d'utilisateurs à une plage d'adresses IP spécifique (plutôt qu'au modèle "%") pour éviter l'accès aux comptes endommagés des emplacements distants.
Dans MS SQL Server, je vous recommande fortement d'utiliser le modèle d'authentification Windows, qui limitera l'accès des pirates à la base de données et que vous ne pouvez pas utiliser d'autres canaux pour entrer votre base de données.
De plus, à moins que vous ne prévoyiez d'utiliser certaines fonctionnalités avancées de SQL Server, il est préférable de configurer les services Windows pour utiliser un compte restreint plutôt qu'un compte "Système local" à prix élevé. Si le compte «SA» est rompu, cela minimisera les dommages.
crypter les données sensibles dans la base de données. Cela comprend les mots de passe, les questions et réponses de sécurité, les données financières, les informations sur la santé et d'autres informations qui peuvent être utiles aux acteurs malveillants. Cela garantira que même si les pirates ont vos données en main, ils ne peuvent pas les exploiter immédiatement, ce qui vous donne le temps de découvrir les vulnérabilités, de brancher les vulnérabilités et de prendre d'autres réactions, telles que la réinitialisation du mot de passe forcé, ce qui garantira que les données volées est attaqué, la personne perd sa valeur avant de déchiffrer.
Si vous hachez votre mot de passe, utilisez des algorithmes solides comme SHA-2, qui deviendra bientôt la norme de l'industrie pour la protection des mots de passe. MD5 et SHA-1 sont obsolètes et peuvent être inversés.
Pour d'autres formes de cryptage, veuillez faire attention à l'emplacement où vous stockez vos clés et ne prenez pas un seul pari. Si les touches sont juste à côté des données cryptées et que le pirate y accédera facilement une fois le serveur compromis, il est inutile d'utiliser le cryptage.
Chaque fois que vous stockez des informations dans une base de données, réfléchissez à la quantité de dégâts que cela causera si les informations tombent entre les mains d'une mauvaise personne et décidez si vous avez vraiment besoin de les stocker. Le hacker d'Ashley Madison a divulgué les secrets sombres et la plupart des informations privées d'environ 37 millions de personnes sur Internet et ont causé de graves dégâts, en partie en raison de l'échec du fournisseur à supprimer des informations sensibles de sa base de données.
Donc, l'essentiel est, ne stockez pas d'informations sensibles dans la base de données, sauf si vous devez vraiment le faire. Même alors, supprimez le message lorsqu'il n'est plus utile.
Réflexions finales
L'injection SQL existe depuis des décennies et pourrait continuer à dépasser le classement des vulnérabilité dans les années à venir. Il ne faut que quelques étapes simples - mais soigneusement calculées - pour vous protéger, vous et vos utilisateurs, et cela devrait être l'une de vos principales priorités lors de l'examen du code source pour les violations de sécurité.
La clé pour éviter d'être victime de la prochaine violation de données d'injection SQL est: Premièrement, contrôler et vérifier l'entrée de l'utilisateur;
FAQ sur la protection de votre site Web contre les attaques d'injection SQL
La première étape pour protéger votre site Web contre les attaques d'injection SQL est de comprendre ce qu'est l'injection SQL. L'injection SQL est une technique d'injection de code que les attaquants utilisent pour insérer des instructions SQL malveillantes dans des champs d'entrée pour l'exécution. Cela peut entraîner un accès non autorisé aux données sensibles, à la perte de données et même à la corruption des données. Une fois que vous comprenez cela, vous pouvez implémenter des mesures telles que la validation des entrées, les requêtes paramétrées et l'utilisation de procédures stockées pour protéger votre site Web.
La vérification d'entrée est une méthode pour définir la syntaxe, le contenu et les valeurs logiques de l'entrée utilisateur. Ce faisant, vous pouvez empêcher les attaquants d'insérer du code SQL malveillant dans le champ de saisie du site Web. En effet, le processus de vérification des entrées rejettera toute entrée qui ne répond pas aux critères définis.
La requête paramétrée est un type de requête SQL où un espace réservé est utilisé pour représenter la valeur, et la valeur elle-même est fournie au moment de l'exécution. Cela signifie que même si un attaquant essaie d'insérer du code SQL malveillant, il sera traité comme une chaîne littérale, plutôt que comme une partie de la commande SQL. Cela empêche efficacement les attaques d'injection SQL.
Les procédures stockées sont des instructions SQL stockées dans une base de données et peuvent être appelées par une application. Ils peuvent aider à prévenir les attaques d'injection SQL, car ils ne permettent pas l'accès direct à la base de données. Au lieu de cela, ils utilisent des paramètres qui ne sont pas exécutés sous forme de commandes SQL, empêchant ainsi tout code SQL injecté d'être exécuté.
La gestion des erreurs correcte peut aider à prévenir les attaques d'injection SQL en ne révélant aucune information sur la structure de la base de données ou la syntaxe SQL. En effet, lorsqu'une erreur se produit, le message d'erreur peut fournir à un attaquant des indices sur la structure de la base de données ou la syntaxe SQL qu'ils peuvent ensuite utiliser pour améliorer leur attaque.
Le principe d'autorisation minimum signifie uniquement fournir des comptes d'utilisateurs ou des processus avec les autorisations nécessaires pour remplir leurs fonctions prévues. Par exemple, si un compte utilisateur n'a besoin que de lire les données de la base de données, il n'a pas besoin de lui accorder un accès en écriture. Cela peut aider à prévenir les attaques d'injection SQL en limitant ce que les attaquants peuvent faire lorsqu'ils essaient d'exploiter la vulnérabilité.
Les mises à jour régulières sont importantes pour prévenir les attaques d'injection SQL, car elles contiennent généralement des correctifs pour des vulnérabilités connues. En gardant votre logiciel à jour, vous pouvez vous assurer que vous êtes protégé des vulnérabilités connues qui peuvent être exploitées par des attaques d'injection SQL.
Le pare-feu d'application Web (WAF) peut aider à protéger votre site Web contre les attaques d'injection SQL en filtrant et en surveillant le trafic HTTP entre les applications Web et Internet. Il peut identifier et bloquer les attaques d'injection SQL en détectant le code SQL malveillant dans les demandes HTTP.
Le système de détection d'intrusion (IDS) peut aider à prévenir les attaques d'injection SQL en surveillant le trafic du réseau et en détectant une activité suspecte. Si IDS détecte une attaque potentielle d'injection SQL, il peut alerter les administrateurs de prendre même des mesures pour empêcher l'attaque.
Le cryptage peut aider à protéger votre site Web contre les attaques d'injection SQL en rendant plus difficile pour les attaquants de lire des données sensibles. Même si un attaquant parvient à exploiter la vulnérabilité de l'injection SQL, il doit toujours décrypter les données pour les utiliser.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!