web-dev-qa-db-fra.com

Comment tester les vulnérabilités d'injection SQL sur un site avec des champs d'entrée?

Quelles méthodes sont disponibles pour tester les vulnérabilités d'injection SQL?

48
John S

Il existe plusieurs façons de tester une application pour détecter des vulnérabilités telles que l'injection SQL. Les tests se décomposent en trois méthodologies différentes:

Injection aveugle:

Exemple MySQL:

http://localhost/test.php?id=sleep(30)

Si cette instruction SQL est interprétée par la base de données, le chargement de la page prendra 30 secondes.

Messages d'erreur:

http://localhost/test.php?id='"

Si le rapport d'erreurs est activé et que cette demande est vulnérable à l'injection SQL, l'erreur suivante sera produite:

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de "" à la ligne 5

Injection basée sur la tautologie :

http://localhost/test.php?username=' or 1=1 /*&password=1

Dans ce cas, fournir un tautologie , ou une déclaration qui est toujours vraie fournit un résultat prévisible. Dans ce cas, le résultat prévisible serait la connexion de l'attaquant avec le premier utilisateur de la base de données, qui est généralement l'administrateur.

Il existe des outils qui automatisent l'utilisation des méthodes ci-dessus pour détecter l'injection SQL dans une application Web. Il existe des outils gratuits et open source tels que Wapiti et Skipfish qui font cela. Sitewatch fournit un service gratuit bien meilleur que ces outils open source. Je peux le dire parce que je suis développeur pour Sitewatch.

52
rook

Il est préférable de ne pas tester votre site pour l'injection SQL. Il est préférable d'éviter simplement l'injection SQL potentielle. Ne jamais former de requêtes SQL en effectuant vous-même un traitement de chaîne lorsqu'il y a une entrée utilisateur. Utilisez paramètres liés dans toutes les requêtes (désinfectez également toutes les données utilisateur si elles peuvent être utilisées de manière nuisible et imposez des limites raisonnables aux requêtes). C'est-à-dire que la requête sql_execute("select user from user_db where id="+input_id) n'est pas sûre (imaginez si son input_id = "1 OR 1==1 --"), Mais stored_procedure = "select user from user_db where id = ? LIMIT 1;", sql_execute_with_param(stored_procedure, input_id); est sûre.

Évidemment, ce n'est que si vous essayez de sécuriser votre propre site. Si vous essayez de trouver des failles dans d'autres applications, c'est une autre histoire, et potentiellement contre le FAQ qui indique que ce site n'est pas pour les chapeaux noirs. Mais OWASP a un très bon article sur les tests pour - injection SQL .

13
dr jimbob

Si vous partez de zéro, je suggère l'une des options suivantes:

  1. Embaucher quelqu'un qui sait ce qu'il fait
  2. Utilisez un outil automatisé comme premier trou d'arrêt. Certaines options incluent Burp Pro, ZAP et SQL Map.

Gardez à l'esprit, cependant, que lorsque vous envoyez des entrées étranges et potentiellement dangereuses à une application Web, vous avez une chance importante de nuire à l'intégrité de votre application.

Vous pouvez carrément casser votre application Web, ou vous pouvez stocker des entrées étranges dans la base de données de l'application qui sont ensuite extraites et analysées plus tard d'une manière ou d'une autre - et peut-être même pas par votre application.

La règle générale pour ce type de test est simple: vous n'avez pas terminé les tests tant que vous n'avez pas restauré à partir d'une sauvegarde connue. Vous ne devez pas considérer votre application dans des conditions de fonctionnement normales après un test d'injection automatisé avant de l'avoir fait.

5
Daniel Miessler