Maison > Article > développement back-end > Explication complète des vulnérabilités PHP (5) - Attaque par injection SQL
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
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
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"]); 🎜> }