12
votes

Injection SQL via MySQL_Query

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: xxx

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: xxx

pas de succès. Je suppose que l'insert n'a rien à faire ici.

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?

merci


5 commentaires

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 / Union 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.


7 Réponses :


-3
votes
$query = "SELECT * FROM mytable where name LIKE '%'; DROP TABLE mytable; -- %'";

3 commentaires

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



0
votes

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

L'autre affiche a déjà décrit comment faire une injection SQL afin que je ne vais pas entrer dans cela.


4 commentaires

"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.



1
votes

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.


1 commentaires

Aucun moyen de faire un insert direct ou une mise à jour?



3
votes

parce que mysql_query ne prend pas en charge plusieurs requêtes, donc toute injection qui fait comme '; Table de chute Mytable; - ne réussira pas.

Cependant, l'attaquant peut combiner avec une autre instruction SELECT pour sélectionner les autres informations telles que les informations de mot de passe.


0 commentaires

0
votes

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.


1 commentaires

Merci de vos efforts, la question était "Quels sont les moyens", pas "y a-t-il un moyen".



4
votes

Selon la version de MySQL que vous utilisez, et la configuration de la connexion, MySQL_Query peut autoriser plus d'une déclaration .

Vous devriez examiner comment la connexion est créée et pour toute utilisation de mysql_set_server_option .


0 commentaires

3
votes

intéressant que votre question n'a pas encore reçu de réponses (correctes)!

Comme vous l'avez découvert, des API PHP habituelles MySQL comme mysql_query , mysqli :: requête 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 .

Conseil de défenseur: bannir mysqli :: multi_query et amis de votre code; Les améliorations des performances des minutes ne valent pas le risque.

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é"] ? Pas assez. Comme Remarques Knittl , même une pure- DQL Sélectionnez peut être utilisé pour escalader ses privilèges par Union Tout sélectionnez '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.

de défenseur Conseil: Appliquer la défense- en profondeur avec des techniques connues:

  • Validation d'entrée
  • Indirection Whitelist dans un tableau associatif
  • Les déclarations préparées ( si vous pouvez vous assurer qu'elles sont efficaces et non seulement à la chaîne s'échapper dans le déguisement !)
  • un ORM
  • 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)
  • ou en dernier recours uniquement , chaîne s'échappant

    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 .

    Conseil de défenseur: toujours configurer secury_file_priv dans votre serveur MySQL / MARIADB.

    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.

    Defender Conseil: Sécurisez votre application en appliquant Pola .

    • Seulement Grant 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. 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.
    • automatisez des sauvegardes, même s'ils sont inutiles - restaure est ce qui compte < / a>.

0 commentaires