Hacking: exemple d'injection SQL dans un programme C ++

Injection de code se produit lorsque l'utilisateur attire votre programme C ++ pour exécuter un morceau de code créé par l'utilisateur. “ Quoi? Mon programme ne ferait jamais cela ”!; tu dis. Envisager le plus commun et, heureusement, plus facile à comprendre variante de cette petite escroquerie: injection SQL.

Voici quelques faits sur SQL:

  • SQL (souvent prononcé “ suite ”) signifie Structured Query Language.

  • SQL est le langage le plus commun pour l'accès aux bases de données.

  • SQL est presque universellement utilisé pour accéder à des bases de données relationnelles.

Si vous ne # 8242-t savent déjà SQL, il # 8242-s suffit de dire que SQL est souvent interprétée à l'exécution. Très souvent, les déclarations C ++ vont envoyer une requête SQL à un serveur de base de données distincte et ensuite traiter et d'afficher quel que soit le serveur renvoie. Une requête SQL typique dans un programme C ++ pourrait ressembler à ce qui suit:

char * query = "SELECT * FROM transactions OÙ accountID = # 8242 à 123.456.789 # 8242 -" les résultats = présenter (requête) -

Ce code dit, “SELECT tous les champs DE la table des transactions la identifiant de compte (sans doute l'un des champs de la table de transaction) est égal à 123 456 789 (l'utilisateur # 8242-s compte id) ”. La submit () fonction de bibliothèque peut envoyer cette requête large au serveur de base de données.

Le serveur de base de données serait de répondre à toutes les données dont il dispose sur chaque transaction que l'utilisateur a jamais fait sur ce compte, qui sont stockés dans la collection résultats. Le programme serait alors itérer résultats, figurent probablement les transactions dans un tableau avec chaque transaction sur une ligne distincte.




L'utilisateur probablement doesn # 8242-t besoin que beaucoup de données. Peut-être juste les transactions entre date de début et date de fin, deux variables que le programme lit à partir du 8242-s page Utilisateur # de requête. Ce programme plus sélectif C ++ peut contenir une déclaration comme celle-ci:

char * query = "SELECT * FROM transactions OÙ accountID = # 8242-123456789 # 8242-" "et la date> # 8242- "+ startDate +" # 8242- et la date lt; # 8242- "+ endDate +" # 8242 - "-

Si l'utilisateur entre 01/10/2013 pour un date de début et 01/11/2013 pour date de fin, alors la requête résultante qui est envoyé à la base de données est la suivante:

* SELECT de transactions OÙ accountID = # # 8242- 8242 à 123.456.789 ANDdate> # 8242-2013 / 10/1 # 8242- et la date lt; # 8242-2013 / 11/1 # 8242--

En d'autres termes, montrer toutes les transactions effectuées dans le mois d'Octobre 2013. Cela a du sens. Qu'est # 8242-s le problème?

Le problème se pose si le programme accepte simplement tout ce que l'utilisateur entre les dates de début et de fin et les bouchons dans la requête. Il doesn # 8242-t effectuer une vérification pour veiller à ce que l'utilisateur saisit simplement une date et rien que une date. Ce programme est beaucoup trop confiant.

Que faire si un pirate devait entrer 01/10/2013 pour le date de début, mais pour la date de fin il était d'entrer dans quelque chose comme 01/11/2013# 8242- OU accountID = # 8242 à 234.567.890. (Notez les guillemets simples déséquilibrés.) Maintenant, la requête SQL combinée qui est envoyé au serveur de base de données ressemblerait

* SELECT de transactions OÙ accountID = # # 8242- 8242 à 123.456.789 ANDdate> # 8242-2013 / 10/1 # 8242- et la date lt; # 8242-2013 / 11/1 # 8242- ORaccountID = # 8242-234567890 # 8242--

Ce dit, “ Montrez-moi toutes les transactions pour le compte 123456789 pour le mois d'Octobre 2013, ainsi que toutes les transactions pour un autre compte 234567890 que je don # 8242-t propre pour une date n ° 148.

Ce petit exemple peut soulever quelques questions: “ Comment le pirate ne savait qu'il pouvait saisir des instructions SQL à la place de dates ”?; Il doesn # 8242-t savoir - il essaie juste d'entrer SQL faux dans tous les domaines qui accepte du texte de caractère et voit ce qui se passe. Si le programme se plaint, “ # 8242 Ce-s pas une date légale, n ° 148; puis le pirate sait que le programme vérifie pour vous assurer que les dates d'entrée sont valides et injection SQL remporté # 8242-t travail ici.

Si, d'autre part, le programme affiche un message d'erreur comme Instruction SQL illégale, puis le pirate sait que le programme a accepté l'entrée faux et expédié le tout au serveur de base de données qui a ensuite donné le coup en arrière. Succès! Maintenant, tout ce qu'il a à faire est de formuler la requête juste.

Alors, comment ne savait le pirate que le compte a été appelé ID identifiant de compte? Il didn # 8242-t savent que soit, mais combien de temps faudrait-il pour deviner que celui-ci? Les pirates sont très persistants.

Enfin, comment ne le pirate sait que 234567890 était un numéro de compte valide? Encore une fois, il didn # 8242-T - mais pensez-vous vraiment que le pirate # 8242-s va arrêter là? Heck pas. Il # 8242-S va essayer toutes les combinaisons de chiffres qu'il peut penser jusqu'à ce qu'il trouve de très grands comptes avec de très gros soldes qui valent la peine voler.

Rappelez-vous trois choses:

  • Injection SQL était il ya des années très communs.

  • Il était juste cette simple.

  • Avec une meilleure connaissance de SQL et une syntaxe très tourmenté, un bon hacker peut faire à peu près tout ce qu'il veut avec une injection SQL comme ceci.


» » » » Hacking: exemple d'injection SQL dans un programme C ++