В очередной раз раскручивая тему HiJacking нашел веселый способ получать худо-бедную информацию о целевом ресурсе, когда пользователь находится на странице злоумышленника.

Уже заезженный тэг <img> открывает новые возможности с помощью метода fileSize, описанного тут: http://msdn.microsoft.com/en-us/library/ms533752(v=VS.85).aspx

Рассмотрим простейший пример – веб-приложение после авторизации предоставляет какую-то картинку для пользователя, например:

http://example.com/getImage.php?image=myAvatar

Злоумышленник, зная это, может создать страницу следующего содержания:

<img id=”onsec” src=”http://example.com/getImage.php?image=myAvatar” >

<input type=”button” onclick=”if (onsec.fileSize>0) { alert(‘authorized on example.com’) else { alert(‘not authorized on example.com’)}”>

Таким образом, злоумышленник узнает в простейшем случае, есть ли у целевого пользователя доступ  к example.com.

Продолжая тему, хочется заметить, что в ряде случаев, удается получить дополнительную информацию из самого значения размера картинки. Это может быть любая логическая информация веб-приложения, скажем, один и тот же скрипт может показывать администраторам картинки одного размера, а пользователям – другого. Таким образом, получаем права пользователя. И так далее.

Очень хотелось бы, чтобы метод возвращал размер не только “валидных” картинок, но и HTML страниц, JSON, etc. Но это, к сожалению, не работает. Может быть, конечно, есть исключения, призываю исследовать данный вопрос.

У меня еще есть мысли исследования на тему векторных картинок в XML формате, ведь HTML часто бывает валидных XML и тогда…

Проверил на тестовой версии IE9, но он не поддерживает SVG внутри тэга <img>, а только как отдельный тэг.

Работает в IE8, в Opera 10.52 не работает, дальше проверяйте, пишите, если не трудно.

Для всех броузеров, кстати, остается возможность применять такие же методы используя атрибуты width и height. Проведя соответствующий анализ целевого приложения можно получать информацию аналогично описанному.

Ну и стоит добавить сюда комментарий небезызвестного Дэна Камински (Dan Kanisky), отправленный по рассылке Full-Disclosure:

2010/4/22 Dan Kaminsky <dan@doxpara.com>:
Interesting use, using filesize to back into the actual CAPTCHA used for a
given query. Sneaky!

So it’s possible to read not only filesize, but image dimensions
cross-domain. I actually found a use for this — it’s a good way to
exchange a small amount of data between sites that mutually distrust one
another. The reason for this is that images are pretty much the only
resources that can be loaded cross-domain that won’t have embedded script
executed by a browser.

(Side note: At this point, you’re probably thinking: Vladimir just said
that some browsers allow SVG to load via <img> — and SVG can embed script
with nothing but a script tag and a smile! Doesn’t this mean a bunch of
sites are in trouble?

Turns out, no, not as far as I can tell anyway. IE and Firefox both block
<img> to SVG entirely, while Chrome, Safari, and Opera allow it. But there
appears to be a script firewall (or more accurately, a missing connection)
between <img>-loaded SVG and the script engine. Static SVG renders just
fine, but don’t expect it to do anything unless you top-level nav, inline,
or use something like embed.)

Back to image dimensions, it turns out that this information channel cannot
be closed; even if the dimensions of the object itself couldn’t be queried,
the XY positioning of the objects *around* the imported images must be both
queryable and dependent on image properties.

I was curious however if img.fileSize would leak filesizes of non-image
content. Doesn’t look like it does — undefined in everything but IE, -1 in
IE.

Also, Billy Hoffman has done a lot of fun work in this space, see
http://www.gnucitizen.org/blog/javascript-remoting-dangers/

Собственно, тут нечего добавить, разве что, Дэн не прочитал последний абзац, так как он был дописан только в блог и несколько позже.