Test de pénétration Python - Attaque Web SQLi
L'injection SQL est un ensemble de commandes SQL qui sont placées dans une chaîne d'URL ou dans des structures de données afin de récupérer une réponse que nous souhaitons à partir des bases de données connectées aux applications Web. Ce type d'attaque a généralement lieu sur des pages Web développées avec PHP ou ASP.NET.
Une attaque par injection SQL peut être effectuée avec les intentions suivantes -
Pour modifier le contenu des bases de données
Pour modifier le contenu des bases de données
Pour effectuer différentes requêtes qui ne sont pas autorisées par l'application
Ce type d'attaque fonctionne lorsque les applications ne valident pas correctement les entrées, avant de les passer à une instruction SQL. Les injections sont normalement placées dans des barres d'adresse, des champs de recherche ou des champs de données.
Le moyen le plus simple de détecter si une application Web est vulnérable à une attaque par injection SQL consiste à utiliser le caractère "'" dans une chaîne et à voir si vous obtenez une erreur.
Types d'attaque SQLi
Dans cette section, nous découvrirons les différents types d'attaques SQLi. L'attaque peut être classée dans les deux types suivants -
In-band SQL injection (Simple SQLi)
Injection SQL inférentielle (Blind SQLi)
In-band SQL injection (Simple SQLi)
C'est l'injection SQL la plus courante. Ce type d'injection SQL se produit principalement lorsqu'un attaquant est capable d'utiliser le même canal de communication pour à la fois lancer l'attaque et rassembler les résultats. Les injections SQL intrabande sont divisées en deux types -
Error-based SQL injection - Une technique d'injection SQL basée sur l'erreur repose sur un message d'erreur émis par le serveur de base de données pour obtenir des informations sur la structure de la base de données.
Union-based SQL injection - Il s'agit d'une autre technique d'injection SQL intrabande qui exploite l'opérateur SQL UNION pour combiner les résultats de deux ou plusieurs instructions SELECT en un seul résultat, qui est ensuite renvoyé dans le cadre de la réponse HTTP.
Injection SQL inférentielle (Blind SQLi)
Dans ce type d'attaque par injection SQL, l'attaquant n'est pas en mesure de voir le résultat d'une attaque en bande car aucune donnée n'est transférée via l'application Web. C'est la raison pour laquelle il est également appelé Blind SQLi. Les injections SQL inférentielles sont en outre de deux types -
Boolean-based blind SQLi - Ce type de technique repose sur l'envoi d'une requête SQL à la base de données, ce qui oblige l'application à renvoyer un résultat différent selon que la requête renvoie un résultat TRUE ou FALSE.
Time-based blind SQLi- Ce type de technique repose sur l'envoi d'une requête SQL à la base de données, ce qui oblige la base de données à attendre un laps de temps spécifié (en secondes) avant de répondre. Le temps de réponse indiquera à l'attaquant si le résultat de la requête est TRUE ou FALSE.
Exemple
Tous les types de SQLi peuvent être implémentés en manipulant les données d'entrée dans l'application. Dans les exemples suivants, nous écrivons un script Python pour injecter des vecteurs d'attaque dans l'application et analyser la sortie pour vérifier la possibilité de l'attaque. Ici, nous allons utiliser le module python nommémechanize, ce qui permet d'obtenir des formulaires Web dans une page Web et facilite également la soumission des valeurs d'entrée. Nous avons également utilisé ce module pour la validation côté client.
Le script Python suivant permet de soumettre des formulaires et d'analyser la réponse à l'aide de mechanize -
Tout d'abord, nous devons importer le mechanize module.
import mechanize
Maintenant, indiquez le nom de l'URL pour obtenir la réponse après avoir soumis le formulaire.
url = input("Enter the full url")
La ligne de codes suivante ouvrira l'url.
request = mechanize.Browser()
request.open(url)
Maintenant, nous devons sélectionner le formulaire.
request.select_form(nr = 0)
Ici, nous allons définir le nom de la colonne «id».
request["id"] = "1 OR 1 = 1"
Maintenant, nous devons soumettre le formulaire.
response = request.submit()
content = response.read()
print content
Le script ci-dessus imprimera la réponse à la requête POST. Nous avons soumis un vecteur d'attaque pour casser la requête SQL et imprimer toutes les données de la table au lieu d'une ligne. Tous les vecteurs d'attaque seront enregistrés dans un fichier texte, par exemple vecteurs.txt. Maintenant, le script Python donné ci-dessous récupérera ces vecteurs d'attaque du fichier et les enverra au serveur un par un. Il enregistrera également la sortie dans un fichier.
Pour commencer, importons le module mécaniser.
import mechanize
Maintenant, indiquez le nom de l'URL pour obtenir la réponse après avoir soumis le formulaire.
url = input("Enter the full url")
attack_no = 1
Nous devons lire les vecteurs d'attaque à partir du fichier.
With open (‘vectors.txt’) as v:
Maintenant, nous allons envoyer une demande avec chaque vecteur d'arack
For line in v:
browser.open(url)
browser.select_form(nr = 0)
browser[“id”] = line
res = browser.submit()
content = res.read()
Maintenant, la ligne de code suivante écrira la réponse dans le fichier de sortie.
output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1
En vérifiant et en analysant les réponses, nous pouvons identifier les attaques possibles. Par exemple, s'il fournit la réponse qui inclut la phraseYou have an error in your SQL syntax cela signifie que le formulaire peut être affecté par l'injection SQL.