Информационная безопасность
[RU] switch to English


Еще раз о взломах HTML-чатов

3APA3A, 1998

1. ЧАСТЬ ПЕРВАЯ, или показываем свое.

Основу интерфейса практически любого чата соствляют динамически генерируемые HTML-формы, связанные между собой посредством javascript. В практически всех чатах имя пользователя и пароль (или некий идентификатор, который генерируется при входе пользователя) хранятся внутри формы в качестве скрытого (hidden) элемента и могут извлекаются оттуда посредством скрипта. Заставив кого-либо из посетителей чата выполнить свой javascript, Вы можете, по сути, получить полный контроль над ним - сказать фразу от его имени или выдать его пароль.

Для человека, знающего хотя бы основы HTML и Javascript, не составит труда разобраться в структуре интерфейса чата, но вот подсунуть в эту структуру "троянский" скрипт - это проблема.

В простейшем случае, когда набираемый вами текст показывается в окне чата "как есть" - без какого-либо контроля - вы просто вводите текст вашего скрипта. Если возникает проблема с ограничением на длину строки - разбейте скрипт на несколько коротких функций.

Но в большинстве чатов все же имеется проверка, которая не дает ввод большинства "опасных" тегов, в т.ч. и <script>, либо запрещены теги вообще. Но тем не менее во многих случаях удается ее обойти. Ведь помимо тэга <SCRIPT> есть еще и казалось бы безобидные теги <A>, <IMG> <FORM> и другие, которые позволяют задать URL как javascript: или задать отклики объекта на события: OnClick, OnMouseOver и т.д.

Кроме того, теги могут проверяться в основном окне чата, но не контролироваться при вводе информации о пользователе. И можно вставить скрипт, например, в информацию о себе. Тогда тот участник чата, который имел неосторожность посмотреть вашу информацию получит вместо нее ваш скрипт. Например, следующий скрипт помещенный в личную информацию успешно работал на чате Copris (сейчас чат, похоже, накрылся, так что я смело его помещаю):


 <script>
 for( I=1 ; I<=11 ; I++ ){
  if( I==1 ) alert( "Че те надо?????" );
  else alert( "Я тя " + ( (I==11)? "последни" : I ) 
	+ "й раз спрашиваю - че те надо???" );
 }
 alert("а здесь все равно нету нифика...");
 top.frames['Inform'].document.forms[0].Accent.options[31].selected = 1;
 top.frames['Inform'].document.forms[0].Announce.value   =  
	"Я  люблю тебя, 3APA3A!";
 top.frames['Inform'].document.forms[0].submit();
 top.frames['Dark'].document.forms[2].submit();
 </script>

Этот безобидный скрипт дает alertы посетителю, после чего помещает признание любви к 3APA3е от имени посетителя в общее окно чата. Это стимулирует остальных посетителей на просмотр личной информации о 3APA3е. Тем не менее, скрипт можно было сделать и менее дружественным - например, посылать в приват пароль посетителя, который хранится в виде в виде скрытого элемента формы в каждом фрейме. Более того, можно было бы даже написать что-то типа вируса, который, например, меняет имя пользователя на "3APA3A" и ставит ему соответствующий пароль. Таким образом можно "заразить" всех участников чата. Изменение скрипта таким образом, чтобы высылать в приват пароль посетителя и превращать его в 3APA3у (при этом все его сообщения будут исходить от 3APA3ы, но видеть сообщения для нее он не будет), требовало ровно пять дополнительных строчек на javascript (три на первое действие и два на второе).

Похожая дыра присутствует в очень многих чатах, где посетителю позволяют выбрать цвет или размер текста. Как правило, вводимые им значения цвета не проверяются. Напрямую, или путем модификации странички, сохранив ее на диске (в том случае, если цвет предлагают не ввести и выбрать из набора), можно, например, в качестве цвета вместо любимого значения 'black' задать '><script' (если таг печатается в чате как <FONT COLOR=black> Если печатаются кавычки (COLOR="black"), то задача несильно усложняется - надо всего лишь их нейтрализовать, например '"><script p="'.

Как правило, тип шрифта указывается непосредственно перед фразой введенной посетителем. Так что в своей фразе вы теперь смело можете писать любой скрипт! Так мы имеем возможность закинуть Javascript в общее окно чата, что открывает обширные возможности... Но, нужно отметить, что засунуть закрывающий таг тоже может быть достаточно сложно, а без этого скрипт работать не будет. Впрочем, иногда скрипт просто удается засунуть в COLOR целиком.

2. ЧАСТЬ ВТОРАЯ, или смотрим чужое.

И, наконец, существует несколько способов простого хищения паролей из чатов. Если чат расположен на сервере apache, и проверяет имена пользователей по файлу htpasswd (при этом ваш браузер выкидывает окошко с предложением ввести имя и пароль для доступа к ресурсу), то всегда есть вероятность, что нерадивые администраторы положили его в доступный каталог. Можно для этого воспользоваться URL типа http://www.somechat.com/chat/.htpasswd. Точное расположение файла можно узнать стянув файл .htaccess из данной директории. Это, обычно не удается. Но часто удается стянуть его копию, которая осталась с последнего редактирования файла, например http://www.somechat.com/chat/.htaccess~ или http://www.somechat.com/chat/.htaccess.old (в том случае, если копии этих файлов любезно оставлены администратором).

Если чат расположен на Микрософтовском сервере и использует ODBC для доступа к базе данных паролей, то можно попытаться стянуть файл с базой, например если она имеет формат Microsoft Access и хранится в том же каталоге, то достаточно просто угадать ее имя, чтобы получить полную информацию обо всех пользователях вместе с паролями :) Классический пример - чат "Пластилин" (я уже послал уведомление администраторам чата): http://www.plastilin.nnov.ru/talkzone/talkzone.mdb

Следует сразу заметить, что почти все сказанное выше справедливо не только для HTML-чатов, но и для других WEB-сервисов, таких как доски объявлений (WWW-boards) или гостевые книжки (Guestbooks).

О сайте | Условия использования
© SecurityVulns, 3APA3A, Владимир Дубровин
Нижний Новгород