Méthodes d'injection SQL courantes
Injection SQL pour la sécurité WEB
Introduction :
Lors du développement d'un site Web, pour des raisons de sécurité, il est nécessaire de filtrer les caractères passés depuis la page. Habituellement, les utilisateurs peuvent appeler le contenu de la base de données via les interfaces suivantes : barre d'adresse URL, interface de connexion, forum de messages, champ de recherche, etc. Cela laisse souvent des opportunités dont les pirates peuvent profiter. Au pire, les données peuvent être divulguées et, au pire, le serveur peut être arrêté.
1. Étapes d'injection SQL
a) Trouver le point d'injection et construire une instruction spéciale
Les paramètres contrôlables de l'instruction SQL entrante sont divisés en deux catégories
1. Pour les types numériques, les paramètres n'ont pas besoin d'être mis entre guillemets, tels que ?id=1
2. Pour les autres types, les paramètres doivent être mis entre guillemets, tels que ?name. ="phone"
b) L'utilisateur construit une instruction SQL (telle que : 'or 1=1#;admin'# (cette injection est également appelée mot de passe universel de PHP, qui peut contourner la saisie du mot de passe lorsque le le nom d'utilisateur est connu). Je l'expliquerai plus tard)
c) Envoyer l'instruction SQL à la base de données du SGBD
d) Le SGBD reçoit le résultat renvoyé, interprète la requête en instructions de code machine, et effectue les opérations nécessaires
e) SGBD Accepter le résultat renvoyé, le traiter et le renvoyer à l'utilisateur
Étant donné que l'utilisateur construit une instruction SQL spéciale, des résultats spéciaux doivent être renvoyés (comme tant que votre instruction SQL est suffisamment flexible)
Ci-dessous, je passe un exemple pour démontrer l'injection SQL en détail
2. Explication détaillée des exemples d'injection SQL (les tests ci-dessus supposent que magic_quote_gpc n'est pas activé sur le serveur)
1) Préparatifs préliminaires
Démontrons d'abord la vulnérabilité d'injection SQL, connectez-vous à l'interface de l'administrateur backend
Tout d'abord, créez une table de données pour les tests :
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(64) NOT NULL, `password` varchar(64) NOT NULL, `email` varchar(64) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
Ajouter un enregistrement pour tester :
INSERT INTO users (username,password,email)VALUES('MarcoFly',md5('test'),'marcofly@test.com');
Ensuite, collez le login Le code source de l'interface
<html> <head> <title>Sql注入演示</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <form action="validate.php" method="post"> <fieldset> <legend>Sql注入演示</legend> <table> <tbody> <tr> <td>用户名:</td> <td><input type="text" name="username" /></td> </tr> <tr> <td>密 码:</td> <td><input type="text" name="password" /></td> </tr> <tr> <td><input type="submit" value="提交" /></td> <td><input type="reset" value="重置" /></td> </tr> </tbody> </table> </fieldset> </form> </body> </html>
Ci-joint le rendu :
Lorsque l'utilisateur clique sur le bouton Soumettre, les données du formulaire seront soumises à la page validate.php, la page validate.php est utilisée pour déterminer si le nom d'utilisateur et le mot de passe saisis par l'utilisateur répondent aux exigences (ce est très importante, et c'est souvent là que se trouvent les vulnérabilités SQL)
! <!--前台和后台对接--> <html> <head> <title>登录验证</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body> <?php $conn=@mysql_connect("localhost",'root','') or die("数据库连接失败!");; mysql_select_db("injection",$conn) or die("您要选择的数据库不存在"); $name=$_POST['username']; $pwd=$_POST['password']; $sql="select * from users where username='$name' and password='$pwd'"; $query=mysql_query($sql); $arr=mysql_fetch_array($query); if(is_array($arr)){ header("Location:manager.php"); }else{ echo "您的用户名或密码输入有误,<a href=\"Login.php\">请重新登录!</a>"; } ?> </body> </html>
L'avez-vous remarqué ? Nous soumettrons directement l'utilisateur. Les données (nom d'utilisateur et mot de passe) sont directement exécutées, et le filtrage des caractères spéciaux ne l'est pas. mis en œuvre. Vous comprendrez plus tard que cela est fatal.
Analyse du code : si le nom d'utilisateur et le mot de passe correspondent avec succès, il passera à l'interface d'opération de l'administrateur (manager.php). En cas d'échec, un message d'invite convivial sera émis.
Interface pour une connexion réussie :
Invite en cas d'échec de connexion :
Jusqu'ici, le travail préliminaire a été fait. Bon, nous allons ensuite commencer notre point culminant : l'injection SQL
2) Construire l'instruction SQL
Après avoir rempli le nom d'utilisateur (marcofly) et le mot de passe (test) corrects, cliquez sur Soumettre, et il sera renvoyé vers notre interface "Bienvenue Administrateur".
Parce que le nom d'utilisateur et le mot de passe que nous avons soumis sont synthétisés dans l'instruction de requête SQL comme ceci :
select * from users where username='marcofly' and password=md5('test')
Évidemment, le nom d'utilisateur et le mot de passe sont les mêmes que ceux que nous avons donnés auparavant, vous le ferez je pourrai certainement me connecter avec succès. Mais que se passe-t-il si nous saisissons un mauvais nom d’utilisateur ou un mauvais mot de passe ? Évidemment, je ne peux absolument pas me connecter. Eh bien, c'est le cas dans des circonstances normales, mais pour les sites Web présentant des vulnérabilités d'injection SQL, tant qu'une "chaîne" spéciale est construite, vous pouvez toujours vous connecter avec succès.
Par exemple : saisissez : ' ou 1=1# dans la zone de saisie du nom d'utilisateur, saisissez le mot de passe comme vous le souhaitez, puis l'instruction de requête SQL synthétisée est :
select * from users where username='' or 1=1#' and password=md5('')
Analyse sémantique : "#" est un caractère de commentaire dans MySQL, donc le contenu après le signe dièse sera considéré comme un contenu de commentaire par MySQL, il ne sera donc pas exécuté. En d'autres termes, les deux instructions SQL suivantes. , etc. Valence :
select * from users where username='' or 1=1#' and password=md5('')
est équivalent à
select* from users where usrername='' or 1=1
car 1=1 est toujours vrai, c'est-à-dire que la clause Where est toujours vraie Après avoir simplifié davantage le SQL, etc. . Cela équivaut à l'instruction select suivante :
select * from users
Oui, la fonction de cette instruction sql est de récupérer tous les champs de la table des utilisateurs
Ce qui précède est une méthode de saisie, en voici une autre Méthode d'injection, cette méthode est également appelée mot de passe universel de PHP
Nous pouvons nous connecter sans mot de passe si nous connaissons déjà le nom d'utilisateur Supposons que le nom d'utilisateur soit : admin
Déclaration de construction. :
select * from users where username='admin'#' and password=md5('')
équivaut à
select * from users where username='admin'
, vous pouvez donc vous connecter sans saisir de mot de passe.
La base de données pensera à tort que vous pouvez vous connecter sans nom d'utilisateur, en contournant la vérification des antécédents et en atteignant l'objectif de l'injection.
exploite également des vulnérabilités dans la syntaxe SQL.
Vous voyez, une instruction SQL construite peut avoir un pouvoir destructeur si terrible. Je crois qu'après avoir vu cela, vous commencerez à avoir une compréhension rationnelle de l'injection SQL~
Oui, l'injection SQL est aussi simple que cela. Cependant, il n’est pas si simple de construire des instructions SQL flexibles en fonction de la situation réelle. Une fois que vous avez acquis les bases, vous pouvez lentement explorer par vous-même.
Avez-vous déjà pensé à ce qui se passerait si les données soumises via la fenêtre de connexion en arrière-plan étaient filtrées par l'administrateur avec des caractères spéciaux ? Dans ce cas, notre nom d'utilisateur universel' ou 1=1# ne peut pas être utilisé. Mais cela ne signifie pas que nous n’avons aucune contre-mesure. Nous devons savoir qu’il existe plusieurs façons pour les utilisateurs d’interagir avec la base de données.
Recommandé : "Tutoriel mysql"
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!