История взлома баннерной сети или охота на referer’ы

История взлома баннерной сети или охота на referer’ы

Автор: Михаил Чернов

http://www.abc-it.lv/

Порой бывает так, что для проникновения в чужую систему, злоумышленнику вообще не приходиться искать какие-либо уязвимости в ней, т. к. поистине ценная находка его ожидает в log`ах собственного веб-сайта. Прежде чем приступить к повествованию, я хочу предупредить вас, что вся информация, представленная в этой статье, служит чисто в ознакомительных целях. Чтобы указать на возможные недоработки разработчикам web-приложений. Автор не несёт никакой ответственности за использование этой информации, в целях, запрещённых Уголовным Кодексом, или какого-либо другого законодательства!!!.

Итак, всё по порядку:

Что такое referer?

referer — это url (интернет адрес) страницы, с которой браузер осуществил переход на текущую страницу. Например, если имеется страница расположенная по адресу "http://www.site1.com/page1.html " и с помощью гиперссылки браузер с неё переходит на страницу "http://www.site2.com/page2.html", то referer’ом в данном случае окажется адрес первой страницы (http://www.site1.com/page1.html).

Зачем нужен referer?

referer широко используется в системах для подсчёта статистики. Для того, чтобы администратор веб-сайта мог следить за количеством посетителей, пришедших на его ресурс с того или иного сайта (и/или страницы). Когда referer может быть опасным? Он может быть опасен в тех случаях, когда адрес ссылающейся страницы на сайте содержит в себе критическую информацию, т. е. пароли, хэши паролей, сессии (словом — всё то, что может облегчить жизнь потенциальному взломщику)…

Пример опасного referer’а: http://www.bannerz.com/cgi-bin/banneradmin.cgi?login=admin&passwd=qwerty&url=http://abc.tsi.lv

История взлома баннерной системы

Всё началось с того, что в один прекрасный день (или вечер, уже точно не помню), Вася Пупкин, для привлечения новых посетителей на свой сайт, решил установить баннер. Для достижения намеченной цели, Вася выбрал подходящую баннерную сеть, зарегистрировался, разместил там надлежащим образом свой баннер и добавил код системы на свой сайт. Убедившись, что всё работает как надо, он со спокойной душой продолжил играть в half-life 2 =).

Как говорят в таких случаях — «долго ли, коротко ли», но при проверке статистики на следующий день Васю ждал приятный сюрприз. Оказывается пока он спал, на сайт заходил администратор баннерной системы, а самое главное, что в статистике от этого посещения остался «реферер» следующего вида:

http://www.bannerz.com/cgi-bin/banneradmin.cgi?

login=admin&passwd=qwerty&url=http://abc.tsi.lv В данной строке отчётливо виднелся как логин, так и пароль администратора системы! А что ещё нужно было нашему герою для «незначительного» увеличения количества показов своего баннера и других манипуляций с системой?! Правильно — ничего! Вот таким образом и была взломана баннерная сеть.

Как избежать этой ошибки при написании сценариев?

1) Для того, чтобы важные данные не попадали в строку адреса, а соответственно и в поле referer, рекомендуется отсылать их с помощью http метода post, а не get.

Вот примеры «иллюстрирующие» отличия методов get и post

html форма отсылаемая методом get:

<form name=”adminf” method=”get”

action=”http://www.bannerz.com/cgi-bin/banneradmin.cgi”>

<input type=”hidden” name=”login” value=”admin”>

<input type=”hidden” name=”passwd” value=”qwerty”>

<input type=”hidden” name=”url” value=”http://abc.tsi.lv/”>

</form>

url формирующийся в строке браузера после отсылки формы (get):

http://www.bannerz.com/cgi-bin/banneradmin.cgi?

login=admin&passwd=qwerty&url=http://abc.tsi.lv

html форма отсылаемая методом post:

<form name=”adminf” method=”post”

action=”http://www.bannerz.com/cgi-bin/banneradmin.cgi”>

<input type=”hidden” name=”login” value=”admin”>

<input type=”hidden” name=”passwd” value=”qwerty”>

<input type=”hidden” name=”url” value=”http://abc.tsi.lv/”>

</form>

url формирующийся в строке браузера после отсылки формы (post):

http://www.bannerz.com/cgi-bin/banneradmin.cgi

Разница очевидна!

Заключение

И в заключение хочу посоветовать всем программистам веб-сценариев быть более бдительными при разработке своих проектов. И не допускать критическим данным «просачиваться» в адресную строку. Ведь, referer не является единственным способом получения адресов из строки браузера. Ещё существует массив history, который содержит информацию обо всех ресурсах, к которым пользователь обращался во время текущего сеанса работы с браузером. Но это уже тема отдельной статьи. Поэтому на этом я с вами прощаюсь. До встречи! Пока!