Security Assessment: casi pratici e risultati - Elaborato finale in Reti di Calcolatori

Pagina creata da Filippo Barbieri
 
CONTINUA A LEGGERE
Facoltà di Ingegneria
Corso di Studi in Ingegneria Informatica

Elaborato finale in Reti di Calcolatori

Security Assessment: casi pratici e risultati

Anno Accademico 2018/2019

candidato
Nappi Marco

matr. N46/1914
Ringrazio il prof. Pescape, lo Staff del CSI
             la mia famiglia, e i miei amici
        che mi hanno guidato e supportato
                 anche nei momenti più bui.
              Insegnandomi a credere in me
                       e nelle mie capacità

   2
Indice

Introduzione                                                                                                       5

1 Vulnerabilità WEB                                                                                                 7
  1.1 Cross-Site Scripting (XSS) . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
       1.1.1 XSS-reflected . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
       1.1.2 XSS DOM Based . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
       1.1.3 XST: . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
       1.1.4 XSS stored: . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
       1.1.5 Blind XSS: . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
  1.2 Clickjacking . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
  1.3 CSRF . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
  1.4 Broken Acces Controll . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
  1.5 Local File Inclusion (LFI) . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
  1.6 File Upload Vulnerabilty . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
  1.7 Open Redirect . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
  1.8 SQL Injection (SQLi) . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
       1.8.1 SQL Injection . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
       1.8.2 Blind SQL injection . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
       1.8.3 SQL Injection Login Bypass        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
       1.8.4 NOSQL injection . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
  1.9 Code Injection . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
  1.10 User-Enumeration . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
       1.10.1 Bruteforce-wordlist . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
       1.10.2 Automated . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
  1.11 Doungerous HTTP Methods . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
  1.12 Metadata Issue . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13

2 Web Pentesting                                                              14
  2.1 Fasi di un Penetration Testing . . . . . . . . . . . . . . . . . . . 14
  2.2 Metodologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
      2.2.1 Metodologia per rilevare Cross Site Scripting (XSS) . . . 14
      2.2.2 Metodologia per rilevare Click-Jacking . . . . . . . . . . . 18
      2.2.3 Metodologia per rilevare una Cross-Site Request forgery
              CSRF o XSRF . . . . . . . . . . . . . . . . . . . . . . . . 18
  2.3 Metodologia Per Testare Broken Acces Controll . . . . . . . . . . 19
      2.3.1 Metodologia Per Testare LFI . . . . . . . . . . . . . . . . 19
      2.3.2 Metodologia per Testare FileUploadVulnerabilty . . . . . 20
  2.4 Metodologia di Test per OpenRedirect: . . . . . . . . . . . . . . . 21

                                       3
INDICE

         2.4.1    Metodologia Per testare SQLi      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
         2.4.2    Code injection . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
         2.4.3    User-Enumeration . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
         2.4.4    Doungerous HTTP Methods           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
         2.4.5    Metadata issue . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
   2.5   Tools   for Pentesting . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25

Conclusioni                                                                                                         27

Bibliografia                                                                                                        28

                                         4
Introduzione

La sicurezza informatica o cyber security è una branca dell’informatica che ha un
ampio spettro di contenuti. La sicurezza informatica si occupa dell’informatica
in tutte le sue applicazione dal ramo WEB al ramo emebedded con lo scopo di
tutelare l’utente finale. Negli ultimi anni l’importanza della sicurezza informatica
sta crescendo con rapidità al punto tale che dal 2016 la NATO riconosce internet
come zona di guerra operativa. Nel cyber security si sono individuati tre aspetti
fondamentali: Confidenzialità, integrità e disponibilità, nota anche come triade
CIA (Confidentiality, Integrity, Disponibilità). Il modello CIA è un modello
progettato per guidare le politiche di sicurezza delle informazioni all’interno
di un’organizzazione. Il modello è a volte indicato anche come la triade AIC
(disponibilità, integrità e Confidenzialità). Gli elementi della triade sono consi-
derati i tre pilastri della sicurezza. In questo contesto, la Confidenzialità è un
insieme di regole che limita l’accesso alle informazioni, l’integrità è la garanzia
che le informazioni sono affidabili e accurate, e la disponibilità è una garanzia di
accesso affidabile alle informazioni da parte di persone autorizzate.

Confidenzialità La Confidenzialità equivale all’incirca alla privatezza. Le
misure adottate per garantire la Confidenzialità sono progettate per impedire
che le informazioni sensibili raggiungano le persone sbagliate, assicurando al
contempo che le persone giuste possano effettivamente ottenerle: L’accesso deve
essere limitato alle persone autorizzate a visualizzare i dati in questione. È
comune, inoltre, che i dati siano classificati in base alla quantità e al tipo di
danno che potrebbe essere fatto nel caso in cui cadesse in mani non intenzionali.
Misure più o meno severe possono quindi essere attuate in base a tali categorie.
A volte la tutela della Confidenzialità dei dati può richiedere una formazione
specifica per coloro che sono a conoscenza di tali documenti. La formazione
può aiutare le persone autorizzate a familiarizzare con i fattori di rischio e come
premunirsi contro di loro. Ulteriori aspetti della formazione possono includere
password forti e buone pratiche relative alle password e informazioni sui metodi
di ingegneria sociale, per evitare che le regole di gestione dei dati vengano piegate
con buone intenzioni e risultati potenzialmente disastrosi.

Integrità L’integrità consiste nel mantenere la coerenza, l’accuratezza e l’affi-
dabilità dei dati per l’intero ciclo di vita. I dati non devono essere modificati
durante il trasporto e devono essere adottate misure per garantire che i dati non
possano essere alterati da persone non autorizzate (ad esempio, in violazione
della Confidenzialità). Queste misure comprendono l’attuazione di tecniche di
controllo relative ai file e al controllo degli accessi degli utenti. Tecniche di

                                         5
CAPITOLO 0. INTRODUZIONE

controllo della versione può essere utilizzato per evitare che modifiche errate o
cancellazioni accidentali da parte di utenti autorizzati diventino un problema.
Inoltre, è necessario disporre di alcuni mezzi per rilevare eventuali modifiche dei
dati che potrebbero verificarsi a seguito di eventi non causati dall’uomo, come
un impulso elettromagnetico (EMP) o il crash del server. Alcuni dati possono
includere checksum, anche crittografici, per la verifica dell’integrità. I backup o
le ridondanze devono essere disponibili per ripristinare lo stato corretto dei dati
interessati.

Disponibilità La Disponibilità è garantita al meglio mantenendo rigorosamen-
te tutto l’hardware, eseguendo riparazioni hardware immediatamente quando
necessario e mantenendo un ambiente operativo correttamente funzionante che
sia libero da conflitti software. È inoltre importante eseguire tempestivamente
tutti gli aggiornamenti di sistema necessari. È altrettanto importante fornire
un’adeguata larghezza di banda di comunicazione e prevenire il verificarsi di colli
di bottiglia. Ridondanza, RAID anche i cluster ad alta Disponibilità possono
attenuare le gravi conseguenze in caso di problemi hardware. Il disaster recovery
rapido e adattivo è essenziale per gli scenari peggiori; tale capacità dipende
dall’esistenza di un piano completo di disaster recovery (DRP). Le misure di
protezione contro la perdita di dati o le interruzioni delle connessioni devono
includere eventi imprevedibili, quali disastri naturali e incendi. Per evitare la
perdita di dati a causa di tali eventi, una copia di backup può essere conservata
in un luogo geograficamente isolato, magari anche in una cassaforte resistente
al fuoco e all’acqua. Apparecchiature di sicurezza aggiuntive o software come
firewall e server proxy possono proteggersi dai tempi di inattività e dati irrag-
giungibili a causa di azioni dannose come gli attacchi DOS (denial-of-service) e
le intrusioni di rete.

CentroServiziInformatici(CSI)
Le vulnerabilità successivamente descritte sono state cercate dal sottoscritto
attraverso le metodologie, anch’esse descritte successivamente, nella rete dell’u-
niversità di Napoli, gestita dal CSI, sulla quale ho potuto svolgere un’attività di
Pentest Web. Il pentesting di una applicazione WEB è uno delle due branche
del PT (penetration Testing)[8] che indaga gli applicativi web, sia in maniera
passiva che in maniera attiva, in modo da trovare eventuali difetti dovuti sia
ad una sbagliata progettazione che ad eventuali obsolescenza degli applicativi
utilizzati. Colui che effettua un Penetration Testing è detto Penetration Tester
questa figura sfrutta Metodologie e tool per trovare vulnerabilità nell’applicativo
Web definito come target

                                        6
Capitolo 1

Vulnerabilità WEB

In Questo capitolo si provvederà ad introdurre e successivamente vedere nel
dettaglio le più comuni vulnerabilità web quali: XSS, Clickjacking, Client side
Reforgery (CSRF), Broken Access Controll (BAC), Local File Inclusion, Fi-
le Upload Vulnerability, Open-Redirect, SQL Injection, Code injection, User
Enumeration, Dangeours HTTP Mehtods, metadata issue.

1.1      Cross-Site Scripting (XSS)
Gli attacchi Cross-Site Scripting (XSS) rientrano nella categoria di attacchi
chiamata "data injection”, in cui gli script dannosi vengono iniettati, sotto forma
di codice HTML e javascript, in siti web altrimenti affidabili. Gli attacchi XSS si
verificano quando un Penetration tester utilizza un’applicazione web per inviare
codice dannoso, generalmente sotto forma di script lato browser, a un altro utente
finale. I difetti che permettono il successo di questi attacchi sono abbastanza
diffusi e si verificano ovunque un’applicazione web riflette l’input di un utente
nella generazione all’interno della propria pagina web senza prima convalidarlo
o codificarlo. Un Penetration tester può usare un XSS per inviare uno script
dannoso ad un utente ignaro. Poiché il browser utilizzato dell’utente non ha
modo di discernere tra script malevoli e non lo script verrà eseguito. Lo script
dannoso una volta eseguito darà accesso al Penetration Tester a qualsiasi cookie,
token di sessione o altre informazioni sensibili conservate dal browser e utilizzate
da quel sito. In alcuni casi questi script possono anche riscrivere il contenuto
della pagina HTML. Esistono diverse categorie di XSS: XSS-reflected, XSS-DOM
based, XST, Stored-XSS e Blind XSS

1.1.1     XSS-reflected
Gli attacchi del tipo XSS-reflected sono quelli in cui lo script iniettato viene
riflesso dal server web, ad esempio in un messaggio di errore, nei risultati della
ricerca o in qualsiasi altra risposta che include alcuni o tutti gli input inviati al
server come parte della richiesta. Gli attacchi XSS reflected vengono consegnati
alle vittime attraverso un URL inviato ad esempio in un messaggio di posta
elettronica. Quando un utente viene indotto a cliccare su un link dannoso per
navigare il sito dannoso, il codice iniettato viene eseguito attraverso il sito web

                                         7
CAPITOLO 1. VULNERABILITÀ WEB

vulnerabile, che riflette l’attacco al browser dell’utente. Il browser esegue il
codice perché proviene da un server "fidato".

1.1.2    XSS DOM Based
L’attacco XSS DOM Based [1], è un attacco XSS in cui la payload, ovvero il
codice malevolo, dell’attacco viene eseguita come risultato della modifica del
"ambiente" del DOM nel browser della vittima utilizzato dallo script lato client
originale, in modo che l’esecuzione del codice lato client produca un risultato
"inaspettato". In particolare, la pagina stessa (la risposta HTTP) non cambia,
ma il codice lato client contenuto nella pagina viene eseguito in modo diverso a
causa delle modifiche dannose che si sono verificate nell’ambiente DOM. Questo
è in contrasto con altri attacchi XSS (stored o reflected), in cui la payload
dell’attacco viene posizionato nella pagina di risposta (grazie ad un difetto di
progettazione/programmazione lato server).

1.1.3    XST:
Un attacco Cross-Site Tracing (XST) comporta l’uso di Cross-site Scripting (XSS)
e dei metodi TRACE o TRACK HTTP. Secondo l’RFC 2616[2], TRACE permette
al cliente di vedere cosa viene ricevuto all’altro capo della catena di richiesta
e di utilizzare quei dati per testare o per informazioni diagnostiche. Il metodo
TRACK funziona allo stesso modo ma è specifico del server web IIS di Microsoft.
XST potrebbe essere usato come metodo per rubare i cookie dell’utente tramite
Cross-site Scripting (XSS) anche se il cookie ha il flag "HttpOnly" impostato e/o
espone l’intestazione di autorizzazione dell’utente. Il metodo TRACE, anche
se apparentemente innocuo, può essere utilizzato con successo in alcuni scenari
per rubare le credenziali degli utenti legittimi. Questa tecnica di attacco è
stata scoperta da Jeremiah Grossman nel 2003, nel tentativo di aggirare il tag
HttpOnly che Microsoft ha introdotto in Internet Explorer 6 SP1 per proteggere
i cookie dall’accesso tramite JavaScript. Infatti, uno degli schemi di attacco
più ricorrenti nel Cross Site Scripting è quello di accedere all’oggetto document.
cookie e inviarlo a un server web controllato dall’aggressore in modo che possa
dirottare la sessione della vittima. Il flag HttpOnly di un cookie vieta a codice
JavaScript di modificare il valore di quest’ultimo. Tuttavia, il metodo TRACE
può essere utilizzato per aggirare questa protezione e accedere al cookie anche
in questo scenario. I moderni browser impediscono ora che le richieste TRACE
vengano effettuate tramite JavaScript, ma sono stati scoperti altri modi di inviare
richieste TRACE con i browser, come l’utilizzo di Codice Java che tramite socket
invia una richiesta HTTP.

1.1.4    XSS stored:
L’attacco XSS più dannoso è il cosiddetto XSS Stored detta anche XSS Persistente.
Gli attacchi XSS stored comportano che un Penetration tester inietta uno script
(chiamato payload) che viene memorizzato in maniera persistente sull’applicazione
ad esempio all’interno di un database. Un esempio classico è uno script dannoso
inserito da un aggressore in un campo di commento su un blog o in un post di un
forum. Quando una vittima naviga verso la pagina web interessata in un browser,
il payload XSS viene caricato come parte della pagina web (proprio come un

                                        8
CAPITOLO 1. VULNERABILITÀ WEB

commento legittimo). Ciò significa che le vittime finiranno inavvertitamente
per eseguire lo script dannoso ogni volta che la pagina viene visualizzata in un
browser.

1.1.5     Blind XSS:
Gli attacchi del tipo Blind XSS sono una variante dell’attacco XSS-stored. La
Blind XSS, cosi come la tipologia stored viene salvata in maniera persistente
nel back end del sito "vittima", con la differenza che lo script dannoso viene
eseguito quando una pagina contente codice Javascript dinamico richiama un
determinato parametro il cui valore sarà il nostro payload. Ciò rende le Blind
XSS più difficili da individuare e molto più efficaci.

1.2      Clickjacking
Il ClickJacking, noto anche come "UI redress attack", avviene quando un Pene-
tration tester usa più livelli trasparenti o opachi, contenuti in un iframe full-page,
per indurre un utente a cliccare su un pulsante o link su un’altra pagina quando
intendeva cliccare sulla pagina di livello superiore. In questo modo l’”hijacking"
del click può essere utilizzato per reindirizzare la vittima su un sito web contente
script malevoli. Usando una tecnica simile, anche i tasti possono essere dirottati.
Con una combinazione attentamente studiata di fogli di stile, iframe e caselle
di testo, un utente può essere indotto a credere di aver digitato la password
della propria e-mail o conto bancario, quando in realtà sta digitando in un frame
invisibile controllato dall’aggressore.

1.3      CSRF
Cross-Site Request Forgery (CSRF)[6] è un attacco che obbliga l’utente finale
ad eseguire azioni indesiderate su un’applicazione web in cui è attualmente
autenticato. Gli attacchi CSRF hanno come obiettivo specifico le richieste di
cambiamento di stato, non il furto di dati, poiché l’aggressore non ha modo di
vedere la risposta alla richiesta falsificata. Con un piccolo aiuto di ingegneria
sociale (come l’invio di un link via e-mail o chat) ad Esempio un aggressore può
indurre gli utenti di un’applicazione web ad eseguire azioni a scelta dell’aggressore.
Se la vittima è un utente normale, un attacco CSRF di successo può costringere
l’utente ad eseguire richieste di modifica dello stato come il trasferimento di
fondi, la modifica dell’indirizzo e-mail e così via. Se la vittima è un account
amministrativo, il CSRF può compromettere l’intera applicazione web.

1.4      Broken Acces Controll
Il controllo degli accessi, a volte chiamato autorizzazione, è il modo in cui
un’applicazione web tipicamente concede l’accesso a determinati contenuti e/o
funzionalità ad alcuni utenti e non ad altri. Questi controlli vengono eseguiti
dopo l’autenticazione e regolano ciò che gli utenti sono autorizzati a fare. Il
controllo degli accessi sembra un problema semplice, ma è difficile da imple-
mentare correttamente. Il modello di controllo accessi di un’applicazione web è

                                          9
CAPITOLO 1. VULNERABILITÀ WEB

strettamente legato al contenuto e alle funzioni che il sito fornisce. Inoltre, a gli
utenti possono essere attribuiti una serie di gruppi o ruoli con abilità o privilegi
diversi. Gli sviluppatori spesso sottovalutano la difficoltà di implementare un
meccanismo affidabile di controllo degli accessi. Molti di questi schemi non sono
stati progettati deliberatamente, ma si sono semplicemente evoluti insieme al
sito web. In questi casi, le regole di controllo degli accessi sono inserite in varie
posizioni in tutto il codice. Man mano che il sito si avvicina all’implementazione,
l’insieme di regole ad hoc diventa così ingombrante che è quasi impossibile da
capire. Molti di questi schemi di controllo degli accessi non sono difficili da
scoprire e sfruttare. Spesso, tutto ciò che è necessario è creare una richiesta di
funzioni o contenuti che non dovrebbero essere concessi. Una volta scoperto un
difetto, le conseguenze di un sistema di controllo dell’accesso difettoso possono
essere devastanti. Oltre a visualizzare contenuti non autorizzati, un aggressore
potrebbe essere in grado di modificare o cancellare contenuti, eseguire funzioni
non autorizzate o addirittura assumere l’amministrazione del sito. Un tipo
specifico di problema di controllo degli accessi sono le interfacce amministrative
che consentono agli amministratori del sito di gestire un sito su Internet. Tali
funzioni sono spesso utilizzate per consentire agli amministratori del sito di
gestire in modo efficiente gli utenti, i dati e i contenuti del loro sito. In molti
casi, i siti supportano una varietà di ruoli amministrativi per consentire una
granularità più fine dell’amministrazione del sito. A causa del loro potere, queste
interfacce sono spesso gli obiettivi principali per l’attacco sia da parte di estranei
che di addetti ai lavori.

1.5      Local File Inclusion (LFI)
Local File Inclusion (LFI), o semplicemente file Inclusion, si riferisce a un attacco
attraverso il quale un hacker può ingannare l’applicazione web per includere file
sul server web sfruttando funzionalità che includono dinamicamente file o script
locali. La conseguenza del successo di un attacco LFI include Directory Traversal
e Information Disclosure così come Remote Code Execution. Ovvero l’attaccante
può ricavare informazioni sensibili (Information Disclosure) o vistare il sito come
se fosse un insieme di directory (Directory Traversal) o ancora eseguire comandi
relativi ad uno specifico sistema operativo (Remote Code Execution. In genere, la
Local file Inclusion (LFI) si verifica quando un’applicazione ottiene il percorso del
file che deve essere incluso come input senza trattarlo come input non attendibile.
Ciò consentirebbe di fornire un file locale all’istruzione di inclusione.

1.6      File Upload Vulnerabilty
I file caricati rappresentano un rischio significativo per le applicazioni. Il primo
passo in molti attacchi è quello di ottenere del codice sorgente del sistema da
attaccare. Quindi l’attacco deve solo trovare un modo per far eseguire il codice.
L’uso del caricamento di un file aiuta il Penetration tester a compiere il primo
passo. Le conseguenze di un upload di file senza restrizioni possono variare,
dall’acquisizione completa del sistema, un file di sistema o database sovraccarico,
all’inoltro di attacchi a sistemi di back-end, attacchi lato client o semplicemente
ad un crash del server. Dipende da cosa fa l’applicazione con il file caricato e

                                         10
CAPITOLO 1. VULNERABILITÀ WEB

soprattutto da dove viene memorizzato. Ci sono davvero due classi di problemi.
La prima è con i metadati dei file, come il percorso e il nome del file. Determinate
metodologie di metadati possono indurre l’applicazione a sovrascrivere un file
critico o a salvare il file in una cattiva posizione. È necessario quindi convalidare
i metadati con estrema attenzione prima di utilizzarli. La seconda classe di
problema è la dimensione del file o il contenuto. La gamma di problemi qui
dipende interamente da ciò per cui il file viene utilizzato. Per proteggersi da
questo tipo di attacco, si dovrebbe analizzare tutto ciò che l’applicazione fa con
i file e riflettere attentamente su quali elaborazioni e interpreti sono coinvolti.

1.7      Open Redirect
Re indirizzamenti e forward non convalidati, detti anche Open redirect, sono
possibili quando un’applicazione web accetta input non attendibili che potrebbero
indurre l’applicazione web a reindirizzare la richiesta a un URL contenuto
all’interno di un input. Modificando l’input URL in quello di un sito dannoso, un
aggressore può lanciare con successo una truffa di phishing e rubare le credenziali
dell’utente. Poiché il nome del server nel link modificato è identico al sito
originale, i tentativi di phishing possono avere un aspetto più affidabile. Gli
attacchi non convalidati di re-indirizzamento e inoltro possono anche essere
utilizzati per creare in modo dannoso un URL che passerebbe il controllo di
accesso dell’applicazione e quindi inoltrare l’aggressore a funzioni privilegiate
alle quali normalmente non sarebbe in grado di accedere.

1.8      SQL Injection (SQLi)
1.8.1     SQL Injection
Un attacco SQL injection consiste nell’inserimento o "iniezione" di una query
SQL attraverso i dati di input dal client all’applicazione. Un’iniezione SQL può
permettere di leggere dati sensibili dal database, modificare i dati del database
(Insert/Update/Delete), eseguire operazioni di amministrazione sul database
(come lo spegnimento del DBMS), recuperare il contenuto di un dato file presente
sul file system DBMS e in alcuni casi inviare perfino di inviare comandi al sistema
operativo. Gli attacchi SQL injection sono un tipo di attacco di iniezione, in cui
vengono sfruttati commandi SQL in cui l’attaccante inietta del codice malevolo
in modo da raggiungere il suo obbiettivo.

1.8.2     Blind SQL injection
L’iniezione SQL Blind[5] è un tipo di attacco SQL Injection che pone domande
vere o false al database e determina la risposta in base alla risposta delle
applicazioni. Questo attacco è spesso utilizzato quando l’applicazione web è
configurata per mostrare messaggi di errore generici, ma non ha attenuato
il codice vulnerabile all’iniezione SQL. Quando un Penetration tester sfrutta
l’iniezione SQL, a volte l’applicazione web visualizza messaggi di errore dal
database lamentando che la sintassi di SQL Query non è corretta. Blind SQL
injection è quasi identico al normale SQL Injection, l’unica differenza è il modo
in cui i dati vengono recuperati dal database. Quando il database non invia i dati

                                        11
CAPITOLO 1. VULNERABILITÀ WEB

alla pagina web, un aggressore è costretto a rubare i dati ponendo al database
una serie di domande vere o false. Questo rende più difficile, ma non impossibile,
lo sfruttamento della vulnerabilità di SQL Injection.

1.8.3     SQL Injection Login Bypass
Un attacco SQL injection può essere sfruttato per eludere il controllo di alcune
form di login facendo in modo, tramite la sintassi SQL, che il risultato della
query effettuata al database sia True oppure facendo in modo di eliminare dalla
query il controllo della password[3].

1.8.4     NOSQL injection
Un attacco NOSQL injection [7]consiste nell’inserimento o "iniezione" di una
query NOSQL attraverso i dati di input dal client all’applicazione. Un’iniezione
NOSQL può leggere dati sensibili dal database, modificare i dati del database
(Insert/Update/Delete), eseguire operazioni di amministrazione sul database
(come lo spegnimento del DBMS), recuperare il contenuto di un dato file presente
sul file system DBMS e in alcuni casi inviare comandi al sistema operativo. Gli
attacchi SQL injection sono un tipo di attacco di iniezione, in cui i comandi
NOSQL vengono iniettati in ingresso al piano dati per effettuare l’esecuzione di
comandi NOSQL predefiniti.

1.9      Code Injection
Code Injection è il termine generale per i tipi di attacco che consiste nell’iniettare
codice che viene poi interpretato/eseguito dall’applicazione. Questi tipi di attac-
chi sono di solito resi possibili dalla mancanza di un’adeguata convalida dei dati
di input/output. Code Injection si differenzia dal Command Injection in quanto
un aggressore è limitato solo dalla funzionalità del linguaggio iniettato stesso.
Se un Penetration tester è in grado di iniettare codice PHP in un’applicazione e
farla eseguire, è limitato solo da ciò di cui PHP è capace. L’iniezione dei comandi
consiste nello sfruttare il codice esistente per eseguire i comandi, solitamente nel
contesto di una shell.

1.10       User-Enumeration
la User Enumeration è un attacco che sfrutta errori di progettazione/programmazione
per enumerare gli utenti di un determinato applicativo web. Ne esistono due
tipologie:

1.10.1     Bruteforce-wordlist
L ’attacco "user enumeration" utilizza la tecnica di bruteforce (ovvero provare
tutte le possibili combinazioni di simboli) o delle wordlist(dizionari) su form di
registrazione, login e di recupero password. La strategia di questo attacco e
semplice consiste nel compilare un form, provocando un errore, e vedere se il
messaggio di errore specifica l’esiste o meno dell’utente.

                                         12
CAPITOLO 1. VULNERABILITÀ WEB

1.10.2      Automated
Per alcuni CMS (content management system) come concrete5 e Wordpress sono
noti degli errori di progettazione che permettono di automatizzare l’attacco e
di renderlo molto più efficiente ed efficace infatti basta effettuare delle richieste,
utilizzando curl come strumento, aumentando l’indice utilizzato con passo 1.
Esempio C5:
http: https://myconcrete5site/profile/nome/date/20
Nel caso di Wordpress bisogna aggiungere alla pagina home il parametro author
con un valore numerico da 1 a n. Una volta inviata tale richiesta la pagina
caricherà la pagina dell’autore.
Esempio Wordpress:
http://mywordpresssite.com/? author=1
-> restituirà ->
http://mywordpresssite.com/author/nome

1.11       Doungerous HTTP Methods
Il protocollo HTTP offre una serie di metodi che possono essere utilizzati per
eseguire azioni sul server web. Molti di questi metodi sono progettati per aiutare
gli sviluppatori a implementare e testare le applicazioni HTTP. Gli stessi metodi
però possono essere utilizzati per scopi nefasti se il server web non è configurato
correttamente.

PUT: Questo metodo permette ad un client di caricare nuovi file sul server web.
Un aggressore può sfruttarlo caricando file dannosi, o semplicemente utilizzando
il server della vittima come archivio di file.

DELETE: Questo metodo permette ad un client di cancellare un file sul server
web. Un Penetration tester può sfruttarlo come un modo molto semplice e diretto
per deturpare un sito web o per montare un attacco DoS.

TRACE: Questo metodo ritorna semplicemente al client qualsiasi stringa
inviata al server, ed è usato principalmente per scopi di debug. Questo metodo,
originariamente considerato innocuo, può essere utilizzato per eseguire l’attacco
conosciuto come Cross Site Tracing XST Descritto nella sezione 1.1.

1.12       Metadata Issue
Un corretto comportamento di una funzione che permette di caricare immagini
e/o PDF sarebbe quello di eliminare tutti i metadati che contengono informazioni
sensibili .Ad esempio per le immagini dati relativi alla geo localizzazione, data
,dati relativi al modello e marca del cellulare , nel caso dei file PDF le eventuali
informazioni contenute nei metadati come : orario dell’ultima modifica compreso
fuso orario(ciò permette una grossolana geo-localizzazione ,nome utente ,tipo
di sistema operativo e nome e versione con cui è stato modificato il PDF .
Tutte queste informazioni possono essere utilizzate sia nel campo dell’ingegneria
sociale sia come una sorta di fingerprinting (Fase del Web Pentesting spiegata
nel Capitolo successivo.

                                         13
Capitolo 2

Web Pentesting

2.1      Fasi di un Penetration Testing
   • 1) Fingerprinting
     La prima fase essenziale per eseguire un buon PT. Consiste nel ricavare
     più informazioni possibili sul target del PT, utilizzando per lo più azioni
     passive o i cosiddetti "lateral movements", attraverso svariate tecniche e
     diversi tool che variano a seconda dell’applicativo utilizzato.
   • 2) exploitation
     La fase "exploitation" consiste nel rielaborale tutte le informazioni acquisite
     attraverso la prima fase ed individuare eventuali punti deboli dell’appli-
     cativo web da sfruttare per trovare e verificare la presenza di eventuali
     vulnerabilità. In questa fase i CVE (Common Vulnerabilities and Ex-
     posures) sono di grosso aiuto per il tester poiché indicano dei difetti di
     progettazione presenti in alcuni componenti degli applicativi web di uso
     comune ed il percorso da svolgere per confermare la vulnerabilità.

   • 3) Post-exploitation
     Ultima e più delicata fase del PT. In questa fase il tester utilizza le
     vulnerabilità trovate nella fase precedente per ottenere privilegi maggiori e
     nel caso più eclatante il controllo del server su cui gira l’applicativo WEB.

2.2      Metodologie
2.2.1     Metodologia per rilevare Cross Site Scripting (XSS)
E’ necessario fare un primo discrimine in base alla richiesta HTTP effettuata dalla
pagina che può essere una richiesta di tipo GET o una richiesta di tipo POST
.Se vogliamo testare l’esistenza di un XSS scatenata da una richiesta di tipo
GET basta effettuare del fuzzing su parametri della richiesta concatenando una
stringa contente i caratteri speciali ad un parametro e vedere se la nostra stringa
di test viene riflettuta nella pagina e se i caratteri vengono codificati o "escaped"
.Se la stringa viene riflettuta senza modifica sarà facile per il Penetration tester
generare una payload efficace. Un Penetration tester si può trovare in tre casi,
presupponendo che la propria stringa di test venga riflettuta senza modifica.

                                         14
CAPITOLO 2. WEB PENTESTING

Caso 1)     La propria stringa di test è riflessa nel body della pagina HTML.

Caso 1.a) Se la stringa di test è riflessa al di fuori di un campo HTML il
Penetration tester può utilizzare ho il tag script per eseguire uno script JS o la
combinazione di un event handler e di un qualsiasi tag HTML.

Caso 1.b) Se la stringa è riflessa in un tag HTML il Penetration tester ha
due opzioni. La prima è di chiudere "prematuramente" il tag in cui la stringa di
test è riflessa per poi aprire un tag proprio come nel caso 1. a). Ciò può destare
sospetti nella vittima poiché cambierà la struttura della pagina e come essa verrà
renderizzata. In alternativa il Penetration tester può decidere di iniettare nel
tag in cui la stringa è riflessa e quindi scatenare l’esecuzione di uno script.

Caso 2) La propria stringa di test viene riflessa in un blocco di codice javascript.

Caso2.a) In questo caso il Penetration tester può studiare il funzionamento
dello script e modificarlo a suo piacimento per eseguire codice maligno .Nel
caso la propria stringa di test venga riflessa in un blocco di codice ma come
una variabile di tipo stringa , il Penetration tester può sfruttare il meccanismo
del linguaggio Javascript di gestione del concatenamento delle stringhe .Esempi
concreti di payload efficaci sono stringhe del tipo:
"-alert()-" , "*alert()*" , "^alert()^".

Caso2.b) Nel caso il Penetration tester non riesca a intuire come modificare il
codice Javascript, in cui è riflessa la propria stringa di test, può chiudere il blocco
di codice prematuramente, compromettendo il funzionamento della pagina e
successivamente iniettare la propria payload.

Caso 3) La propria stringa di test è riflessa nella pagina HTML nel tag head.
Da notare che in questo caso il Penetration tester non può far uso degli event
handler messi a disposizione del HTML.

Caso3.a) Nel caso la propria stringa è riflessa nel tag head e più precisamente
nel tag title il Penetration tester e costretto a chiudere il tag title per poi iniettare
la propria payload.

Caso3.b) Se la stringa del Penetration tester è riflessa in un tag meta il
Penetration tester ha due alternative chiudere il tag meta ed inserire un tag
script per far eseguire il codice maligno oppure ricorrere all’uso di sofisticate
payload specifiche per i tag meta.
Nel caso che il Penetration tester voglia iniettare una stringa di test in una
richiesta POST ciò richiede un passaggio in più rispetto ad iniettare una stringa
di test in una richiesta GET. Il Penetration tester può utilizzare due tecniche
ovvero:

Caso 1) L’attaccante intercetta la richiesta di tipo POST attraverso un proxy
e quindi concatena la stringa di test a uno o più valori del parametro della
richiesta POST modificandola.

                                           15
CAPITOLO 2. WEB PENTESTING

Caso 2) L’attaccante può esaminare il codice sorgente per trovare i nomi degli
input e quindi usarli come parametri di una richiesta GET.

WAF Bypass
Per bypassare eventuali WAF (Web Application Firewall) o regole definite
dall’admin del sito è utile conoscere le seguenti tecniche[4]:

   • nel caso il tag  venga eliso dalla nostra stringa di test del tipo
     provare a modificare il tag in modo che non rientri tra nella blacklist del
     firewall modificando il tag nei seguenti modi:
     1) provando a mischiare caratteri maiuscoli e minuscoli. Il WAF potrebbe
     essere impostato per elidere solo la stringa  e quindi non bloccare
     un tag script del genere . In alternativa è possibile ricorrere alla
     codifica di una o più lettere nella codifica url ovvero. Ad esempio inviando
     un input del genere .
     2) In alcuni casi è possibile utilizzare anche il WAF a proprio vantaggio.
     Infatti sapendo che verrà eliminata la stringa  si può iniettare
     la seguente stringa  in modo da ottenere un tag script
     correttamente composto usando i WAF.
     3) Un’altra tecnica consiste di modificare il tag script da  a
     .
     4) Nel caso ogni tag completo, anche se non contiene nulla, venga eliso
     il waf è bypassabile usando l’inizio del commento multi-riga html come
     chiusura del tag ovvero
CAPITOLO 2. WEB PENTESTING

  Esempio:
  Con  si otterrà lo stesso risultato di:
   o 

• Un’altra tecnica per non utilizzare il doppio apice nella propria payload è
  sfruttare un template nativo del linguaggio Javascript, introdotto nel ES6,
  nominato Template Litterals che permette l’uso sia di espressioni in una
  stringa sì di stringhe multi riga. Il carattere speciale che è utilizzato per
  definire l’inizio e la fine del template citato in precedenza è il backtick o
  accento grave in italiano.
  Esempio:
  
  La seguente payload è corretta e funzionante poiché il linguaggio interpreta
  ogni riga del template come una stringa, quindi ‘XSS‘ restituisce "XSS".

• Un ulteriore ostacolo per il Penetration tester causato da un WAF o dalla
  logica dell’applicativo web può essere l’elisione della parte di una stringa
  dopo uno spazio. Per evitare ciò il Penetration tester può utilizzare la
  codifica url dello spazio %20 oppure l’utilizzo di caratteri che svolgono la
  funzione dello spazio come il carattere + oppure il carattere /. È utile
  ricordare che il carattere + non può essere usato nella sua versione in
  codifica url %2c a differenza del carattere / che può essere usato in codifica
  url.

• Il WAF dell’applicativo web può bloccare anche l’utilizzo degli event hand-
  ler elidendoli. Per riscontrare se esiste una blacklist di event handler il
  Penetration tester può utilizzare la seguente tecnica empirica che consistite
  nel verificare se il controllo del WAF è basato sulla tipologia dei caratteri
  o sul numero degli stessi che seguono le lettere "on”. Per effettuare questo
  controllo l’attaccante deve fare più richieste modificando la stringa di test.
  A titolo illustrativo considerare i seguenti esempi.

  Esempio 1:
  I)
  Contenuto della prima stringa di test: “onxxx” -> non si rilevano differenza
  tra la stringa di test e la stringa riflessa dalla WebApp.
  II)
  Contenuto della seconda stringa di test “onxxxx” -> non si rilevano diffe-
  renza tra la stringa di test e la stringa riflessa dalla WebApp.
  III)
  Contenuto della terza stringa di test “onxxxxx” -> si rilevano differenza
  tra la stringa di test e la stringa riflessa dalla WebApp

  Da ciò l’attaccante può ricavare che il WAF non si basa su una blacklist ma
  sul numero di caratteri che seguono la stringa "on”. Di conseguenza il Pe-
  netration tester e costretto ad usare event handler composti da 3-4 caratteri.

  Esempio 2)
  I->X)
  stringa di test onxxx fino a onxxxxxxxxxx ->no modifiche alla stringa di

                                    17
CAPITOLO 2. WEB PENTESTING

     test rilevate.
     Da ciò si riscontra che esiste una blacklist di event handler per bypassare ciò
     l’attaccante può sfruttare: relativamente nuovi tag introdotti dal HTML5
     poiché sono poco noti gli event handler specifici associati. Il Penetration
     tester può sfruttare che linguaggio Javascript può essere usato come uno
     pseudo protocollo. Si può eseguire codice javascript anche attraverso un
     link.
     Esempio:
     
   • Se il WAF dell’applicazione blocca uno specifico carattere url-encoded
     l’attaccante può ricorrere alla tecnica detta "Double encoding" la quale
     consiste nel codificare, come dice, il nome due volte il carattere scelto
     facendo ciò si può bypassare il WAF e il carattere verrà renderizzato
     correttamente.
     Esempio
     Single encoding del carattere " (doppio apice) -> %22
     Double encoding del carattere " (doppio apice) -> %2522
     Da notare che i browser moderni decodificano una solo volta quindi dopo
     la prima decodifica rimarrà la seguente stringa %22 che corrisponde al
     carattere doppio apice.

   • Nel caso il carattere %2f venga reso innocuo da un WAF il penetration tester
     può sfruttare un comportamento dei moderni browser che trasformano il
     carattere %5c nel carattere %2f.

2.2.2     Metodologia per rilevare Click-Jacking
Due sono le condizioni fondamentali per il Clickjacking. La prima è la presenza
di una HtmlInjection la seconda il valore dell’Header X-Frame-Options settato
in uno dei seguenti valori: “allow-from https://example.com/” - “sameorigin”

Come noto questa vulnerabilità sfrutta il tag HTML5 iframe creandone un
iframe a tutta pagina trasparente. Per verificare la presenza del Clickjacking
l’attaccante non deve fare altro che controllare gli header dell’host .Ciò può essere
fatto attraverso una richiesta tramite il comando curl oppure osservando le varie
richieste e le rispettive risposte del server attraverso un proxy per controllare
se è possibile fare un HTML injection , è possibile concatenare una stringa di
test agli n parametri della pagina e poi ispezionare la pagina per verificare che
la stringa di test è stata riflessa senza caratteri "escaped" o codificati.

2.2.3     Metodologia per rilevare una Cross-Site Request for-
          gery CSRF o XSRF
Per verificare l’esistenza di una CSRF l’attaccante deve studiare attentamente le
richieste HTTP, per lo più POST, che permettono di modificare dei parametri
collegati ad un account. Se le richieste di modifica non contengono un CSRF-
Token è contengono un identificativo dell’account facilmente individuabile, come
nome-utente o un identificativo numerico.
Considerare una richiesta POST con i seguenti parametri: Methods=UpdateAccount\id=12345\nome=marco\co

                                         18
CAPITOLO 2. WEB PENTESTING

&password=Passw0rd1&email=marco.nappi@studenti.unina.it
Si noti quanto è semplice cambiare l’utente target della richiesta modificando
il carattere id. In modo del tutto analogo il Penetration tester può modificare
facilmente tutti i parametri. Se uno di questi parametri è vulnerabile ad XSS il
Penetration tester può "consegnare" l’XSS alla vittima senza sforzo.
Se nella richiesta compaiono i parametri usati per il login la CSRF può essere
usata per rubare l’account della vittima in modo semplice e veloce, infatti al
Penetration tester basterà cambiare il parametro email e il parametro password
per ottenere il controllo dell’account della vittima.

2.3      Metodologia Per Testare Broken Acces Con-
         troll
Testare una Web Application per trovare un BAC dipende molto dalla logica
dell’applicativo in sé. Il caso più noto di BAC è il login Bypass ovvero in un’ap-
plicazione web il pannello di login può essere sfruttato per accedere conoscendo
solo l’username della vittima. Questa tipologia di BAC sfrutta la logica del
linguaggio SQL concatenando col nome utente una stringa che ritorna sempre
True e escludendo dalla query la password attraverso l’uso del commento SQL.
Un’altra tecnica per sfruttare il BAC è tramite l’utilizzo dei Google Dork. I
Google Dork sono degli strumenti per filtrare meglio il contenuto delle query
svolte da Google. Se un sito è configurato male attraverso i Google Dork il
Penetration tester può ottenere mail e password attraverso le seguenti query:
"inurl:http://www.target.com AND intext: password"
può indicare l’endpoint in cui sono contenute tutte le password mentre
"inurl:http://www.target.com AND intext:@host.com"
fornirà la pagina, se accessibile pubblicamente, dove sono contenuti gli indirizzi
email degli utenti registrati sul sito. Per trovare eventuali BAC possono essere
utili strumenti di Directory listing, i quali sfruttano o wordlist oppure la meto-
dologia di tipo bruteforce, poiché molte volte di gestori dei siti rendono privati i
path ma non gli endpoint. Un ulteriore tecnica per testare la presenza o meno
di un BAC e quella di studiare le richieste e i cookie della pagina che spesso
presentano parametri o cookie che descrivono i privilegi dell’utente. Modificando
i valori, il penetration tester può scatenare una privalage escalation e come
conseguenza accedere a contenuti che in teoria sarebbero non consentiti. Un
ulteriore tecnica per scatenare un BAC consiste nello sfruttare le OpenRedirect.
Sfruttando le Open redirect e possibile bypassare le restrizioni imposte dal admin.
Un caso molto banale di BAC avviene quando il gestore non modifica password
di default di un servizio contenuto nell’applicazione web, essendo le password di
default di dominio pubblico il Penetration tester può semplicemente utilizzare e
accedere a servizi ai quali in teoria non potrebbe.

2.3.1     Metodologia Per Testare LFI
In linea teorica un Penetration tester potrebbe testare ogni parametro per la
presenza o meno di una LFI, ma basandosi sui nomi e sui valori dei parame-
tri è possibile scartare la maggior parte dei parametri e concentrarsi su quelli
che ritiene possano avere più alta probabilità ad essere affetti da un LFI. In

                                        19
CAPITOLO 2. WEB PENTESTING

generale i parametri che con più probabilità possono essere affetti da LFI so-
no quelli che contengono un path o una pagina web come valore, ad esempio
http://www.target.com/? page=index.php
Per verificare la presenza di un LFI per prima cosa deve stabilire il tipo di
sistema operativo Unix o Windows poiché la stringa di test varia a differenza di
quest’ultimo.
Un esempio di stringa di test nel caso il server sia un server Unix è
/../../../../../../../etc/passwd
mentre un esempio di stringa di test nel caso il server sia un server Windows:
\..\..\..\..\..\..\..\..\boot.ini
Chiunque abbia dimestichezza con il terminale e/o powershell può capire le
azioni intrinseche nella stringa di test. Infatti /../ può essere visto come il
comando unix cd .. mentre \..\ può essere visto come il comando della power-
shell dir \..\. Tutti e due comandi indipendentemente dal sistema operativo
compiono un’azione basilare ovvero risalire al nodo superiore del path. Le
stringhe di test possono contenere n+1 volte la stringa /../ poiché l’obbiettivo
dell’attaccante e di raggiungere la radice o root del path per poi spostarsi, nel
caso Unix, nella cartella etc per poi aprire il file passwd che contente le password,
non in chiaro, di tutti i gruppi e di tutti gli utenti del sistema. Un attacco LFI
può essere sfruttato sia per vedere i contenuti della pagina scritta in PHP sia
per eseguire codice php. In particolare i wrapper php sono fondamentali per
eseguire le azioni precedentemente citate. Inoltre questi ultimi possono essere
usati anche per bypassare eventuali filtri imposti dal WAF. Un altro utilizzo di
un attacco LFI può essere quello di caricare dei file sul server che ospita il web
application. Se il Penetration tester riesce ad ottenere l’accesso attraverso un
LFI ai log di un qualunque servizio quest’ultimo può trasformare una LFI in un
command execution iniettando in qualunque header codice php. Per modificare
una richiesta un Penetration tester deve utilizzare un proxy. Una volta inviata
la richiesta con header contente file php, il Penetration tester non deve fare altro
che visualizzare, tramite LFI, la pagina di log a cui ha accesso.

2.3.2     Metodologia per Testare FileUploadVulnerabilty
E sempre bene ricordare che una fila upload vulnerability può avvenire solo
nel caso il webmaster abbia messo a disposizione una funzionalità di upload
nell’applicativo web. Tre aspetti provocano una fila upload vulnerability:

   • 1) Tipologia di file
     Un buon amministratore web dovrebbe valutare con cautela quali file
     l’utente possa caricare per esempio dovrebbe limitare le tipologie di file
     che l’utente possa caricare solo a file innocui ovvero solo contenuto mul-
     timediale. Per fare ciò l’amministratore può imporre dei controlli sui file
     che l’utente voglia caricare. I controlli sui file possono essere basati su
     estensione del file, MIME del file e su l’header Content-Type.
     Chiaramente Un Penetration tester può bypassare semplicemente i controlli
     sull’estensione del file creando un file con una doppia estensione come per
     esempio exploit.php.jpg. Inoltre essendo il controllo basato su una whitelist
     o su una blacklist un Penetration tester può trovare un’estensione poco
     usata o comunque ignorata dall’amministratore della pagina web. Ad

                                         20
CAPITOLO 2. WEB PENTESTING

      esempio
      file.php -> bloccato invece file.php3 e file. php5 -> non bloccato
      file.php -> bloccato invece file.php.jpg -> non bloccato
      Se non implementato bene il controllo sulla tipologia del file basato sul
      MIME del file può essere facilmente by-passabile. Ad esempio un Pene-
      tration tester intenzionato caricare un file php attraverso una funzionalità
      di upload che permette il caricamento esclusivamente di immagini con
      controllo basato su MIME può modificare il suo file php aggiungendo come
      prima riga il MIME di un altro tipo di file consentito (Es. .gif ovvero
      GIF89;). Se invece il controllo e basato sul header Content-Type il Pe-
      netration tester può intercettare la richiesta con un proxy e modificare
      l’header. Così facendo non avrà problemi a caricare il file maligno.
   • 2) Dimensioni file
     Caricare un file di grosse dimensioni può causare un Denial of Service(DOS),
     anche involontario al server su cui si sta tentando di caricare il file.
   • 3) Nome File
     Il nome del file può sembrare innocuo ma può causare svariati problemi
     all’applicativo web poiché se il nome del file viene riflesso in una pagina
     può essere usato dal Penetration tester per eseguire una XSS di tipo stored.

2.4      Metodologia di Test per OpenRedirect:
Per verificare la possibilità di un Open Redirect su un’applicazione web un
penetration tester può sfruttare un proxy in modo da verificare tutte le richieste
HTTP e estrarre le richieste contenenti come parametri degli indirizzi http. Una
volta identificate le eventuali richieste il Penetration tester può semplicemente
inviare una richiesta modificando l’url dell’indirizzo nel parametro cosi da reindi-
rizzare la vittima ad un sito malizioso.
Un secondo modo per realizzare un attacco Open redirect è sfruttare un HTML
injection che l’attaccante non riesce a trasformare in una XSS ad esempio:
CLICK ME. Un terzo modo per reindi-
rizzare un utente verso un altro sito web e utilizzare una XSS che esegue codice
javascript. Questo è più efficace rispetto ad un open redirect scatenata da un
HTML injection poiché l’attaccante può predisporre l’open redirect in modo che
scatti in caso di alcune azione dell’utente oppure può far scattare l’open redirect
non appena la pagina abbia finito di caricarsi.
Esempio:
Payload nel caso sia riflessa nel body della pagina e non in un tag

2.4.1     Metodologia Per testare SQLi
IL primo approccio per testare possibilità di effettuare un attacco del tipo
SQL injection è quello di modificare i parametri inserendo caratteri speciali
che potrebbero essere interpretati dal DBMS sottostante dell’applicativo WEB.
Esistono due principali categorie di SQL injection: Error Based e Blind. Le
SQL injection di tipo Error based sono le più semplice da rilevare e sfruttare a
proprio vantaggio poiché nel momento in cui un Penetration tester scopre un

                                        21
CAPITOLO 2. WEB PENTESTING

SQL injection error based verrà’ renderizzato un warning o un error contente
la Query inviata al database che ha scatenato l’errore e anche il database che è
utilizzato dall’applicativo Web.

Metodologia per testare SQLi Error Based La metodologia su come tro-
vare un eventuale SQL injection Error based è relativamente semplice se si ha
una conoscenza di come è strutturata un Query nel linguaggio SQL. Infatti al
Penetration tester basterà inserire o un singolo apice ’ o un doppio apice “, ciò
dipende da quale dei vari DB è utilizzato, per scatenare un errore SQL.
La parte più farraginosa di SQL injection non è la scoperta ma bensì sfruttare
questa vulnerabilità’ per avere accesso ai dati, file dell’applicativo e la possibilità
di caricare o rimuovere eventuali file di qualunque formato.
Esempio
La richiesta http://www.target.com? id=1 non scatena alcun errore
invece la richiesta http://www.target.com? id=1’ o http://www.target.com? id=1"
scatena errore MYSQL
Una volta che il Penetration tester ha scoperto la vulnerabilità dovrà procedere
a scoprire quale tabella interroga la query e quante colonne ha quest’ultima.
Per scoprire quante colonne compongono la tabella il Penetration tester dovrà
procedere iniettando il comando order by n1,n2,n3,...,n per poi troncare la
query in anticipo con un carattere che nel linguaggio SQL inizia un commento
ovvero : #,/*,-- Il carattere cancelletto detto anche hash ,%23 o #, il Penetration
tester dovrà ricordare di codificarlo in url-encoding poiché se non codificato
il carattere # esclude tutti i parametri alla sua destra dalla richiesta al server.
Il Penetration tester dovrà procedere utilizzando il comando order by fino a
raggiungere l’indice n+1 non presente sulla tabella che scatenerà un errore SQL
e l’attaccante saprà’ che il numero di colonne corrisponde ad n.
Esempio:
http://www.target.com?id=1 order by 1/* no errore SQL
http://www.target.com?id=1 order by 2/* no errore SQL
http://www.target.com?id=1 order by 3/* no errore SQL
http://www.target.com?id=1 order by 4/* no errore SQL
http://www.target.com?id=1 order by 5/* errore SQL -> tabella composta
da 4 colonne Una volta scoperto il numero delle colonne presenti sulla tabella il
Penetration tester deve scoprire quante di esse può sfruttare per ottenere infor-
mazioni usando il costrutto Union. Inviando una richiesta dopo aver iniettato
il codice SQL union all select 1,...,n/* il Penetration tester visualizzerà nella
pagina gli indici che identificano le colonne della tabella su cui si sta effettuando
la query.
Esempio:
http://www.target.com?id=1 union all select 1,2,3,4 /*
Da ora in avanti il Penetration tester dovrà’ procedere o per esperienza o utiliz-
zando delle wordlist. Infatti ora il Penetration tester dovrà procedere a trovare il
nome della tabella del Database di cui vuole ottenere le informazioni. Esempio:
http://www.target.com?id=1 union all select 1,2,3,4 from tabella/*
se la tabella esiste la pagina caricherà normalmente altrimenti il Penetration
tester dovrà iterare il procedimento fino a che la pagina carichi correttamente.
Una volta scoperto il nome della tabella, il prossimo passo è dedurre i nomi
delle colonne che formano la tabella. Per verificare se la tabella presa in esame

                                      22
CAPITOLO 2. WEB PENTESTING

contenga la colonna con un determinato nome il Penetration tester deve solo
cambiare leggermente la query iniettata usando al posto di uno dei numeri il
presunto nome della colonna.
Esempio:
http://www.target.com?id=1 union all select 1,2,colonna,4 from tabella/*
se il nome della tabella esiste sulla pagina web al posto del numero verrà visua-
lizzato il primo valore della colonna. Per far in modo di far rvisualizzare tutti i
valori della colonna si può utilizzare la seguente payload:
http://www.target.com?id=1 union all select 1,2,concat(colonna),4 from
tabella/*

Metodologia per testare SQli Blind Le SQL injection di tipo Blind sono
più difficili da rilevare che da sfruttare. Testare la possibilità di effettuare o
meno di un SQL injection di tipo Blind può essere difficile da rilevare infatti
le SQL injection Blind non visualizzano sulla pagina dell’applicativo web un
errore ma bensì si manifesteranno attraverso una lieve modifica della pagina web
un’immagine leggermente spostata o testo non formattato correttamente. Un
ulteriore difficoltà è aggiunta dal fatto che il Penetration tester non disporrà
della query né del nome del database in uso. Per scoprire versione e modello
del DB in uso il penetration tester dovrà sfruttare le proprie conoscenze dei
Database. l’attaccante inoltre potrà porgere solo query il cui risultato sarà vero
o falso, intesi secondo la Logica Booleana.
Per verificare la possibilità o meno di una Blind SQL injection si può utilizzare
la seguente tecnica: concatenare al, parametro AND 1=1 o AND 1=2 in modo
che il risultato della query sia un valore booleano Esempio:
http://www.target.com?id=1 AND 1=1 -> La pagina carica correttamente
http://www.target.com?id=2 AND 1=2 -> La pagina caricherà con qualche
difetto grafico
Il passo successivo consiste nel trovare il nome della tabella da cui si vuole
ottenere dati. Come in un SQL Injection Error Based si procede per tentativi
utilizzando la seguente payload, and (select 1 from _tabella limit 0,1)=1, conca-
tenata al parametro vulnerabile
Esempio:
http://www.target.com/?id=3 and (select 1 from tabella limit 0,1)=1
Se la tabella esiste e quindi la query da come risultato il valore booleano True
la pagina caricherà correttamente. Se la tabella non esiste (e quindi otterremo
come risultato False) la pagina caricherà con dei piccoli difetti
Seguendo la logica della SQL injection di tipo Error Based una volta ottenuto
il nome della tabella il Penetration tester deve ottenere il nome della colonna
con la seguente payload ricavata modificando la precedente: and (select sub-
string(concat(1,colonna),1,1) from tabella limit 0,1)=1
Esempio
http://www.target.com/?id=3
and (select substring(concat(1,colonna),1,1) from tabella limit 0,1)=1
Se la query darà come risultato false la pagina caricherà con qualche difetto e si
avrà la conferma che non esiste la colonna in quella determinata tabella.
A differenza della SQL injection Error Based esistono n passaggi successivi infatti
nella SQL injection Blind il primo valore della colonna non verrà renderizzato
nella pagina ma dovremmo ricavarlo carattere per carattere attraverso l’uso di

                                       23
Puoi anche leggere