Подтвердить что ты не робот

Что такое Cross Site Script Включение (XSSI)?

Недавно я заметил, что XSSI упоминается на нескольких страницах, например. Эксплуатация и защита веб-приложений:

Браузеры не позволяют страницам одного домена читать страницы в других доменах. Но они не препятствуют тому, чтобы страницы домена ссылались на ресурсы в других доменах. В частности, они позволяют отображать изображения из других доменов и сценариев, которые должны выполняться из других доменов. Включенный script не имеет собственного контекста безопасности. Он работает в контексте безопасности страницы, которая включала его. Например, если www.evil.example.com включает script, размещенную на www.google.com, тогда script работает в злом контексте, а не в контексте google. Таким образом, любые пользовательские данные в этом script будут "течь".

Я не вижу, какие проблемы безопасности возникают на практике. Я понимаю XSS и XSRF, но XSSI для меня немного загадочна.

Может ли кто-нибудь набросать эксплойт на основе XSSI?

Спасибо

4b9b3361

Ответ 1

Обычно это проблема, если вы используете JSONP для передачи данных. Рассмотрим веб-сайт, состоящий из домена A, который загружает данные из домена B. Пользователь должен быть аутентифицирован на сайтах A и B и потому, что одна и та же политика происхождения предотвращает связь старых браузеров напрямую с другим доменом (B), чем текущая страница (A), разработчики решили использовать JSONP. Таким образом, сайт A включает script, указывающий на http://B/userdata.js, что-то вроде:

displayMySecretData({"secret":"this is very secret", ...})

Таким образом, A определяет функцию, называемую displayMySecretData, а когда включен входящий script из сервера B, он вызывает эту функцию и отображает секретные данные пользователю.

Теперь идет злой сервер E. Он видит, что A включает данные из B, используя JSONP. Таким образом, сервер E включает в себя тот же script, но определяет свой собственный displayMySecretData, который вместо этого убирает данные. Затем злоумышленник обманывает пользователя, посещая его сайт. Когда пользователь идет туда, и он вошел в систему B, браузер автоматически отправляет файлы cookie аутентификации для B вместе с запросом fecth script из B. B видит пользователя, прошедшего проверку подлинности, и, таким образом, возвращает script, как ожидалось, E получает данные и пре...

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

Ответ 2

XSSI не ограничивается jsonp-ответами. В некоторых браузерах вы можете переопределить конструктор Array. Если ответ Json содержит [...], и вы включаете его как script, он будет выполнять новый конструктор вместо встроенного. Исправление состоит в том, чтобы вставить что-то в ответ, который не может быть проанализирован как ])}while(1);</x>, а затем использовать код для его удаления перед его разбором. Злоумышленник не может этого сделать, поскольку включение script всегда равно script.

Подробнее о проблеме и этом решении в http://google-gruyere.appspot.com/part3#3__cross_site_script_inclusion

Ответ 3

XSSI - это причудливый способ сказать: вы включаете в свою программу, кого-то elses-код; Вы не имеете никакого контроля над тем, что находится в этом коде, и у вас нет контроля над безопасностью сервера, на котором он размещен.

Например, скажем, я включаю в мою страницу html

<script type="text/javascript" src="http://mymatedave.com/js/coolwidget.js"></script>

Этот script будет запускаться в моем webapp с тем же уровнем доверия, что и любой из моих собственных javascript-кодов. Он будет иметь доступ к полному содержимому страницы и DOM, он сможет читать все мои куки файлы приложений и читать нажатия клавиш для пользователей и мыши, а также все остальное, что может сделать javascript.

Если мой помощник дэйв, то решает поставить что-то злобное в свой классный виджет (скажем, сниффер/кейлоггер, который отправляет все файлы cookie пользователя, формирует данные и нажатия клавиш на свой сервер), тогда я не обязательно буду знать. Кроме того, безопасность моего приложения теперь зависит от безопасности сервера dave. Если dave-сервер получает компрометацию, а coolwidget.js заменяется злоумышленником, я снова не обязательно буду знать, и вредоносный код будет запущен как часть моего приложения.