Je travaille sur un site piraté via l'injection SQL (à première vue que les entrées de DB ne sont corrompues avec des scripts croisés) la vulnérabilité potentielle que j'ai trouvée après avoir examiné le code est qu'il y a beaucoup d'appel MySQL_Query dont les intrants ne sont pas échappés du tout.
Le bon vieux: p> néanmoins je ne trouve pas comment pouvons-nous faire quelque chose de refroidir de cette vulnérabilité d'injection (par cool i signifie quelque chose comme un insert ou une mise à jour). J'ai essayé de construire une déclaration comme celle-ci: p> pas de succès. Je suppose que l'insert n'a rien à faire ici. P> J'échappe tous les entrées de l'utilisateur dans le code en ce moment, mais je n'ai pas vraiment de savoir comment les pirates ont pénétré sur ce site, alors je ne suis pas 100 % sûr que mon correctif fera le travail. Toutes suggestions brillantes? P> merci p> p>
7 Réponses :
$query = "SELECT * FROM mytable where name LIKE '%'; DROP TABLE mytable; -- %'";
Plus d'élaboration pourquoi c'est faux?
Ouais, regardez les commentaires ci-dessous Xbonez 'Réponse
mysql_query prend juste une requête, mais merci
Maintenant, cela fait longtemps que PHP, mais en général, la plupart des données de données ont une sorte de SQL paramétré pour réduire le risque. Un rapide Google est venu avec ceci pour PHP: http://php.net/manual/fr/pdo.prepared-statifs.php p>
L'autre affiche a déjà décrit comment faire une injection SQL afin que je ne vais pas entrer dans cela. P>
"Alors je ne suis sûr pas à 100% que mon correctif fera le travail. Toutes les suggestions brillantes?" - J'ai suggéré une solution alternative
Ce correctif de la même nature avec un utilisé. Mais l'OP a demandé la nature différente. Vous ne comprenez tout simplement pas la question
Imo c'est une grande différence entre une solution laminée à la maison vs a essayé et testé lib
Ce n'est vraiment pas ce que je demandais. Je prévois de faire de l'attache du correctif sale, je prends ce qui est en place et de le réparer. Je sais que la meilleure solution de zéro serait d'utiliser PDO.
Scénario possible 1
Les mots de passe / hachage faibles permettront à un attaquant de sélectionner le mot de passe de l'administrateur.
Il serait sage de changer tous les mots de passe des administrateurs. p>
Aucun moyen de faire un insert direct ou une mise à jour?
parce que Cependant, l'attaquant peut combiner avec une autre instruction SELECT pour sélectionner les autres informations telles que les informations de mot de passe. P> mysql_query code> ne prend pas en charge plusieurs requêtes, donc toute injection qui fait comme
'; Table de chute Mytable; - code> ne réussira pas. P>
Je suis à peu près sûr qu'un pirate informatique serait en mesure de modifier facilement la requête. Même si mysql_query () ne prend pas en charge plusieurs requêtes, il existe des moyens. Vous pouvez simplement utiliser une instruction MySQL si une instruction ajoutée à la fin et bien sûr, qui exécutera une toute nouvelle requête. P>
Merci de vos efforts, la question était "Quels sont les moyens", pas "y a-t-il un moyen".
Selon la version de MySQL que vous utilisez, et la configuration de la connexion, MySQL_Query peut autoriser plus d'une déclaration . p>
Vous devriez examiner comment la connexion est créée et pour toute utilisation de mysql_set_server_option . p>
intéressant que votre question n'a pas encore reçu de réponses (correctes)! P>
Comme vous l'avez découvert, des API PHP habituelles MySQL comme mysql_query code>
, mysqli :: requête code>
etc. n'exécute que la première instruction SQL au cas où l'on leur passe plusieurs (séparés par des points-virgules), comme un attaquant utilisant La classe la plus courante d'injections SQL .
p>
Conseil de défenseur: strong> bannir mysqli :: multi_query code>
et amis de votre code; Les améliorations des performances des minutes ne valent pas le risque. P> blockQuote>Est-ce que ce mouvement intelligent de PHP-Folk ferme complètement tous les canaux d'attaque sur un code qui va comme
"Sélectionnez Yadda Yadda". $ _GET ["non approuvé"] code>? Pas assez. Comme Remarques Knittl , même une pure- DQL
Sélectionnez CODE> peut être utilisé pour escalader ses privilèges par
Union Tout sélectionnez code> 'Ing de n'importe quelle table intéressante à proximité, y compris mais non limité à la table des mots de passe. Il y a tricher les feuilles de triche offrant suffisamment de conseils et d'astuces extraire essentiellement la base de données entière de cette façon.
p>
de défenseur Conseil: strong> Appliquer la défense- en profondeur avec des techniques connues:
- Validation d'entrée LI>
- Indirection Whitelist dans un tableau associatif LI>
- Les déclarations préparées ( si em> vous pouvez vous assurer qu'elles sont efficaces et non seulement à la chaîne s'échapper dans le déguisement a >!) li>
- un ORM LI>
- codage de protection (par exemple base64) lorsque l'entrée non approuvée ne peut pas être désinfectée de manière satisfaisante (par exemple, un poste de blog pouvant légitimement contenir de la ponctuation sensible au SQL) li>
- ou en dernier recours uniquement , chaîne s'échappant li> ul> p> blockQuote>
Ensuite, on peut observer que tous les DQL ne sont pas libres de côté, en particulier lorsqu'il se termine par
dans SUPPFILE quelque chose code>
.
P>
Conseil de défenseur: strong> toujours configurer secury_file_priv code>
dans votre serveur MySQL / MARIADB. P> blockQuote>Dernier point mais non le moindre, même un attaquant qui est en mesure d'injecter SQL arbitraire est limité par l'autorité accordée à l'application Web dans son ensemble. P>
Defender Conseil: strong> Sécurisez votre application en appliquant Pola .
- Seulement
Grant CODE> L'utilisateur MySQL de l'application Web autant d'autorité qu'il en a besoin. Ce n'est pas une mauvaise idée de concevoir votre application afin qu'elle ne nécessite aucun DDL du tout. strong> Si vous devez fournir une fonctionnalité "sauvegarde / restaurer dB" ou une partie de l'interface utilisateur Web, utilisez un séparé MySQL utilisateur pour cela. LI>
automatisez des sauvegardes, strong> même s'ils sont inutiles - restaure est ce qui compte < / a>. li> ul> p> blockQuote>
Je suppose que ce site n'est pas le bon endroit pour demander comment faire cela :)
Assurez-vous que le «nom» lorsqu'il est concaténé avec les chaînes de base formes SQL valide.
Un attaquant pourrait facilement
rejoindre code> /
Union code> une autre table et obtenir des informations d'identification de connexion à admin. Ensuite, avec des privilèges élevés, il pourrait faire des choses plus mauvaises, par ex. Téléchargement d'une coquille PHP pour exécuter des commandes arbitraires sur le serveur
La réponse que vous recherchez est discutée dans ce poste de Stackoverflow: Stackoverflow.com/Questtions/60174/...
mysql_query () n'est plus. Laissez cette question reposer en paix.