L'injection SQL est-elle un risque aujourd'hui?
j'ai lu sur les attaques par injection SQL et comment les éviter, bien que je ne puisse jamais sembler faire les exemples" horribles "donnés travail, par exemple voir ce post .
j'ai créé un fichier PHP et une table dans la base de données, j'ai passé une valeur par $_GET
et j'ai essayé de supprimer la table en faisant bob'); drop table students; --
et ça n'a pas marché. PHP échappe automatiquement au '
et la requête a une erreur, aucun mal faire. Même problème en essayant de répliquer login "attaques" comme AND WHERE 1=1
etc.
exemple de code:
<?php
$id = $_GET['id'];
$sql = "INSERT INTO Users (Username) VALUES ($id)";
echo $sql;
mysql_query($sql) or die(mysql_error());
et je passerais sql.php?id=1); delete from Users; --
est-ce que c'est quelque chose de dépassé qui s'appliquait aux jours de PHP3 ou quelque chose, et de nos jours même les novices sont protégés des choses comme les citations magiques?
j'utilise PHP5 sur Ubuntu.
20 réponses
bien au contraire. les guillemets magiques sont dépréciés dans PHP5 et seront complètement supprimés dans PHP 5.4 , car ils ont apporté plus de confusion dans le monde de la programmation qu'ils n'ont fait de bien. Vérifier si les guillemets magiques sont actifs, et échapper à N'importe quelle entrée SQL scrupuleusement si nécessaire, est encore très, très important... Aucune raison de se sentir mal cependant, nous avons tous été là, et mon cul inconnu a été sauvé par des citations magiques innombrables fois:)
Le manuel PHP sur magic quotes explique tout.
Non c'est encore très pertinent.
comme XSS et CSRF. Ne sous-estimez jamais l'importance d'un filtrage adéquat des entrées.
Heh, vous êtes sauvé dans ce cas en ayant magic_quotes_gpc
mis à "on".
le plus grand vol d'identité de l'histoire a été réalisé en 2007 en exploitant une vulnérabilité D'injection SQL: voir " les attaques par injection SQL ont mené à Heartland, Hannaford breaches " (ComputerWorld, 8/18/2009).
OWASP , a rapporté en 2007 que les attaques par injection (dont l'injection SQL est un exemple) continuent à être l'un des les logiciels les plus courants des problèmes de sécurité.
, Vous pouvez aussi rechercher récemment SQL injection News et trouver de nombreux cas signalés chaque mois.
cependant, l'exemple de la caricature XKCD n'est pas nécessairement le type d'exploit le plus courant. Laisser tomber une table en exécutant une seconde instruction SQL dans une requête n'apporterait probablement pas grand chose à l'attaquant sous forme de données précieuses, ce serait juste du vandalisme.
en outre, certaines interfaces de requête ne permettent pas multi-requête par défaut de toute façon. C'est-à-dire que l'API du client de base de données n'exécute qu'une seule instruction à partir de la chaîne SQL, indépendamment du point-virgule. Cela va à l'encontre de l'exemple montré dans la caricature.
note: la méthode de L'AOP query()
est connue sous le nom de support multi-query par défaut. Donc, il est sensible à l'attaque de style XKCD.
comme d'autres personnes ont souligné hors, le risque le plus probable est qu'une injection SQL modifie la logique des expressions SQL, et applique votre requête à des lignes supplémentaires en plus de celles que vous aviez prévues.
par exemple:
$sql = "UPDATE Users SET PASSWORD = MD5('" . $_POST["password"] . "'||salt) " .
"WHERE user_id = " . $_POST["userid"];
que se passe-t-il lorsque j'envoie une requête avec le paramètre userid
défini à la chaîne 123 OR userid=456
? Je réinitialiserais mon propre mot de passe (userid 123) ainsi que le mot de passe de l'userid 456. Même Hasher le mot de passe avec un sel par utilisateur ne protégerait pas contre cela. Maintenant je peux me connecter en compte.
il y a beaucoup de façons D'effectuer L'injection SQL.
ne tiennent pas compte de l'encodage des caractères, et sont donc vulnérables aux attaques basées sur les caractères multi-octets .
quant au risque qu'il représente aujourd'hui, les recherches Google font apparaître d'innombrables sites vulnérables. Une vulnérabilité D'Injection SQL a été signalée pour Bugzilla vers le 10 septembre. Donc, oui, les sites sont toujours à risque. Devraient-ils être? Les outils sont là pour empêcher l'injection, donc non.
cette attaque particulière ne fonctionne pas, mysql_query n'exécutera qu'une seule instruction.
je peux toujours abuser de votre code cependant, par exemple si je me suis arrangé pour que l'id soit SELECT password FROM Users WHERE Username='admin'
je pourrais avoir une chance de combat d'être en mesure d'obtenir votre système pour exposer certaines informations internes.
fondamentalement, si vous autorisez l'entrée non filtrée dans votre SQL, il y aura des moyens très créatifs de créer des données que vous ne vous attendiez pas, et d'exposer les données vous n'ai pas l'intention!
Oh my.. L'Injection SQL n'est pas un risque, c'est un trou de sécurité Béant . Il existe principalement en php parce que L'API vous donne envie d'interpoler de vieilles données dans vos requêtes SQL.
quand je vois un site écrit en PHP ou ASP, je peux juste sentir les vecteurs D'injection SQL dont ils puent. Les gens essaient de sécuriser leurs applications PHP avec mysql_real_escape_string()
et intval()
et font de même dans d'autres langues. C'est une erreur. C'est comme coder en C au lieu de Java ou Python, où, dans l'ancien, vous faites une erreur et vous êtes mort, mais dans le second, seulement sémantique défauts peuvent exister.
je presse fortement les gens d'utiliser soit mysqli avec des déclarations préparées, ou n'importe quoi d'autre qui est paramétré , en remplaçant le texte dans le code et en l'interprétant est juste mauvaise pratique en premier lieu IMHO.
sur une autre note, les citations magiques de PHP est juste stupide, et heureusement, déconseillé. Elle ne peut que faire plus de mal que de bien. Si vous comptez sur magic quotes, cela signifie que votre application sera propriétaire lorsque magic quotes est désactivé. De même, il peut casser d'autres applications qui ne s'attendent pas à des chaînes échappées dans les entrées.
c'est un risque très actif, magic quotes essaie de vous donner une solution mais je préfère toujours développer avec magic quotes off. De cette façon, je dois m'assurer d'échapper aux entrées moi-même. Qui sait si magic quotes sera activé ou désactivé sur le serveur où le script est réellement déployé.
C'est encore un gros problème. Vous ne pouvez pas supposer que magic_quotes est activé dans chaque installation PHP que vous pourriez utiliser.
pour voir si magic qotes est allumé et de nettoyer le gâchis de citations magiques:
if ( get_magic_quotes_gpc() !== 0 ) { $foo = stripslashes( $foo ); }
alors nettoyez un peu vos déclarations:
$foo = mysql_real_escape_string( $foo );
$sql = "select * from foo where bar='{$foo}'";
etc.
en fait, il vaut mieux tourner strictement magic_quotes
si vous avez la capacité de le faire.
j'espère que ça vous aidera.
l'exemple bobby tables ne fonctionnera pas avec l'interface mysql car elle ne fait pas de requêtes multiples dans un appel. L'interface mysqli est vulnérable à l'attaque de requête multiple. L'interface mysql est plus vulnérable à l'attaque privilège boost:
dans votre compte formulaire I tapez: admin
mot de passe: ' or 1=1 --
de sorte que votre sql de connexion typique: select * from users where user_name = '$admin' and password = '$password'
. La salle d'opération fait en sorte que ce soit vrai et vous permet de vous connecter.
est-ce que PHP ne peut pas faire des paramètres de requête? S'il le peut (comme je serais surpris s'il ne le faisait pas), c'est la seule solution qui atténue toutes les attaques par injection SQL.
comme je l'ai mentionné plusieurs fois sur stackoverflow avant, je suis un fervent partisan de L'AOP, juste arrêter d'utiliser le mysql démodé, faire vous-même et vos clients une grande faveur et apprendre AOP (c'est vraiment facile) et de profiter des déclarations préparées et les paramètres liés. Même si vous n'avez pas besoin de déclarations préparées performance sage, vous obtenez toujours les avantages de sécurité.
aussi, je recommanderai de planter votre application entière dans les clients faites face si magic quotes est mis à on. C'est juste un drain sur les ressources conçues pour protéger les muets et ennuyer les intelligents. (il utilise plus de cpu que d'échapper manuellement, parce qu'il Code tout, même si vous n'en avez pas besoin)
il existe de nombreuses façons d'effectuer une Injection SQL et de nombreuses façons de contourner les précautions de sécurité de base.
ces attaques ont été dans le top 10 des vulnérabilités des applications web (rang #2) selon OWASP.
pour de plus amples renseignements, veuillez consulter Top 10 2007-Injection Flaws .
Non, et moins vous vous inquiétez de L'Injection SQL, plus vous êtes susceptible d'être frappé par elle.
paramètres passés aux requêtes sql à partir des pages web ofen ont tendance à être IDs numériques. Par exemple, supposons que vous avez une url http://foo.com/page.php?section=34 dont l'ID de section est utilisé dans une requête comme celle-ci:
SELECT content FROM sections WHERE section_id=$section;
pas de guillemets pour s'échapper comme dans votre exemple et tout ce que vous mettrez après le numéro dans L'URL sera passé à la requête... Donc le risque est réel.
la règle empirique la plus simple est de supposer que tout utilisateur input
peut être contaminé. Vérifiez que les types de données sont ce que vous attendez, les variables sont dans les intervalles de longueur/taille que vous attendiez, les fichiers sont de la taille et les types que vous autorisez, etc. D'autres contrôles sur les données non externes peuvent être justifiés- avant d'appeler une fonction importante au niveau de l'administrateur, Faites un check - ($userlevel != ADMIN)?die():important_function();
il y a toujours un plus gros poisson, ou quelqu'un qui est un plus gros crétin que vous. Éviter les hypothèses sur les données et vous avez une longueur d'avance.
chaque fois que vous construisez SQL à partir de cordes, L'injection SQL est un réel danger.
j'ai également découvert que tenter d'éviter de construire des SQL à partir de cordes est un effort inutile. Tôt ou tard, la forme complète de votre SQL (pas seulement les choses qui pourraient être des paramètres) doit être générée à l'exécution.
je dois développer pour un serveur qui n'a aucun moyen pour moi de désactiver magic_quotes! Je l'inclus sur chaque page pour défaire les effets de citations magiques, de sorte que je peux faire bon m'échapper sans \'double échapper\'. Même si je sens le vomi juste en lisant ceci, je n'ai pas trouvé de meilleure solution.
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
Que par OWASP 2017 Top 10 , toujours d'Injection est le plus qui s'est passé et dangereux en attaque.
" L'injection SQL est toujours le risque numéro un. C'est le reflet du nombre d'incidents qui se produisent là-bas, ainsi que d'autres facteurs qui le maintiennent très haut" Troy Hunt-fondateur de breach site haveibeenpwned.com
juste pour se rappeler, en utilisant L'injection SQL nous pouvons vider la base de données entière, contrôle du serveur web par téléchargement de l'interpréteur de commandes web, etc.