Общий шлюзовый интерфейс (Common Gateway Interface, CGI) – это стандартный способ, которым веб-сервер передает запрос клиента размещенным на нем приложениям и отсылает ответ пользователю. Если вы посылаете поисковый запрос на веб-сайт – например, на сайт розничной электронной торговли, – веб-сервер передает запрос в приложение базы данных и затем форматирует ответ перед тем, как предоставить его пользователю. Или если посетитель заполняет анкету на веб-странице, то эта информация передается в соответствующее приложение для последующей обработки. Иногда вы можете видеть команды CGI в адресной строке браузера – это непонятные значки и цифры в конце URL; в других случаях они не видны пользователю. Это часть HTTP, все ею пользуются. Сценарии CGI – это небольшие программы на веб-сервере, которые работают с данными. Например, они задают принцип обработки анкет на веб-страницах.
Сложности при работе со сценариями CGI в том, что каждый из них – потенциальная прореха в системе безопасности. Манипулируя сценариями CGI, можно совершать самые неожиданные веши. Вот ряд примеров (все они действительно имели место): загрузка файла с веб-сервера, просмотр всего содержимого базы данных, загрузка списка покупателей и их персональных записей, кража денег у клиентов электронного банка, торговля чужими контрольными пакетами акций и просмотр системных журналов веб-сервера, в которых записаны договоры клиентов.
Другие похожие атаки проводятся путем помещения исполняемого кода (обычно сценарии Perl или код JavaScript) в текстовые поля. Таким путем можно заставить веб-сервер внести изменения в домашнюю страницу, показать секретный ключ SSL или доставить другие неприятности, о которых сказано в предыдущем абзаце. Этот метод также позволяет использовать переполнение буфера и другие ошибки программирования (см. главу 13), чтобы вызвать поломку веб-сервера или, что еще лучше, захватить этот сервер в свои руки.
Один пример: в 1998 году в результате атаки против Hotmail стало возможным увидеть учетные записи электронной почты других людей. eBay также подвергся атаке; злоумышленники поместили троянского коня, написанного на JavaScript, в поле описания товара. Это поле видел любой, кто просматривал товары, выставленные на продажу, и в результате злоумышленники получали информацию о тысячах учетных записей.
Один недостаток CGI позволил злоумышленникам загружать секретную персональную информацию с различных сайтов. Другие сценарии CGI использовались, чтобы взломать веб-сервер. В конце 1999 года были предприняты две атаки – атака Poison Null («отравленный» нуль), позволившая хакерам просматривать и изменять файлы на веб-сервере, и атака Upload Bombing (бомбежка при пересылке), наводнившая веб-серверы бесполезными файлами, которые очень быстро превращались в атаки-сценарии, так что любой мог при желании их использовать[35].
Включения на стороне сервера (Server Side Includes, SSI) – это указания для вебсерверов, встроенных в HTML-страницы. Непосредственно перед отправкой страницы браузеру веб-сервер выполняет все SSI, содержащиеся на странице, и помещает на нее результаты своей работы. Атаковать SSI так же выгодно, как и все остальное.
Можно атаковать уязвимые места в стороннем программном обеспечении: на специфических веб-серверах, в их приложениях. Сюда относятся приложения для баз данных, программы «корзины», сервер транзакций и другие. Эти атаки зависят не от того, как сайт использует приложение, а от самого приложения (СУБД Oracle, например). Злоумышленники могли бы загрузить исходную программу с веб-сервера, разрушить сервер, получить привилегии доступа на уровне администратора для входа на сервер, запустить на сервере произвольную программу и т. п. В отличие от прорех безопасности, вызванных сценариями CGI, установление уязвимых мест в дополнительных приложениях не находится под контролем сайта; это обязанность поставщиков стороннего программного обеспечения.
Существует множество похожих атак. Внося изменения в скрытые поля на некоторых веб-страницах (эти поля можно увидеть при просмотре начала страницы), есть шанс взломать сценарии CGI и заставить некоторые программы «корзин» изменить цены предлагаемых товаров. (Вплоть до «назовите свою цену».) Некоторые атаки направлены на cookies: порча cookie. Злоумышленники входят на сервер и вручную меняют свои аутентификационные cookies на cookies других пользователей. Иногда эти cookies зашифрованы, но часто не очень надежно.
Некоторые атаки носят название написания перекрестных сценариев. Это довольно неудачное название: атаки заключаются не столько в написании сценариев, и речь не идет о пересечении. То, что они так называются, сложилось исторически. Суть в том, что Веб скрывает в себе множество мелких хитростей; когда вы смешиваете сценарии CGI, JavaScript, фреймы и cookies, cookies и SSL, итог может оказаться неожиданным и нежелательным. Использование различных платформ одновременно – это спорный путь, в результате нетрудно получить непредсказуемое взаимодействие различных компонентов сложных систем.
Такие атаки по нескольким причинам направлены преимущественно на сценарии CGI. Большинство сценариев CGI написаны непродуманно, и они широко распространены среди пользователей. Вы получаете набор сценариев вместе с программным обеспечением или от своего провайдера. Часто люди, занимающиеся написанием сценариев, не имеют опыта в программировании. Они не слишком хорошо разбираются в проблемах безопасности, которые могут возникнуть из-за применения сценариев или вследствие взаимодействия сценариев с другими частями программного обеспечения сервера. А веб-сервер не имеет возможности контролировать работу CGI-сценариев. Поэтому иногда сценарий создается для одной цели и, если он используется для другой, повреждает защиту.
Атаки CGI – мощные, против них мало что устоит. Конечно, можно написать безопасный CGI-сценарий, но едва ли кто-то это сделает. Одна компания занималась проверкой веб-сайтов на предмет недостатков в приложениях вроде CGI-сценариев – она не нашла ни одного сайта, который нельзя взломать. Это – стопроцентная уязвимость.
Веб – конфиденциальность
Номинально веб-просмотр анонимен. В реальности существует много способов идентифицировать пользователя. Я уже говорил, что по cookies можно следить за перемещением пользователя с сайта на сайт и даже включить в cookie адрес электронной почты или другую личную информацию (если пользователь заполняет анкету или отвечает на электронное сообщение).
Вдобавок на большинстве веб-серверов все доступы регистрируются. В регистрацию обычно входит IP-адрес пользователя, время запроса, информация о том, какая запрошена страница, и имя пользователя (если оно известно из каких-нибудь регистрационных протоколов). Впрочем, большинство веб-сайтов просто выбрасывают эти регистрационные записи.
Конечно, IP-адрес пользователя – это все же не имя пользователя, но многие веб-браузеры установлены на машинах с единственным пользователем, напрямую подключенных к Всемирной паутине. Те пользователи, которым приходится дозваниваться, обладают большей анонимностью, чем пользователи с кабельным модемом или DSL-соединением (Digital Subscriber Line, цифровая абонентская линия), но часто для идентификации достаточно установить провайдера. Например, в 1999 году неизвестный угрожал бомбой, отправив сообщение с регистрационной записи Hotmail. Электронная почта Hotmail содержит IP-адреса веб-браузеров, с которых отправляли почту. IP-адрес принадлежал America Online, и полиция, сравнив его и записи Hotmail, смогла проследить электронное сообщение до индивидуального пользователя America Online.
В данном случае для нарушения конфиденциальности были экстренные причины, но большинство таких действий можно автоматизировать. Коммерческие веб-сайты, как правило, не слишком стараются защитить конфиденциальность клиента. Фактически, многие из них делают деньги на рекламе. Другие сайты сознательно посягают на конфиденциальность посетителя, чтобы осуществлять направленную рекламу: это разные «цифровые бумажники», список компаний, производящих программное обеспечение и всякое другое. Многие компании рассматривают целевую рекламу как своего рода бизнес при помощи Интернета.