Тег вида <link rel=import> импортирует содержимое стороннего документа на текущую страницу (вжух http://w3c.github.io/webcomponents/spec/imports/index.html). А в Google Chrome можно импортировать html из любого файла, с абсолютно любым типом контента (заголовок
Для примера, создадим файл с случайными данными и добавим вконце тег script
Теперь попробуем его импортировать: https://bo0om.ru/bin.html
И скрипт выполнится!
Таким образом, достаточно загрузить любой файл на ресурс, будь это валидное изображение или любой другой документ, в тело которого предварительно записан js - и вызвать его с помощью
Content-type
) в том числе, если будет присутствовать указание не пытаться определить содержимое (X-Content-Type-Options: nosniff
).Для примера, создадим файл с случайными данными и добавим вконце тег script
head -c 1000000 /dev/urandom > /tmp/bin.bin
echo "<script>alert()</script>" >> /tmp/bin.bin
Теперь попробуем его импортировать: https://bo0om.ru/bin.html
И скрипт выполнится!
Таким образом, достаточно загрузить любой файл на ресурс, будь это валидное изображение или любой другой документ, в тело которого предварительно записан js - и вызвать его с помощью
<link rel=import href=/path/to/file>
. Так как обращение идет к ссылке текущего домена - такая ссылка не будет заблокированна Chrome XSS Auditor'ом.