Couche d'application

Les applications Web et les serveurs Web sont essentiels à notre présence en ligne et les attaques observées à leur encontre représentent plus de 70% du total des attaques tentées sur Internet. Ces attaques tentent de convertir des sites Web de confiance en sites malveillants. Pour cette raison, le test des serveurs Web et des applications Web joue un rôle important.

Impression au pied d'un serveur Web

Pourquoi devons-nous tenir compte de la sécurité des serveurs Web? C'est parce qu'avec la croissance rapide de l'industrie du commerce électronique, la principale cible des attaquants est le serveur Web. Pour le test de serveur Web, nous devons connaître le serveur Web, son logiciel d'hébergement et ses systèmes d'exploitation ainsi que les applications qui s'exécutent sur eux. La collecte de telles informations sur le serveur Web s'appelle l'empreinte du serveur Web.

Dans notre section suivante, nous discuterons des différentes méthodes d'empreinte d'un serveur Web.

Méthodes d'empreinte d'un serveur Web

Les serveurs Web sont des logiciels ou du matériel serveur dédiés au traitement des demandes et au service des réponses. Il s'agit d'un domaine clé sur lequel un pentester doit se concentrer lors des tests de pénétration des serveurs Web.

Voyons maintenant quelques méthodes, implémentées en Python, qui peuvent être exécutées pour l'empreinte d'un serveur web -

Test de la disponibilité des méthodes HTTP

Une très bonne pratique pour un testeur de pénétration est de commencer par lister les différentes méthodes HTTP disponibles. Voici un script Python à l'aide duquel nous pouvons nous connecter au serveur Web cible et énumérer les méthodes HTTP disponibles -

Pour commencer, nous devons importer la bibliothèque de requêtes -

import requests

Après avoir importé la bibliothèque de requêtes, créez un tableau de méthodes HTTP, que nous allons envoyer. Nous utiliserons des méthodes standard telles que 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS' et une méthode non standard 'TEST' pour vérifier comment un serveur Web peut gérer l'entrée inattendue.

method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']

La ligne de code suivante est la boucle principale du script, qui enverra les paquets HTTP au serveur Web et imprimera la méthode et le code d'état.

for method in method_list:
   req = requests.request(method, 'Enter the URL’)
   print (method, req.status_code, req.reason)

La ligne suivante testera la possibilité de traçage intersite (XST) en envoyant la méthode TRACE.

if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
   print ('Cross Site Tracing(XST) is possible')

Après avoir exécuté le script ci-dessus pour un serveur Web particulier, nous obtiendrons 200 réponses OK pour une méthode particulière acceptée par le serveur Web. Nous obtiendrons une réponse 403 Forbidden si le serveur Web refuse explicitement la méthode. Une fois que nous enverrons la méthode TRACE pour tester le traçage intersite (XST), nous obtiendrons405 Not Allowed réponses du serveur Web sinon nous recevrons le message ‘Cross Site Tracing(XST) is possible’.

Impression au pied en vérifiant les en-têtes HTTP

Les en-têtes HTTP se trouvent à la fois dans les demandes et les réponses du serveur Web. Ils contiennent également des informations très importantes sur les serveurs. C'est pourquoi le testeur de pénétration est toujours intéressé par l'analyse des informations via les en-têtes HTTP. Voici un script Python pour obtenir les informations sur les en-têtes du serveur Web -

Pour commencer, importons la bibliothèque de requêtes -

import requests

Nous devons envoyer une requête GET au serveur Web. La ligne de code suivante effectue une simple requête GET via la bibliothèque de requêtes.

request = requests.get('enter the URL')

Ensuite, nous allons générer une liste d'en-têtes sur lesquels vous avez besoin d'informations.

header_list = [
   'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]

Vient ensuite un bloc try and except.

for header in header_list:
   try:
      result = request.header_list[header]
      print ('%s: %s' % (header, result))
   except Exception as err:
      print ('%s: No Details Found' % header)

Après avoir exécuté le script ci-dessus pour un serveur Web particulier, nous obtiendrons les informations sur les en-têtes fournis dans la liste des en-têtes. S'il n'y a pas d'informations pour un en-tête particulier, le message "Aucun détail trouvé" s'affiche. Vous pouvez également en savoir plus sur les champs HTTP_header à partir du lien -.

Test des configurations de serveur Web non sécurisées

Nous pouvons utiliser les informations d'en-tête HTTP pour tester les configurations de serveur Web non sécurisées. Dans le script Python suivant, nous allons utiliser le bloc try / except pour tester les en-têtes de serveur Web non sécurisés pour le nombre d'URL enregistrées dans un nom de fichier textewebsites.txt -

import requests
urls = open("websites.txt", "r")

for url in urls:
   url = url.strip()
   req = requests.get(url)
   print (url, 'report:')
   
   try:
      protection_xss = req.headers['X-XSS-Protection']
      if protection_xss != '1; mode = block':
      print ('X-XSS-Protection not set properly, it may be possible:', protection_xss)
   except:
      print ('X-XSS-Protection not set, it may be possible')
      
   try:
      options_content_type = req.headers['X-Content-Type-Options']
      if options_content_type != 'nosniff':
      print ('X-Content-Type-Options not set properly:', options_content_type)
   except:
      print ('X-Content-Type-Options not set')
      
   try:
      transport_security = req.headers['Strict-Transport-Security']
   except:
      print ('HSTS header not set properly, Man in the middle attacks is possible')
      
   try:
      content_security = req.headers['Content-Security-Policy']
      print ('Content-Security-Policy set:', content_security)
   except:
      print ('Content-Security-Policy missing')

Empreinte d'une application Web

Dans notre section précédente, nous avons discuté de l'empreinte d'un serveur Web. De même, l'empreinte d'une application Web est également considérée comme importante du point de vue d'un testeur de pénétration.

Dans notre section suivante, nous découvrirons les différentes méthodes d'empreinte d'une application Web.

Méthodes d'empreinte d'une application Web

L'application Web est un programme client-serveur, qui est exécuté par le client dans un serveur Web. C'est un autre domaine clé sur lequel un pentester doit se concentrer tout en effectuant des tests de pénétration d'une application Web.

Parlons maintenant des différentes méthodes, implémentées en Python, qui peuvent être utilisées pour l'empreinte d'une application web -

Collecte d'informations à l'aide de l'analyseur BeautifulSoup

Supposons que nous voulions collecter tous les hyperliens d'une page Web; nous pouvons utiliser un analyseur appelé BeautifulSoup. L'analyseur est une bibliothèque Python permettant d'extraire des données de fichiers HTML et XML. Il peut être utilisé avecurlib car il a besoin d'une entrée (document ou url) pour créer un objet soupe et il ne peut pas récupérer la page Web par lui-même.

Pour commencer, importons les packages nécessaires. Nous importerons urlib etBeautifulSoup. N'oubliez pas qu'avant d'importer BeautifulSoup, nous devons l'installer.

import urllib
from bs4 import BeautifulSoup

Le script Python ci-dessous rassemblera le titre de la page Web et les hyperliens -

Maintenant, nous avons besoin d'une variable, qui peut stocker l'URL du site Web. Ici, nous utiliserons une variable nommée 'url'. Nous utiliserons également lepage.read() fonction qui peut stocker la page Web et affecter la page Web à la variable html_page.

url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()

le html_page sera affecté comme entrée pour créer un objet soupe.

soup_object = BeautifulSoup(html_page)

Les deux lignes suivantes imprimeront le nom du titre avec les balises et sans les balises respectivement.

print soup_object.title
print soup_object.title.text

La ligne de code ci-dessous enregistrera tous les hyperliens.

for link in soup_object.find_all('a'):
   print(link.get('href'))

Bannière saisissant

La bannière est comme un message texte contenant des informations sur le serveur et la capture de bannière est le processus de récupération des informations fournies par la bannière elle-même. Maintenant, nous devons savoir comment cette bannière est générée. Il est généré par l'en-tête du paquet qui est envoyé. Et pendant que le client tente de se connecter à un port, le serveur répond car l'en-tête contient des informations sur le serveur.

Le script Python suivant permet de saisir la bannière en utilisant la programmation de socket -

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))

targethost = str(raw_input("Enter the host name: "))
targetport = int(raw_input("Enter Port: "))
s.connect((targethost,targetport))

def garb(s:)
   try:
      s.send('GET HTTP/1.1 \r\n')
      ret = sock.recv(1024)
      print ('[+]' + str(ret))
      return
   except Exception as error:
      print ('[-]' Not information grabbed:' + str(error))
      return

Après avoir exécuté le script ci-dessus, nous obtiendrons le même type d'informations sur les en-têtes que celles fournies par le script Python de l'empreinte des en-têtes HTTP dans la section précédente.