Introduction
Bienvenue dans ce laboratoire sur l'interaction avec les applications web. Dans le domaine de la cybersécurité et de l'automatisation web, interagir avec des applications web par programmation est une compétence fondamentale. Que vous fassiez du scraping de données, des tests de vulnérabilité ou l'automatisation de tâches répétitives, vous avez besoin d'un moyen fiable pour envoyer et recevoir des requêtes HTTP.
Dans ce laboratoire, vous apprendrez à utiliser la puissante bibliothèque Python requests. Vous rédigerez des scripts pour envoyer des requêtes HTTP GET et POST, extraire des informations importantes des réponses du serveur, automatiser la soumission de formulaires et gérer les cookies de session pour maintenir un état d'authentification.
Comparé aux sockets bruts, requests fonctionne à un niveau d'abstraction plus élevé. Il gère pour vous de nombreux détails HTTP, tels que les en-têtes, l'encodage, les redirections et les cookies. Cela le rend idéal pour l'automatisation de la sécurité, où vous vous concentrez davantage sur le comportement web et les flux de travail que sur la mécanique paquet par paquet.
Envoyer des requêtes HTTP GET
Dans cette étape, vous apprendrez à envoyer une requête HTTP GET de base en utilisant Python. La méthode GET est utilisée pour demander des données à une ressource spécifiée, tout comme votre navigateur web demande une page web lorsque vous saisissez une URL.
Considérez cela comme la forme la plus simple d'automatisation web : demander une ressource et inspecter la réponse. De nombreuses tâches de reconnaissance, de test et de surveillance commencent exactement ici.
Tout d'abord, assurez-vous d'être dans votre répertoire de projet. C'est là que vous créerez tous vos scripts Python pour ce laboratoire.
cd ~/project
Maintenant, créons un script Python pour envoyer une requête GET à un serveur web local qui a été préparé pour vous. Utilisez l'éditeur de texte nano pour créer un fichier nommé get_request.py :
nano get_request.py
Saisissez le code Python suivant dans l'éditeur :
import requests
url = 'http://127.0.0.1:5000/get'
response = requests.get(url)
print("Response Body:")
print(response.text)
Enregistrez le fichier et quittez l'éditeur (dans nano, appuyez sur Ctrl+O, Entrée pour enregistrer, et Ctrl+X pour quitter).
Le code ci-dessus importe la bibliothèque requests, définit l'URL cible et utilise la fonction requests.get() pour envoyer la requête. La réponse du serveur est stockée dans la variable response, et nous affichons le texte brut du corps de la réponse.
Exécutez votre script en utilisant l'interpréteur Python :
python3 get_request.py
Vous devriez voir un résultat similaire à celui-ci :
Response Body:
{"message":"GET request successful"}
Extraire le statut HTTP et les en-têtes
Dans cette étape, vous apprendrez à extraire des informations plus détaillées d'une réponse HTTP, en particulier le code de statut et les en-têtes.
Le corps de la réponse n'est qu'une partie de l'histoire. Les codes de statut vous indiquent comment le serveur a compris la requête, et les en-têtes décrivent les métadonnées telles que le type de contenu, la politique de mise en cache, les cookies ou le logiciel serveur. Une bonne automatisation examine les trois couches : le code, les en-têtes et le corps.
Lorsqu'un serveur répond à une requête HTTP, il inclut un code de statut (comme 200 pour OK, ou 404 pour Not Found) et des en-têtes qui fournissent des métadonnées sur la réponse (comme le type de contenu ou le logiciel serveur).
Créez un nouveau fichier nommé check_status.py dans votre répertoire de projet :
nano check_status.py
Ajoutez le code suivant au fichier :
import requests
url = 'http://127.0.0.1:5000/get'
response = requests.get(url)
print(f"Status Code: {response.status_code}")
if response.status_code == 200:
print("The request was successful!")
print("\nResponse Headers:")
print(f"Content-Type: {response.headers.get('Content-Type')}")
print(f"Server: {response.headers.get('Server')}")
Enregistrez le fichier et quittez l'éditeur.
Dans ce script, response.status_code récupère le code de statut entier renvoyé par le serveur. response.headers est un objet de type dictionnaire contenant tous les en-têtes HTTP renvoyés par le serveur. Nous utilisons la méthode .get() pour extraire en toute sécurité des en-têtes spécifiques.
Exécutez le script pour voir les informations extraites :
python3 check_status.py
Votre résultat devrait ressembler à ceci :
Status Code: 200
The request was successful!
Response Headers:
Content-Type: application/json
Server: Werkzeug/3.0.1 Python/3.10.12
Automatiser la soumission de formulaires (POST)
Dans cette étape, vous apprendrez à envoyer une requête HTTP POST. Contrairement aux requêtes GET, qui sont utilisées pour récupérer des données, les requêtes POST sont utilisées pour envoyer des données au serveur. C'est couramment utilisé pour soumettre des formulaires web, comme des identifiants de connexion.
Cette distinction reflète la sémantique HTTP. En pratique, GET est généralement utilisé pour lire des ressources, tandis que POST est souvent utilisé pour des actions qui soumettent ou modifient un état. Comprendre cette différence vous aide à prédire comment les applications se comportent et comment vos scripts doivent interagir avec elles.
Nous allons écrire un script pour simuler la soumission d'un formulaire de connexion avec un nom d'utilisateur et un mot de passe.
Créez un nouveau fichier nommé post_request.py :
nano post_request.py
Saisissez le code suivant :
import requests
url = 'http://127.0.0.1:5000/post'
## Define the form data as a dictionary
form_data = {
'username': 'admin',
'password': 'secret'
}
## Send the POST request with the data parameter
response = requests.post(url, data=form_data)
print(f"Status Code: {response.status_code}")
print(f"Response Body: {response.text}")
Enregistrez le fichier et quittez l'éditeur.
Ici, nous définissons un dictionnaire appelé form_data contenant nos identifiants. Nous utilisons ensuite requests.post() et passons notre dictionnaire au paramètre data. La bibliothèque requests formate automatiquement ces données comme une soumission de formulaire web standard.
Exécutez le script pour soumettre le formulaire :
python3 post_request.py
Vous devriez voir un message de connexion réussie :
Status Code: 200
Response Body: {"message":"Login successful"}
Vous pouvez essayer de changer le mot de passe dans le script par une valeur incorrecte (comme wrongpass) et l'exécuter à nouveau pour voir comment le serveur répond avec un code de statut 401 Unauthorized.
Gérer les cookies de session
Dans cette dernière étape, vous apprendrez à gérer les cookies de session. HTTP est un protocole sans état (stateless), ce qui signifie que chaque requête est indépendante. Pour se souvenir d'un utilisateur après sa connexion, les applications web utilisent des cookies.
Si vous utilisez requests.get() ou requests.post() directement, les cookies ne sont pas enregistrés entre les requêtes. Pour maintenir une session (comme rester connecté), vous devez utiliser un objet Session fourni par la bibliothèque requests.
Créez un fichier nommé session_request.py :
nano session_request.py
Ajoutez le code suivant :
import requests
## Create a Session object
session = requests.Session()
login_url = 'http://127.0.0.1:5000/login'
profile_url = 'http://127.0.0.1:5000/profile'
print("Attempting to access profile BEFORE login...")
response1 = session.get(profile_url)
print(f"Status: {response1.status_code}, Body: {response1.text.strip()}")
print("\nLogging in to establish a session...")
## The session object will automatically store cookies returned by the server
session.post(login_url)
print("\nAttempting to access profile AFTER login...")
## The session object will automatically send the stored cookies with this request
response2 = session.get(profile_url)
print(f"Status: {response2.status_code}, Body: {response2.text.strip()}")
Enregistrez le fichier et quittez l'éditeur.
Dans ce script, requests.Session() crée une session persistante. Lorsque nous envoyons la requête POST vers /login, le serveur définit un cookie de session. L'objet Session stocke ce cookie et l'inclut automatiquement dans la requête GET suivante vers /profile, nous permettant d'accéder à la route protégée.
Exécutez le script :
python3 session_request.py
Observez le résultat. Vous verrez que la première tentative échoue car nous ne sommes pas connectés, mais la deuxième tentative réussit car le cookie de session a été géré automatiquement :
Attempting to access profile BEFORE login...
Status: 401, Body: {"message":"Unauthorized"}
Logging in to establish a session...
Attempting to access profile AFTER login...
Status: 200, Body: {"message":"Welcome to your profile!"}
Résumé
Vous avez appris à utiliser la bibliothèque Python requests pour automatiser les interactions web. Vous avez commencé par envoyer des requêtes HTTP GET de base et extraire des métadonnées importantes comme les codes de statut et les en-têtes. Vous avez ensuite progressé vers l'envoi de requêtes HTTP POST pour automatiser la soumission de formulaires. Enfin, vous avez appris à utiliser les objets Session pour gérer les cookies et maintenir un état d'authentification à travers plusieurs requêtes.
Ces compétences constituent la base de nombreuses tâches avancées dans le scraping web, l'intégration d'API et les tests de sécurité automatisés.



