Nell'articolo a cui sei collegato, il codice Javascript non viene incluso all'interno del file immagine stesso, si sta manifestando all'interno della pagina HTML che fa riferimento all'immagine. L'input non attendibile viene restituito all'interno del tag immagine senza una convalida o una sanificazione sufficienti. Questo è scripting cross-site persistente poiché l'input dannoso viene restituito ogni volta che qualcuno visualizza la pagina che include questa immagine (cioè è probabilmente memorizzata nel database come parte del profilo dell'utente).
Convenzionalmente, la marcatura HTML per includere un'immagine del profilo potrebbe essere simile a questa:
<img src="/imagename.jpg">
Tuttavia, deve essere diverso per ogni utente, quindi il codice dell'applicazione che lo genera potrebbe apparire simile a questo (l'esempio è PHP):
<img src="/<?=$imagename?>">
Quindi, se l'utente Alice ha caricato alicespic.jpg
, gli utenti vedrebbero quell'immagine quando hanno visitato il suo profilo, ad esempio. Tuttavia, è qui che si può verificare la vulnerabilità, se il nome dell'immagine non è correttamente convalidato o disinfettato.
Ad esempio, se Mallory può impostare il nome dell'immagine del suo profilo su inncoent.jpg" onload="alert(1)
, verrà generato il seguente markup HTML:
<img src="/inncoent.jpg" onload="alert(1)">
L'utilizzo dell'evento onload implica che lo script arbitrario verrà eseguito una volta che l'immagine ha terminato il caricamento. In sostanza, questo codice Javascript verrà eseguito ogni volta che qualcuno visualizza il profilo interessato, ma verrà eseguito all'interno del loro browser.
Ciò non si verificherebbe se lo sviluppatore consentisse l'inclusione di caratteri sicuri all'interno del nome dell'immagine.