Forgeage de requêtes HTTP

Introduction

Page echo

Dans les TDs et CTFs suivants, nous aurons besoins de pouvoir forger des requêtes HTTP. Nous vous proposons pour clea de vous familiariser avec la librairie requests de Python.

La page suivante vous permettra de réaliser des tests :

Application echo

pour information, code source php

Cette page affiche toutes les informations qui lui sont transmises par la requête HTTP (méthode, données GET/POST, cookies, un compteur stocké dans une session, etc.).

Prise en main

Le code minimal en Python pour envoyer une requête HTTP est le suivant :

import requests

url = 'https://gregwar.com/security/apps/echo/'
r = requests.get(url)
print(r.text)

Les possibilités de requests

Définir la méthode

Pour changer la méthode, appeler la fonction correspondante :

r = requests.post(url)
r = requests.put(url)
r = requests.delete(url)
r = requests.head(url)
...

Paramètres GET

Vous pouvez passer des paramètres GET (dans la query string) en utilisant le paramètre params :

# Passera ?hello=world
r = requests.get(url, params={'hello': 'world'})

Paramètres POST

Pour passer des paramètres POST, utilisez le paramètre data :

# Passera le paramètre POST hello=world
r = requests.post(url, data={'hello': 'world'})

Cookies

Pour passer des cookies, utilisez le paramètre cookies :

# Passera le cookie hello=world
r = requests.get(url, cookies={'hello': 'world'})

En-têtes

Pour passer des en-têtes, utilisez le paramètre headers :

# Passera l'en-tête X-Hello: world
r = requests.get(url, headers={'X-Hello': 'world'})

Enregistrement des cookies

Pour enregistrer les cookies automatiquement, il est possible de créer une session :

s = requests.Session()
s.get(url)
r = s.get(url)
print(r.text)  # Les cookies sont enregistrés entre les deux appels

Avec la page echo ci-dessus, vous verrez que le cookie de session PHP aura été enregistré, et que la valeur du compteur en session aura augmenté.

CTF HTTP

Annexe: Générer des images

Pour un des challenges, vous aurez besoin de générer des images en Python. Voici un exemple de code pour générer une image de 25x25 pixels, et mettre un pixel noir en (5, 5) :

from PIL import Image

# Create a 25x25 image
img = Image.new('RGB', (25, 25), "white")

# Définit en noir la couleur du pixel (5, 5)
img.putpixel((5, 5), (0, 0, 0))

# Show the image
img.show()