Maison  >  Article  >  développement back-end  >  Explication complète des vulnérabilités PHP (5) - Attaque par injection SQL

Explication complète des vulnérabilités PHP (5) - Attaque par injection SQL

黄舟
黄舟original
2016-12-22 09:26:221974parcourir

L'attaque par injection SQL (SQL Injection) se produit lorsque l'attaquant soumet une instruction SQL soigneusement construite dans le formulaire et modifie l'instruction SQL d'origine. Si le programme Web ne vérifie pas les données soumises, cela provoquera une attaque par injection SQL.

Étapes générales des attaques par injection SQL :

1. L'attaquant visite un site présentant des vulnérabilités d'injection SQL et recherche le point d'injection

2. L'attaquant construit une instruction d'injection. et injecte l'instruction Combinée avec l'instruction SQL dans le programme pour générer une nouvelle instruction SQL

3. La nouvelle instruction SQL est soumise à la base de données pour traitement

4. Instruction SQL, provoquant une attaque par injection SQL

Explication complète des vulnérabilités PHP (5) - Attaque par injection SQL

Instance

Base de données

CREATE TABLE `postmessage` (  		
`id` int(11) NOT NULL auto_increment,  			
`subject` varchar(60) NOT NULL default ”,  				
`name` varchar(40) NOT NULL default ”,  					
`email` varchar(25) NOT NULL default ”,  						
`question` mediumtext NOT NULL,  							
`postdate` datetime NOT NULL default ’0000-00-00 00:00:00′,  								
PRIMARY KEY (`id`)  									
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT=’运用者的留言’ AUTO_INCREMENT=69 ;  										
	grant all privileges on ch3.* to ‘sectop’@localhost identified by ’123456′;  											
	//add.php 插入留言  												
	//list.php 留言列表  													
	//show.php 显示留言  													

														

Page http://www.netsos.com. cn/show.php? id=71 Il y a peut-être un point d'injection, testons

http://www.netsos.com.cn/show.php?id=71 et 1=1

Explication complète des vulnérabilités PHP (5) - Attaque par injection SQL

Explication complète des vulnérabilités PHP (5) - Attaque par injection SQL

L'enregistrement a été interrogé une fois, mais pas une seule fois. Jetons un coup d'œil au code source

//show.php. lignes 12-15

// Exécuter l'instruction de requête mysql

$query = "select * from postmessage où id = ".$_GET["id"];

$ result = mysql_query($query)

or die("Échec de l'exécution de l'instruction de requête ySQL :" . mysql_error());

Une fois l'identifiant du paramètre transmis, l'instruction SQL combinée avec la chaîne précédente est mise dans la base de données pour exécuter la requête

Soumettre et 1=1, l'instruction devient select * from postmessage où id = 71 et 1=1 Les valeurs avant et après de cette instruction. sont tous deux vrais, et le seront également après et. Renvoyez les données interrogées

Soumettre et 1=2, l'instruction devient select * from postmessage où id = 71 et 1=2 La première valeur de cette instruction. est vrai, la dernière valeur est fausse et la valeur suivante est fausse, et aucune donnée ne peut être interrogée

SQL normal La requête, après avoir parcouru l'instruction que nous avons construite, forme une attaque par injection SQL. Grâce à ce point d'injection, nous pouvons en outre obtenir des autorisations, telles que l'utilisation de l'union pour lire le mot de passe de gestion, lire les informations de la base de données ou utiliser le fichier load_file de MySQL, dans le fichier de sortie et d'autres fonctions pour pénétrer davantage.

Méthode de prévention

Paramètres entiers :

Utilisez la fonction intval pour convertir les données en entiers

Prototype de fonction

int intval(mixed var, int base)

var est la variable à convertir en entier

base, facultatif, est le numéro de base, la valeur par défaut est 10

Paramètres à virgule flottante :

Utilisez la fonction floatval ou doubleval pour convertir respectivement les paramètres à virgule flottante simple précision et double précision

Prototype de fonction

int floatval(mixed var)

var est à convertir La variable

int doubleval (var mixte)

var est la variable à convertir

Paramètre de caractère :

Utiliser la fonction addlashes pour convertir le guillemet simple " '" est converti en "'", le guillemet double """ est converti en """, la barre oblique inverse "" est convertie en "\", le caractère NULL plus la barre oblique inverse ""

Prototype de fonction

string addlashes (string str)

str est la chaîne à vérifier

Ensuite la vulnérabilité de code qui vient d'apparaître, on peut la patcher comme ça

// Exécuter l'instruction de requête MySQL

$query = "select * from postmessage où id = ".intval($_GET["id"]);

$result = mysql_query($query)

or die("Échec de l'exécution de l'instruction de requête ySQL :" . mysql_error());


S'il s'agit d'un caractère tapez, déterminez d'abord si magic_quotes_gpc peut être activé, alors qu'il ne l'est pas. Lorsque vous utilisez des barres obliques supplémentaires pour échapper aux caractères spéciaux





if(get_magic_quotes_gpc( ))
{
$var = $_GET ["var"];
}
else
{
$var = addlashes($_GET["var"]); 🎜> }




Testé à nouveau, la vulnérabilité a été corrigée

Ce qui précède est le contenu de la solution de vulnérabilité PHP (5) - Attaque par injection SQL Pour plus de contenu connexe, veuillez faire attention au site Web chinois PHP (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn