JavaScript e l'auto-completamento modulo

Ritratto di 0xnan

Già ti vedo: ogni giorno quando arriva il tempo da dedicare ad internet, apri le solite pagine: controlli le mail; i diversi Social Network; commenti le notizie del tuo giornale preferito.
Per gustare appieno il web interattivo, è ormai necessario possedere un account per ogni cosa.
Nella monotonia quotidiana ci si ritrova ad inserire il solito username e la solita password: come non confermare quando il browser ci chiede di salvare le credenziali? Ogni mossa risparmiata è un guadagno, specialmente se è il browser ad occuparsi di scrivere e il nostro compito diventa solo cliccare su "login".
Si dice che "nessuno regala niente", ebbene anche in questo caso la comodità ha un prezzo...

Ipotizziamo di trovarci sulla seguente pagina X completa di modulo di login:

<html>
<body>
<form action="" method="POST">
<input type="text" name="user" />
<br><br>
<input type="password" name="pass" />
<br>
<input type="submit" value="Enter"/>
</form>
</body>
</html>

ipotizziamo altresì che la pagina soffra di una grave falla XSS nella gestione di qualche variabile (per comodità GET) che permetterebbe ad un attacker di eseguire codice javascript visitando un semplice link del tipo:

miosito.cz?var=alert('Javascript')

di per se questo è gravissimo e le applicazioni sono infinite ben oltre il classico Cookie Grabber.
A tal proposito mentre osservavo un modulo automaticamente completato ho pensato che se il testo era realmente tale e non una visualizzazione del browser (che ha il controllo sul rendering della pagina) era fattibile catturarlo.
L'idea è di aspettare il caricamento della pagina (grazie a window.onload) e di ciclare ogni tag "input" e fare del contenuto (se è presente) qualsiasi cosa; l'unico problema che ho riscontrato è che il browser compila i form poco dopo che l'intero html è stato caricato.Per ovviare a questo dettaglio ho inserito un ritardo nella funzione che cicla i tags:

function run(){
var tags=document.getElementsByTagName("input");
for(i=0;i<tags.length;i++)
alert(tags[i].value);
}
window.onload=function(){
window.setTimeout("run()",500);
};

Il codice è in una forma espansa e mostra solo, tramite un alert, il contenuto di tutti i tag input.
Con un po' di fantasia si può ridurre:

window.onload=function(){
window.setTimeout("var tags=document.getElementsByTagName(\"input\");for(i=0;i<tags.length;i++)alert(tags[i].value);",500);
};

Sostituendo all'innocuo alert, controlli del contenuto, redirect, o qualche forma di invio si possono catturare i form già compilati in maniera quasi del tutto trasparente.
È ovvio che i più famosi siti web, quelli che alle spalle possiedono programmatori attenti, non sono facilmente vulnerabili al Cross Site Scripting, ma vi garantisco che il web è pieno zeppo di disattenzioni, occhio a cosa salvate!