В начале 90-х интернет был очень базовым и простым для понимания. По сути, это были два компонента: веб-сервер и браузер.
На локальном компьютере вы устанавливали браузер, который, получив URL, отправлял HTTP GET-запрос на сервер, на котором запрашиваемый ресурс. Затем этот сервер отвечал текстом, но не просто текстом. HTTP означает протокол передачи гипертекста, и этот гипертекст может быть, например, HTML-документом. Проще говоря, это текстовый файл с HTML-кодом, а браузер - это программа, которая интерпретирует этот код и отображает для вас приятный интерфейс веб-сайта.
Но настоящая сила заключается в возможности связывать ресурсы вместе с помощью тегов link
. Вы можете ссылаться на другие документы и другие веб-сайты.
![](https://habrastorage.org/getpro/habr/upload_files/ad5/832/26a/ad583226aea11527fe4f01c241b6b49f.png)
При нажатии на такую ссылку ваш браузер изменял "местоположение" (location
).
Информация теперь стала по-настоящему взаимосвязанной и ее было легко просматривать ("browse-ить").
Но это было только начало. Примерно в 1994-1995 годах в интернете появился Amazon.
![](https://habrastorage.org/getpro/habr/upload_files/ea1/401/c55/ea1401c555916e7e90068a50e7c0875e.png)
Это было время, когда в интернете стало появляться все больше и больше реальных услуг: онлайн-банки, интернет магазины, веб-почты и т.п.
Технологии развивались очень быстро.
На стороне клиента, в браузере, появилось больше возможностей, например формы.
![](https://habrastorage.org/getpro/habr/upload_files/cfe/cec/acc/cfececaccebb67fa519d26323da6e77d.png)
Люди могли вводить текст в формы и отправлять контент на сервер. И, конечно же, развивалось серверное ПО.
Инженерам приходилось придумывать решения новых проблем, например, как хранить товары в корзине интернет-магазина на стороне клиента, на его компьютере.
Так в июне 1994 года разработчики браузера Netscape изобрели cookie.
![](https://habrastorage.org/getpro/habr/upload_files/a7c/a44/d49/a7ca44d49e3be56386ba50a8fe053926.png)
Вот как они описывают cookie:
![](https://habrastorage.org/getpro/habr/upload_files/1e4/554/71a/1e455471a67441ed3b11001b66023652.png)
"Когда вы просматриваете веб-страницу, любые cookie, которые серверы могут отправлять на вашу копию Netscape Navigator хранятся в памяти вашего компьютера. Когда вы выходите из Netscape Navigator, любые cookie, срок действия которых еще не истек, записываются в файл cookie, чтобы их можно было загрузить снова при следующем запуске Netscape Navigator ...
Netscape Navigator не отправляет никакие cookie на другие веб-серверы, для которых они не предназначены".
Вот, например, у меня есть старая версия Netscape, и я создал простую страницу входа с cookie.
![](https://habrastorage.org/getpro/habr/upload_files/3ce/2c1/daf/3ce2c1daf9d68ca2cd2ffcf9421ab9c1.png)
После ввода данных входа, вы видите, как это работает, мы можем войти в систему как администратор.
![](https://habrastorage.org/getpro/habr/upload_files/0e2/01e/096/0e201e09680da38e5eb19f2848dc281e.png)
Теперь начинается самое интересное. Вот примечания к выпуску бета-версии Netscape 2.0:
![](https://habrastorage.org/getpro/habr/upload_files/4a3/508/c4e/4a3508c4ec215c0f9eabfad8fc877ec1.png)
"LiveScript в настоящее время реализован только в Windows. Остальные платформы будут поддерживаться в бета-версии 2".
К сожалению, ссылка на документацию по LiveScript, похоже, утеряна.
Вскоре после этого, взглянув на страницу выпуска бета-версии 2, мы можем прочитать следующее: "Built-in JavaScript". LiveScript теперь называется JavaScript.
![](https://habrastorage.org/getpro/habr/upload_files/2f8/241/3af/2f82413afbc7bccba9423233d2e899e2.png)
"Netscape Navigator теперь включает встроенный язык сценариев (скриптов), называемый JavaScript. JavaScript разработан на основе языка JAVA, который расширяет и улучшает возможности HTML документов. JavaScript поддерживает большинство синтаксисов выражений JAVA и основные конструкции потока управления, но без строгой проверки типов и статической типизации JAVA. JavaScript встроен в HTML-документ с помощью тега SCRIPT, и для запуска сценария не требуется компиляция".
И вот документация с красивой таблицей сравнения JavaScript и Java:
![](https://habrastorage.org/getpro/habr/upload_files/1c3/dcd/f58/1c3dcdf58023a4dcb15d004455d1ba09.png)
Как мы знаем сегодня, это изменило все. В интернете теперь есть обработчики событий, которые могут реагировать на клики и наведения курсора мыши, вы можете определять объекты или работать со временем и датами, а так же получать доступ к формам и текстовым вводам от пользователя и т.п., все это прямо в браузере пользователя. JavaScript сделал веб-сайты динамичными.
Теперь воспользуемся Netscape 2.0, выпущенную в сентябре 1995 года, который впервые поддерживает JavaScript.
![](https://habrastorage.org/getpro/habr/upload_files/582/4ef/5ce/5824ef5ceed2b58a3deef7873e02583f.png)
В то время веб-сайты активно использовали фреймы (теги <frame>
). Они является предшественниками сегодняшних тегов <iframe>
. В документации JavaScript вы можете увидеть, например, HTML-код для framest
с двумя столбцами, где каждый frame
ссылается на отдельный URL.
![](https://habrastorage.org/getpro/habr/upload_files/94d/d11/42a/94dd1142ad7f7547c6f8ec9588e42be7.png)
Так вы можете реализовать панель навигации и содержимое страницы.
Вот, например, сайт Элвиса Пресли:
![](https://habrastorage.org/getpro/habr/upload_files/b3c/3b6/48b/b3c3b648be8da5d8102e605a7aeb5e22.png)
Как вы видите, фреймы действительно интегрированы в браузер. И посмотрите на документацию. JavaScript так же может взаимодействовать с фреймами
![](https://habrastorage.org/getpro/habr/upload_files/e29/97f/3be/e2997f3be44b14eeca440b7f959b4c36.png)
Разберем на примере. Вот код с frameset
с разными веб-сайтами.
![](https://habrastorage.org/getpro/habr/upload_files/396/19c/ba8/39619cba80a9ee9a408c7278122acb31.png)
Как вы видите, это разные домены.
Один домен - это страница входа, которую показывали ранее.
![](https://habrastorage.org/getpro/habr/upload_files/a19/26c/272/a1926c27293c9ec15cd23e694a2358be.png)
А другой фрейм - это страница злоумышленника.
![](https://habrastorage.org/getpro/habr/upload_files/a82/9ba/8cf/a829ba8cfea6ef2003a77007b2e0b3b5.png)
Теперь загрузим страницу с этими двумя фреймами в браузере Netscape и посмотрим, что произойдет:
![](https://habrastorage.org/getpro/habr/upload_files/fd7/c04/3d1/fd7c043d1c6cd616237e60dd95eb1ed7.png)
В фреймах два разных сайта, но сайт атакующего получил доступ до имени пользователя, его пароля и файл cookie сессии со страницы /login.php
другого сайта.
Если посмотреть на код сайта злоумышленника, то мы сможем найти JavaScript-код, ответственный за такое поведение:
![](https://habrastorage.org/getpro/habr/upload_files/2ba/798/de9/2ba798de929bc525e3e64c9a3980b908.png)
После небольшого timeout, чтобы дать другому сайту достаточно времени для загрузки, вызывается метод stealPassword()
. А данный метод просто следует иерархии фреймов.
![](https://habrastorage.org/getpro/habr/upload_files/7e2/a5e/96e/7e2a5e96e320814d17ace48759712f5d.png)
Он переходит к фрейму top
, далее получает доступ к frame2
, оттуда к объекту window
, далее к document
, а там получает доступ к форме документа с именем пользователя и паролем. И, конечно, он так же имеет доступ к document.cookie
.
Далее данные помещается в текстовое поле для демонстрации:
![](https://habrastorage.org/getpro/habr/upload_files/370/968/428/37096842883a90b3c1ab303ef819cfb0.png)
Теоретически мы могли бы отправить эту информацию злоумышленнику.
С сегодняшней точки зрения это кажется абсолютным безумием. Просто посетить вредоносный веб-сайт, который с помощью фреймов может загрузить фрейм банковского сайта, украсть ваши cookie или даже выполнить транзакции по переводу денег. Но для того времени это был совершенно новый вектор атаки, и еще не существовало такого понятия, как Cross-Site Scripting (XSS).
Однако разработчикам не потребовалось много времени, чтобы осознать проблему. Несколько месяцев спустя они выпустили Netscape 2.02 с исправлением.
![](https://habrastorage.org/getpro/habr/upload_files/4c4/378/f0f/4c4378f0fb608b7f024eb628b5f72ad4.png)
И вот перед нами новый браузер. Попробуем теперь открыть зловредный веб-сайт, чтобы воспроизвести атаку, но сталкиваемся с ошибкой "Формы нельзя индексировать как массив":
![](https://habrastorage.org/getpro/habr/upload_files/1f6/093/0f2/1f60930f2d07b91e6de4c7bb23fbd3ba.png)
Эта ошибка означает, что мы больше не можем получить доступ к формам другого веб-сайта:
![](https://habrastorage.org/getpro/habr/upload_files/5fc/d19/d1e/5fcd19d1e56d93e99099e48dcece12e0.png)
Даже убрав код доступа к формам и попытавшись получить доступ до файла cookie другого сайта, ничего не получится.
Давайте кратко рассмотрим примечание к выпуску и обновлениям безопасности в версии 2.02 относительно JavaScript:
![](https://habrastorage.org/getpro/habr/upload_files/24e/05a/15a/24e05a15ad5f2b6bea55e5feeabf5565.png)
"Из-за проблемы с реализацией Netscape Navigator 2.0 возникла проблема конфиденциальности, поскольку серверный скрипт мог получить доступ к списку имен локальных файлов и каталогов на машине пользователя ... Navigator 2.02 исправляет эту проблему, запрещая скрипту с сервера доступ к просмотру имен файлов и директорий с локальной машины пользователя".
Это имеет смысл, т.к. браузер так же может просматривать локальную файловую систему:
![](https://habrastorage.org/getpro/habr/upload_files/9f3/810/230/9f3810230d0aa48ad757f646f272257a.png)
Итак, вместо "фрейминга" другого веб-сайта, мы могли бы "фреймить" локальную директорию, например, папку C:\
:
![](https://habrastorage.org/getpro/habr/upload_files/05a/ee4/3ca/05aee43cab8bf526be441dea6abf422c.png)
Посмотрите на написанный JavaScript код, мы просто получаем доступ ко всем ссылкам на странице и извлекаем их:
![](https://habrastorage.org/getpro/habr/upload_files/342/d13/168/342d13168575720b3e1b015aa82088b5.png)
Я думаю, именно ЭТО они на самом деле осознали как проблему (issue). Возможно это была самая первая уязвимость, связанная с JavaScript в истории.
Теперь эта фраза "...поскольку серверный скрипт мог получить доступ к списку имен локальных файлов и каталогов на машине пользователя" имеет смысл
![](https://habrastorage.org/getpro/habr/upload_files/05e/4bc/979/05e4bc9791082a447b95d2cd4371a16a.png)
Итак, как вы можете видеть, проблема доступа к данным с других веб-сайтов здесь явно не упоминается, проблема заключалась именно в доступе к локальным файлам и именам директорий.
Итак, каким-то образом они сделали так, что другой скрипт больше не может получить доступ к фреймам с именами файлов. Но то, как они решили эту проблему, становится намного яснее с выпуском Netscape 3:
![](https://habrastorage.org/getpro/habr/upload_files/627/679/ce5/627679ce539ea5fe76ee55ccff1d481e.png)
"Navigator версии 2.02 и более поздние версии автоматически не позволяет скриптам на одном сервере получить доступ к свойствам документов на другом сервере"
Теперь становится понятно, что Netscape только что изобрел ту самую Политику Одного Источника (Same Origin Policy) - JavaScript, работающий на одном источнике (или сервере) не может получить доступ к данным на другом источнике (сервере).
Сегодня мы знаем последствия этого решения. Все эти уязвимости на стороне клиента, такие как CSRF, XSS, Clickjacking и т.п. связаны с этим основным принципом безопасности Политики Одного Источника. Однако в то время, в 1995 году, не было очевидно, что это будет иметь такое большое значение.
Комментарии (2)
unreal_undead2
01.08.2024 11:36Но настоящая сила заключается в возможности связывать ресурсы вместе с помощью тегов
link
Основная сила всё таки в <a>, <link> достаточно специфичен.
muxa_ru
Да ладно, наверняка были были люди, которые говорили о рисках, но их обозвали параноиками и противниками прогресса. :)