Livello applicazione

Le applicazioni Web e i server Web sono fondamentali per la nostra presenza online e gli attacchi osservati contro di essi costituiscono oltre il 70% degli attacchi totali tentati su Internet. Questi attacchi tentano di convertire i siti Web affidabili in siti dannosi. Per questo motivo, il server Web e il test della penna dell'applicazione Web svolgono un ruolo importante.

Stampa a piedi di un server web

Perché dobbiamo considerare la sicurezza dei server web? È perché con la rapida crescita del settore dell'e-commerce, l'obiettivo principale degli aggressori è il server web. Per il pentesting del server web, dobbiamo conoscere il server web, il suo software di hosting e sistemi operativi insieme alle applicazioni in esecuzione su di essi. La raccolta di tali informazioni sul server web è chiamata impronta del server web.

Nella nostra sezione successiva, discuteremo i diversi metodi per il footprint di un server web.

Metodi per il footprint di un server web

I server Web sono software o hardware server dedicati alla gestione delle richieste e alle risposte. Questa è un'area chiave su cui un pentester deve concentrarsi durante i test di penetrazione dei server web.

Parliamo ora di alcuni metodi, implementati in Python, che possono essere eseguiti per il footprint di un server web:

Verifica della disponibilità di metodi HTTP

Un'ottima pratica per un penetration tester è iniziare elencando i vari metodi HTTP disponibili. Di seguito è riportato uno script Python con l'aiuto del quale possiamo connetterci al server web di destinazione ed enumerare i metodi HTTP disponibili -

Per cominciare, dobbiamo importare la libreria delle richieste -

import requests

Dopo aver importato la libreria delle richieste, crea un array di metodi HTTP, che invieremo. Faremo uso di alcuni metodi standard come "GET", "POST", "PUT", "DELETE", "OPTIONS" e un metodo non standard "TEST" per verificare come un server web può gestire l'input imprevisto.

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

La seguente riga di codice è il ciclo principale dello script, che invierà i pacchetti HTTP al server web e stamperà il metodo e il codice di stato.

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

La riga successiva verificherà la possibilità di cross site tracing (XST) inviando il metodo TRACE.

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

Dopo aver eseguito lo script precedente per un particolare server web, avremo 200 risposte OK per un particolare metodo accettato dal web server. Otterremo una risposta 403 Forbidden se il server web nega esplicitamente il metodo. Una volta inviato il metodo TRACE per testare il cross site tracing (XST), otterremo405 Not Allowed risposte dal server web altrimenti riceveremo il messaggio ‘Cross Site Tracing(XST) is possible’.

Stampa a piedi controllando le intestazioni HTTP

Le intestazioni HTTP si trovano sia nelle richieste che nelle risposte dal server web. Trasportano anche informazioni molto importanti sui server. Ecco perché il penetration tester è sempre interessato all'analisi delle informazioni tramite le intestazioni HTTP. Di seguito è riportato uno script Python per ottenere le informazioni sulle intestazioni del server web -

Per cominciare, importiamo la libreria delle richieste:

import requests

Dobbiamo inviare una richiesta GET al server web. La seguente riga di codice effettua una semplice richiesta GET tramite la libreria delle richieste.

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

Successivamente, genereremo un elenco di intestazioni di cui hai bisogno delle informazioni.

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

La prossima è una prova e tranne il blocco.

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)

Dopo aver eseguito lo script precedente per un particolare server web, otterremo le informazioni sulle intestazioni fornite nell'elenco delle intestazioni. Se non ci saranno informazioni per una determinata intestazione, verrà visualizzato il messaggio "Nessun dettaglio trovato". Puoi anche saperne di più sui campi HTTP_header dal link -https://www.tutorialspoint.com/http/http_header_fields.htm.

Test di configurazioni di server web non sicure

Possiamo utilizzare le informazioni dell'intestazione HTTP per testare configurazioni di server web non sicure. Nel seguente script Python, useremo try / tranne block per testare intestazioni di server web non sicure per il numero di URL salvati in un nome di file di testowebsites.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')

Impronta di un'applicazione Web

Nella nostra sezione precedente, abbiamo discusso dell'impronta di un server web. Allo stesso modo, anche il footprint di un'applicazione web è considerato importante dal punto di vista di un penetration tester.

Nella nostra sezione successiva, impareremo i diversi metodi per il footprint di un'applicazione web.

Metodi per il footprint di un'applicazione Web

L'applicazione Web è un programma client-server, che viene eseguito dal client in un server Web. Questa è un'altra area chiave su cui un pentester deve concentrarsi durante i test di penetrazione dell'applicazione web.

Parliamo ora dei diversi metodi, implementati in Python, che possono essere utilizzati per il footprint di un'applicazione web:

Raccolta di informazioni utilizzando il parser BeautifulSoup

Supponiamo di voler raccogliere tutti i collegamenti ipertestuali da una pagina web; possiamo usare un parser chiamato BeautifulSoup. Il parser è una libreria Python per estrarre dati da file HTML e XML. Può essere utilizzato conurlib perché ha bisogno di un input (documento o URL) per creare un oggetto soup e non può recuperare la pagina web da solo.

Per cominciare, importiamo i pacchetti necessari. Importeremo urlib eBeautifulSoup. Ricorda prima di importare BeautifulSoup, dobbiamo installarlo.

import urllib
from bs4 import BeautifulSoup

Lo script Python fornito di seguito raccoglierà il titolo della pagina web e i collegamenti ipertestuali -

Ora, abbiamo bisogno di una variabile, che può memorizzare l'URL del sito web. Qui useremo una variabile chiamata "url". Useremo anche il filepage.read() funzione che può memorizzare la pagina web e assegnare la pagina web alla variabile html_page.

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

Il html_page verrà assegnato come input per creare un oggetto zuppa.

soup_object = BeautifulSoup(html_page)

Le seguenti due righe stamperanno il nome del titolo rispettivamente con tag e senza tag.

print soup_object.title
print soup_object.title.text

La riga di codice mostrata di seguito salverà tutti i collegamenti ipertestuali.

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

Afferrare banner

Il banner è come un messaggio di testo che contiene informazioni sul server e l'acquisizione del banner è il processo di recupero delle informazioni fornite dal banner stesso. Ora, dobbiamo sapere come viene generato questo banner. Viene generato dall'intestazione del pacchetto inviato. E mentre il client tenta di connettersi a una porta, il server risponde perché l'intestazione contiene informazioni sul server.

Il seguente script Python aiuta a catturare il banner usando la programmazione 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

Dopo aver eseguito lo script precedente, otterremo informazioni simili sugli header come quelle ottenute dallo script Python di footprinting degli header HTTP nella sezione precedente.