Взлом чата ч.2



  • Часть 1
  • Часть 2


  • Вариации на тему

    В предыдущей главе мы рассмотрели случай, когда цвет вставлялся в текст странички без ограничивающих кавычек. А что же делать если кавычки все же есть? Например текст в чате выглядит следующим образом:

    Путник- Alpha, привет))
    Alpha- Всем приветик! !!

    Как видим, цвет вставляется в обрамляющих кавычках. Эта проблема легко решается, если чат не отфильтровывает символ ' . Если это так, то мы можем просто закрыть открытую кавычку, и затем писать наш скрипт. Например, задав значение цвета как red' size=20 ' <FONT color=#00ff00> мы опять получим эффект с большим шрифтом. Обратим внимание на пробел и апостроф в конце. Они необходимы, для того, что бы закрывающая кавычка, которую вставит сам чат, не разрушила наши атрибуты. В результате наше сообщение будет иметь вид:

    Shram- Hi

    Если же чат не пропускает символ кавычки, которая обрамляет значение параметра, то взломать чат через данный параметр не удастся :((. Хотя и здесь возможны некоторые штучки: см. конец данной главы.

    Этот метод очень часто (почти всегда) срабатывает для задаваемого адреса электронной почты (в параметрах чатланина или в поле обратного адреса в форумах и гостевых книгах). Как правило ссылка на мыло идет в форумах следующим образом:

    <a href="mailto:mylo@myla.net">Федя Пупкин</a>

    (фрагмент mailto: шлюз вставляет сам). Тогда задав в качестве мыла значение " style=background-image:url(javascript:аlert('Ну_нету_у_меня_мыла!')) ", мы посылаем алерт любому посетителю форума :)) (заметим, что на адрес мыла, как правило, фильтры вводимых символов не устанавливаются). Правда некоторые форумы и чаты как бы проверяют мыло, но эта проверка сводится к требованию присутствия символа @. Если это так, то порадуем создателей форума и нарисуем им собачку следующим образом: mylo@myla.net" style=background-image:url(javascript:аlert('Ну_нету_у_меня_мыла!'))".

    В некоторых чатах допускается вставка собственных картинок, заданием адреса картинки. Как мы уже знаем, там где есть URL, там можно вставить и скрипт. Даже не буду это разжевывать. Все и так ясно.

    В первой главе было показано как изменить входную форму чата. В частности нужно было изменить относительный адрес поля action на абсолютный. Однако, структура чата может быть настолько сложной, что таких замен может потребоваться очень много. Менять во всех случаях адреса неудобно (да и можно ошибиться). Вместо этого, можно порекомендовать тег <base href='http://typachat.ru/'^gt;, который вставляется в любое место HTML документа. При этом, все относительные адреса будут адресоваться относительно адреса указанного в теге base (в данном случае относительно typachat.ru), независимо от реального базового DNS имени.

    Вы наверно знаете что такое снифферы? Если нет, то я вам скажу сниффер - очень полезная штука, позволяющая отслеживать траффик. В случае с чатом, сниффер позволяет определить IP адреса находящихся в чате, а также и их временные имена и коды (для чатов с временными именами). Иногда это даже позволяет получить админские права :)).

    Часто бывает так, что ник в тексте чата выступает как ссылка, при нажатии на которую, можно послать приватное сообщение чатовцу. Вот как это выглядит в HTML:

    Alpha- Привет!

    Модератор- Привет!

    Помимо эффекта, описанного в главе "Чудеса с символом =", здесь возможена вставка скрипта, срабатывающего на событие клика по ссылке (если чат не отфильтровывает ограничивающие кавычки - в данном случае " - и символ +). Для этого, в качестве ника, зададим следующее значение: "+alert('Hello!')+". Можно вставить что-нибуть и посерьезнее (только воспользовавшись функцией toString()). Например такой ник "+toString(open('//yahoo.com','_top'))+" отсылает юзера, тыкнувшего на ваш ник, отдохнуть от чата вYahoo :)).

    Взлом чата M

    Как уже упоминалось в первой главе, существует два метода взлома чатов. Все приведенные выше примеры относились к первому методу - методу проникновения в параметры тега. Здесь я хочу показать технологию второго метода - метода нарушения структуры HTML.

    Цвет сообщений в чате М задавался в числовом виде (и потому имел ограничение на длинну цвета - 7 символов), имел причудливые фильтры, но пропускал одиночный символ '. Вот фрагмент сообщений в чате:

    <font class="а1">22:41:24 </font> <a href= "javascript:parent.parent.sewho('РТУТЬ')"onMouseOver="window.status='';return true;" target=kbd><font color=#0066ff class="ку">РТУТЬ:</font></a><font color=#FF0000 class="уц">ПЛУГиПРЕЙ:КОРОШО!</font><br><br><SCRIPT>top.do_scrolldown();</SCRIPT><br><font class="а1">22:41:25 </font> <a href="javascript:parent.parent.sewho('Весь_в_сертах')"onMouseOver="window.status='';return true;" target=kbd><font color=#0000FF class="ку">Весь_в_сертах:</font></a><font color=#0000FF class="уц">Денис_Семенов: ПРАВИЛЬНЕЙ БУДЕТ ВСЕ</font><br><br><SCRIPT>top.do_scrolldown();</SCRIPT>

    Как видим цвет указывался без обрамляющих кавычек. Технология взлома проста: логинимся под произвольным ником, и цветом '. Затем, войдя в чат, выдаем сообщение типа 'style=background-image:url(javascript:alert('Hello_people!!')). Обратим внимание на пробел в конце - он обязателен. Наше сообщение выглядит следующим образом:

    <font class="а1">22:41:24 </font> <a href="javascript:parent.parent.sewho('Algol')"onMouseOver="window.status='';return true;" target=kbd><font color=#0066ff class="ку">Algol:</font></a><font color=' class="уц">'style=background-image:url(javascript:alert('Hello_people!!'))</font><br><br><SCRIPT>top.do_scrolldown();</SCRIPT>

    При этом оказывается, что часть HTML кода - class="ку"> - оказалась внутри одинарных кавычек,и рассматривается браузером как строка-значение цвета. В эту строку попадает и закрывающая угловая скобка тега, благодаря чему наше сообщение оказывается внутри тега! Часть кода, идущая непосредственно после нашего сообщения не понимается браузером и игнорируется (причем эта часть должна быть отделена пробелом от нашего параметра style, иначе параметр вцелом будет считаться ошибочным) , а вот вслед идущая угловая скобка считается закрывающей тег font. Все очень просто.

    Немного о символе обратного слэша

    В строках-константах JavaScript имеется один специальный управляющий символ. Это символ обратного слэша \. Одно из его назначений следующее: идущий за ним символ кавычки считается именно символом, а не ограничителем строки. Например:

    <script>alert('It\'s')</script> - не выдает сообщение об ошибке, поскольку апостроф в комбинации с \ в середине строки не считается концом строки. В то время, как <script>alert('It's')</script> выдает сообщение об ошибке.

    Поскольку сам символ \ является управляющим (и поэтому не отображается непосредственно в строке), то для отображения самого себя существует комбинация \\. Такой такая комбинация отображается как просто символ \.

    Какое это все имеет отношение к взлому чатов? А вот какое: некоторые чаты не ставят фильтр на символы кавычек " (или ') в поле ника, а заменяют их на комбинации типа \" (или \'), полагая что в таком случае кавычки будут отображаться но не смогут выступать как ограничители, и следовательно не могут разрушить структуру HTML. При этом недальновидные разработчики упускают из виду то, что и юзер может использовать символ \ для блокировки ихнего символа \. К примеру фрагмент чата для сообщения юзера с ником Sh"ram выглядит следующим образом:

    <a href='javascript:msgto("Al\"gol")'>Sh"ram<a>

    В таком случае кавычка в нике не нарушает структуры тега. Но если мы поменяем ник на Al\"gol, то вставив слэш перед кавычкой чат создаст следующий HTML:

    <a href='javascript:msgto("Al\\"gol")'>Sh\"ram</a>При этом наш слэш блокирует слэш чата, и кавычка ника разрушает структуру HTML! Это видно если тыкнуть на ссылку в примере.

    Этот эффект можно использовать для взлома чатов методом разрушения структуры HTML. Обратим внимание на то, что в некоторых случаях таким же методом можно блокировать ограничивающие кавычки, вставив в конец ника обратный слэш.

    Недавно я заметил еще одну дырку, связанную с неправильным использованием символа \ программистами чатов. Пусть, например, ник пользователя вставляется в тело чата в виде

    <a href='javascript:msgto("Algol")'>Algol</a>Если мы изменим свойник на Al'gol, то чат примет такой ник, но заменит на Al\'gol , наивно полагая, что вставив обратный слеш, они защитят тег от разрушения. На самом деле это не так :). При вставке такого ника в тело чата, это будет выглядеть так:
    <a href='javascript:msgto("Al\'gol")'>Al'gol</a>.
    При этом эксплорер выдаст сообщение об ошибке, при попытке тыкнуть на ник. Причина в следующем: знак \ имеет смысл только внутри строковых констант джаваскрипта, но не HTML! Сам HTML символ \ не понимает, и потому считает первый же найденный апостроф концом атрибута href, несмотря на то, что перед ним стоит \. Таким образом, например такой ник Algol'= разрушит структуру тега, несмотря на то что перед апострофом вставится обратный слеш

    Взлом на уровне http

    Как уже упоминалось, сервер чата может отслеживать поле referer HTTP запроса, и не пускать в чат, если это поле отличается от нужного. Для того что бы обойти это припятствие нужно отловить заголовок HTTP запроса, отсылаемого чатом на сервер (с помощью специальных программ, например Naviscope) и написать специальную програмку, которая отсылает запросы на сервер. При этом содержимое запросов (напрмер значения поля цвета) можно задавать произвольно.

    Не буду останавливаться на этом подробно. Это выходит за рамки взлома HTML.

    Отмечу лишь, что на уровне HTTP можно делать более хитрые штуки, чем обычными средствами HTML или JavaScript. В любом случае рекомендую просматривать заголовки HTTP запросов при работе в чате. Они помогут вам более подробно разобраться в работе чата.

    Чудеса с символом =

    Как вы думаете, что будет отображаться в браузере для такой строчки HTML:

    <font onclick=alert('=')>Text</font>? Держу пари не угадаете (если вы конечно не работаете в Microsoft и не разрабатывали MSIE). Результат настолько специфический, что я не смог сделать пример, который бы его продемонстрировал . Но можете поверить на слово, что в окне браузера будет отображаться следующее: <fontonclick=alert('=')>Text Как видите, открывающий тег  в данном случае просто напросто не воспринимается браузером как тег, хотя синтаксических ошибок нет :)). А что будет если мы напишем Text

    Как ни странно, в таком случае все будет в порядке, хотя налицо ошибка синтаксиса. А если мы кликнем на тексте, выскочит алерт =. Попробуйте переместить третий апостроф за угловую скобку, или за текст: 

    <font onclick=alert('=')>Text'</font> Получится тоже неожиданный результат.

    К сожалению я не имею исходников или подробной документации для MSIE, но я думаю что в данном случае имеет место явная ошибка в MSIE. Вероятно браузер анализирует код в два этапа. На первом этапе он выделяет теги, их атрибуты и текст, который находится между ними, а на втором он анализирует JavaScript-содержимое параметров тегов (речь идет только про те атрибуты, которые допускают значение-скрипт, например href или onclick ). При первичном анализе браузер по непонятной причине считает комбинацию =' началом строки, несмотря на то, что символ = уже находтся внутри  строки! Затем приняв =' за начало строки, программа ищет конец (при этом начисто забыв про то, что еще одна строка открыта и не закрыта). Таким образом все что следует за =' (либо =" ) и до следующего символа ' игнорируется и считается строкой! Поэтому в первом примере браузер не воспринимал тег: он не нашел закрывающей угловой скобки, поскольку она находилась (как бы) внутри строки. Но еще более удивительно то, что на втором этапе анализа параметров тега, браузер все воспринимает правильно (в этом можно убедится нажав на надпись Textво втором примере), и воспринимает строку там где надо, и находит закрывающую угловую скобку тоже там где надо. Это ведет к тому, что фрагмент Text из третьего примера не является отображаемым текстом (поскольку как бы не является телом тега), но и не является параматром тега (поскольку на этапе анализа параметров, до нее компилятор просто не доходит)! Пламенный привет Биллу!

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

    <a href=javascript:parent.window.messageFor("=")>=</a><br><br><a href=javascript:parent.window.messageFor("Модератор")>Модератор</a><br>

    При этом мой ник в списке просто не отображался, поскольку фрагмент между кавычками 

    )>=</a>a href=javascript:parent.window.messageFor( оказался вне тела тегов :-}. Зато при нажатии на Модератор, функция parent.window.messageForвызывалась с параметром =. Аналогичные "эффекты" были и при отображении моих сообщений в чате.

    Замечательно (или печально - смотря для кого) то, что данный глюк проходит практически везде где можно хоть че нить ввести (по крайней мере для MSIE 5.50.4134.0600), и для этого даже не надо ничего менять в форме. А плохо то, что от этого трудно добиться существенной пользы (например запуск скрипта).

    В заключении отметим, что аналогичным эффектом обладает и символ >, который воспринимается как конец тега, несмотря на то, что он находится внутри строки. Фрагмент

    <font onclick=alert('>')>Text</font> интерпретируется браузером как ошибочный, и он выдает ругательство на то, что не закрыта строковая константа.

    Два взлома чата T

    Чат T пропускал следующие символы в поле цвета:

    ' ` = ;

    При вставке цвета в чат, обрамляющих кавычек не было. Фрагмент сообщений в чате (кстати автор чата видимо не считает нужным закрывать теги )), хотя будем надеятся что это сделано для повышения быстродействия):

    <FONT COLOR=008000><a href=javascript:parent.window.Mtm('22:18:18')>22:18:18</a>- <a href=javascript:parent.window.mfor('BalamUY')>BalamUY</a> :  вошел в комнату <FONT COLOR=green><a href=javascript:parent.window.Mtm('22:18:03')>22:18:03</a> - <a href=javascript:parent.window.mfor('Fialka')>Fialka</a> : Sponsor> Если интересная, то ниче. 

    Смущало то, что пробел не пропускался фильтром. Однако, после некоторых раздумий, я нашел следующее решение - сам цвет я взял в одинарные кавычки, а после цвета без пробела вставил параметр style: 'red'style=background-image:url(javascript:while(1==1)open()). Как отмечалось во второй главе разделительный пробел в данном случае не обязателен :)).

    Кстати в этом чате было полно фреймов, и в том числе были скрытые и пустые - вероятно задумывались для каких-либо будущих расширений. Но пока админы думали над расширениями, я нашел им более полезное применение. Я в этом чате висел достаточно долго - несколько месяцев. И висел не просто так: в один из скрытых фреймов я пихал свой сайтик. А на сайтике были баннеры баннерной сети. Таким макаром я накрутил себе около сотни тысяч баннеропоказов, а мой сайт подскочил до 5-6 места в рейтинге хитов Rambler Top 100 (в своей группе). К сожалению, баннерная сеть сопоставила отношение хиты/хосты и поняла что ее водят за нос. Получалось что один и тот же посетитель заходит на мой сайт раз по 50 в день. Мой аккаунт заблокировали. Так наверно до сих пор там и висит, неприкаянный :)).

    Но вернемся к нашим баранам. Спустя некоторое время администрация чата заменила cgi-шку. Не знаю какие "улучшения" были сделаны в second edition, но я лишь заметил одно изменение: теперь длинна строки-значения цвета была ограничена, и составляла около 10 символов (кстати такое ограничение стоит во многих чатах, хотя я не понимаю какой в них смысл? Не легче ли поставить фильтры на вводимые символы? Хотя возможно таким образом они защищаются от переполнения буфера?). При таком раскладе, конечно старый метод уже не работал. Втиснуть в 10 символов приличный скрипт нельзя (тут даже и сам style не помещался). Я понял, что можно ломать только через ник или вторым методом - разрушая стрктуру HTML. Несколько часов я пробовал так и этак. Кроме дешевого эффекта исчезновения ника (глава "Чудеса с символом =") ничего не получалось. Ломка структуры ничего не давала по следующей причине: вставляя вместо цвета символ ' я открывал строку, но она закрывалась апострофом который шел в ссылке на время (тут чату просто повезло - это не было задумано как защитная мера, хотя многие чаты вставляют специально для этого фиктивные теги типа <! ' " ' > ):

    <FONT COLOR='><a href=javascript:parent.window.Mtm('22:18:18')>22:18:18</a> - <a href=javascript:parent.window.mfor('Algol')>Algol</a> Привет!

    То есть коментировался только фрагмент <a href=javascript:parent.window.Mtm(. И все чего я добился это удаление тега ссылки на время. Если бы было возможно вставлять вместо однарных кавычек, двойные, то проблемы бы не было, ведь в чате двойные кавычки не применялись. Но символ " не пропускался фильтром. Заход под ником типа Algol= тоже ничего не давал поскольку, символы после 'Algol=')>игнорировались и не считались параметрами тега. Работал конечно еще вариант описанный в конце главы "Вариации на тему", но эти скрипты срабатывали только при нажатии на ссылку моего ника :((. Я уже готов был признать что целиком чат взломать нельзя. И тут в последний момент, копаясь и эксперементируя в недрах HTML, я обнаружил что символ обратного апострофа тоже является ограничителем строк в HTML !!! И этот символ пропускался фильтром! Недолго думая я залогинился с ником Algol и цветом ` . А потом в качестве сообщения в чат послал такую строку: `style=background-image:url(javascript:alert('Победа_будет_за_нами!')) . Мое сообщение в теле чата выглядело следующим образом:

    <FONT COLOR=`><a href=javascript:parent.window.Mtm('22:18:18')>22:18:18</a> - <a href=javascript:parent.window.mfor('Algol')>Algol</a>`style=background-image:url(javascript:alert('Победа_будет_за_нами!'))

    При этом фрагмент <a href=javascript:parent.window.Mtm('22:18:18')>22:18:18</a> - <a href=javascript:parent.window.mfor('Algol')>Algol</a> полностью коментировался и считался как бы цветом, а параметр style оказывался внутри тега ! Скрипт сработал :)).

    Так что программистам чата T придется разрабатывать новую версию своего детища. Остается толко удивлятся как много лазеек они оставляют, и как медленно их исправляют. Говорят все дело в психологии: разработчики защитных систем не могут поставить себя на место взломщика, а судят о системе со своей стороны, вместо того, что бы посмотреть на нее снаружи.

    "Перехват", "подлог" и получение прав.

    Рассмотрим методы захвата чужих сообщений (приватов) и отсылки сообщений от лица других чатовцев. Существуют разные методы перехватов, предназначенные для разных типов чатов. Если чат полностью взломан то операция "подлога" (т.е. вставка реплик от имени других чатовцев) не составляет труда: нужно лишь послать жертве в приват скрипт, который будет записывать некоторый текст в строку реплики, а затем нажимать кнопочку "отправить". Анологично можно вытянуть и приват юзера. Однако такие методы слишком грубы, примитивны и трудны в применении. Более совершенны такие методы перехвата, при которых сам чат принимает вас за другого юзера.

    При создании HTML-чатов, основная проблема заключается в том, что HTTP протокол, в принципе, не поддерживает постоянных  соединений. Это значит, что каждый раз, когда вы хотите получить сообщения  или отослать реплику, программа чата должна "узнать" вас, понять, что вы это вы. Если бы она не узнавала юзеров, она бы не смогла присылать вам ваши приваты, и не смогла бы писать ваши сообщения от вашего  имени. Для идентификации участников, чаты используют разные методы. Наиболее часто используются метод IP-адресов и метод динамических имен. Первый метод основывается на том, что у одного и того же пользователя один и тот же IP адрес на протяжении сессии связи. Не буду подробно останавливаться на этом методе, скажу лишь, что этот метод имеет недостатки. В частности он может не работать, если пользователь использует корпоративный прокси сервер, или если он открыл несколько окон с чатом. В последнее время стал часто использоваться другой метод - метод динамических имен. Суть метода заключается в том, что при каждом заходе юзера в чат, ему автоматически присваивается временный уникальный логин. Этот логин автоматтически прописывается в страничке, которую шлюз присылает пользователю. Каждый раз, когда пользователь отсылает форму реплики или запрашивает сообщения из чата, его страничка отсылает на сервер временный логин, по которому сервер собственно и идентифицирует пользователя. Временный логин система генерирует случайным образом, и два разных юзера не могут иметь одинаковый логин. Логин может состоять из нескольких частей. Чаще всего это порядковый номер пользователя в сессии, и сгенерерированный случайным образом пассворд. Поскольку идентификационный логин "зашит" в чатовскую страничку каждого юзера, то система точно знает с каким юзером она общается, независимо от его IP адреса, прокси-серверов, количества открытых окон с чатом и т.д.

    Понятно, что если бы мы знали логин пользователя, то нам бы не составило труда "подкосить" под юзера, просто напросто исправив в своей страничке свой логин, на его логин. Тогда бы система приняла нас за него... Оказывается это можно легко сделать, если чат взломан, и мы имеем возможность вставить в чат свою картинку. Тогда, если в качестве картинки использовать сниффер (см главу "Вариации на тему"), то мы сможем получить временные логины всех участников чата! А если нас интересует чей-то конкретный логин , то нужно послать ему сниффер в приват. Отмечу следующее: перехваченный логин действителен только до тех пор, пока юзер находится в чате, если перелогинится (выйдет и снова зайдет), то у него уже будет новый временый логин.

    Понятно, что если перехватить временный логин админа, то к нам автоматически перейдут и его права - например возможность непосредственной вставки тегов в сообщения (т.е. отсутствие фильтра на символы <и >), или возможность удаления из чата, или получения информации о пользователе и т.д.

    Третий взлом чата T

    Итак вернемся к многострадальному чату Т. Не так давно чат Т полностью перешел на новое ядро. Теперь правила игры изменились. Сначала поле цвета пропускало практически все (вплоть до знаков < и >), и мне не сотавило труда взломать его. Но вскоре эту дырку заделали (не без моего участия). В новой версии чата цвет пропускал исключительно цифры и буквы. Взлом через цвет стал невозможен. Это заставило искать более изощеренные методы. По сути, единственое что оставалось - это ник. По своему опыту я знал, что через ник взломать чат довольно трудно, поскольку разработчики довольно тщательно подбирают для ника фильтры. Однако в чате муссировалась "фишка" о том, что "набор символов для ника существенно расширен". Это шло как своеобразная реклама. Немного повозившись с фильтрами на ник, я обнаружил что пропускаются следующие символы:

    ' ` = ; \

    Символ " пропускался, однако перед ним чат автоматически вставлял символ \. Механизмы связанные с такой комбинацией описаны в главе "Немного о символе обратного слэша \". Однако эффекты описанные в этой главе не давали желаемого результата, и были неудобны в использовании. Я искал другое решение. И я его нашел!

    Посмотрим на фрагмент сообщений в чате:

    <a href='javascript:top.msgto("Algol")'>Algol</a><font> Всем приветик </font><a href='javascript:top.msgto("Стелла")'>Стелла</a><font> Привет </font>

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

    <a href='javascript:msgto("Mc'Donald")'> браузер игнорирует двойные кавычки (поскольку они относятся не к HTML а к JavaScript), и воспринимает апостроф после Mc как закрывающую кавычку обработчика. Т.о. обработчиком является только javascript:msgto("Mc. Фактически это означало взлом чата. Однако нужно было довести баг чата до нужной "кондиции". Это тоже оказалось непросто. Можно было конечно логиниться под ником типа 'onmouseover=`alert('Hello')`. Но во-первых чат не пропускал слишком длинных ников, а во-вторых в чате полно модераторов, и понятное дело они бы заметили "необычный" ник. Поэтому я решил ломать методом разрушения структуры. После некоторых раздумий я нашел подходящий ник: `='A'=`. Посмотрим как в таком случае сообщения в чате: <ahref='javascript:top.msgto("`='A'=`")'>`='A'=`</a><font>` style=background-image:url(javascript:alert()) </font><a href='javascript:top.msgto("Стелла")'>Стелла</a></em>

    Фрагмент

    ` style=background-image:url(javascript:alert()) был послан как сообщение в общак. Разберем как браузер компилирует приведенный пример: обработчиком href является 'javascript:top.msgto("`='. Поскольку обработчик заключен в кавычки, то пробел перед следующим атрибутом тега не требуется. Как таковым и воспринимается A', а его значением `")'>`. Поскольку значение тега заключено в кавычки, то пробел опять не требуется и дальнейший знак = опять рассматривается как значение некоего атрибута тега: 'A', как и последующий фрагмент ``. Далее следует уже атрибут style=... который оказался внутри  тега! Вот так-то :)).

    Еще несколько взломов многострадального чата T

    Как видно из предыдущей главы, в чате Т свободно можно было втиснуть скрипты, и естественно, что я творил там что хотел (вплоть до того, что назначал себя админом 255 уровня:). Это конечно сильно не нравилось разработчику чата (с которым я кстати активно общался), и он как бы "пофиксил" баг следующим способом: в сообщениях чатлан он заменял слово script на script, где латинские буквы с и p были заменены на такие же, но из русской раскладки, и естественно, HTML не понимал их. В результате комбинация типа ` style=background-image:url(javascript:alert('Победа_будет_за_нами!')) не работала. Несмотря на то, что по прежнему можно было сниферить чат и ставить обработчики на события типа onmouseover (где префикс javascript: не обязателен, поскольку он по умолчанию считается языком обработчиков событий), но невозможность вставить скрипт, который бы сам запускался меня не устраивала. И тут меня снова выручила многоступенчатая система трансляции HTML. Как уже было замечено, при компиляции HTML в первую очередь компилирует теги и их параметры, а лишь затем компилируется содержимое обработчиков. А теперь вспомним, что каждый символ помимо "обычного" представления имеет закодированное представление (типа ½ или ½), которое превращается в обычный символ, при трансляции HTML. Возникает вопрос: на какой именно стадии трансляции происходит раскодировка кода в символ? Несложные эксперименты показывают, что последовательность такова:

    Компиляция HTML > Раскодировка символов > Компиляция обработчиков

    А посему, содержимое обработчиков можно не стеняясь посылать в закодированном виде, при этом фильтры чата его пропускают, а HTML уже на этапе трансляции превращает их в нормальный вид и исполняет! Проверте сами на таком примере (обработчик alert() заменен кодовой комбинацией):

    <font onclick=alert()>Click me</font>

    Таким образом послав комбинацию

    ` style=background-image:url(javascript:alert('Победа_будет_за_нами!')) на экране чатовцев послушно появился алерт :).

    Замечу две особенности : 1. Содержимое тега

    <script> нельзя посылать в закодированном виде, его содержимое не раскодируется HTML-ом; 2. Знак = после имени параметра тега и кавычки, ограничивающие обработчики, транслируются до раскодировки, и поэтому их посылать в закодированном виде нельзя (а жаль :{ ).

    Описанная особенность HTML значительно расширяет множество "крякаемых" чатов. Ведь достаточно что бы чат пропускал в поле ника символы & и ;, а в теле чата ник фигурировал в каком нибудь обработчике (типа href="javascript:msg('ник')"), и в результате, залогинившись под ником '+alert()+' (который после компиляции будет выглядеть как '+alert()+'), мы получаем скрипт срабатывающий при нажатии на ник.

    Но и это еще не все. Оказывается джаваскриптовский обработчик в параметре href можно писать и в юникоде! Вместо ника '+alert()+' можно логинится под '%2Balert()%2B', результат будет тот же :). Однако раскодировка юникода проходит только в обработчиках href(или в других, где должен присутствовать адрес). В других обработчиках (например onclick) раскодировка юникода не происходит.

    Спустя некоторое время, админ запретил символ обратного апострофа в именах юзеров, и ник `='A'=` больше не проходил. Немного подумав, я нашел другой ник, который фактически делал то же самое: Don't=. Принцип его работы я думаю вы поймете сами (если вы читали предыдущие главы).

    Взлом UBB / YABB / IB форумов

    1. Через UBB тег [IMG]. В UBB/YABB форумах можно вставлять картинки, указав URL адрес в UBB теге [IMG]. Например: [IMG]http://myserver.ru/logo.gif[/IMG] такой тег вставляет в сообщение картинку с адресом http://myserver.ru/logo.gif. При этом ничего не мешает вставить например такой тег [IMG]javascript:alert()[/IMG]. Как вы догадываетесь, такой адрес будет выдавать каждому кто посмотрит на ваше сообщение алерт вместо картинки. Правда некоторые версии UBB требуют что бы указанный адрес указывал на файл с расширениями gif или jpg, но эта проблема легко решаема. Просто ставим в конце точку с запятой и имя файла картинки : [IMG]javascript:alert();a.jpg[/IMG]. Конечно это повлечет ошибку джава скрипта, но нам уже все равно, поскольку первая часть скрипта сработает :). Есть еще одна дыра в теге IMG: в некоторых версиях этот тег пропускает кавычку, как результат работает следующий пример:

    [IMG]"s=`s.jpg[/IMG]`style="background-image:url('javascript:alert()')" . Результат- тот же самый что и в первом примере.

    Приведенный глюк работает как в UBB так и в YABB форумах. Учитывая еще тот факт, что UBB форум хранит пароль и логин пользователя в кукисах, которые читаются страничкой форума, и хранятся в переменных, то запустив в тело чата сниффер, мы можем легко выковырять пароли и логины всякого пользователя, который посмотрит на наш мессаг :)).

    2. Как уже отмечалось, UBB форум хранит логин, ник и пароль пользователя в кукисах. Оказывается, что в некоторых случаях UBB форум берет ник пользователя не из своей БД, а из кукиса пользователя, при этом проверки ника на теги и любые символы не происходит! Таким образом, если в отсылаемом на сервер мессаге подделать кукис, и вставить вместо ника тег скрипта, то форум спокойно вставит этот тег в тело форума! Правда разработчики перемудрили, и в некоторых частях форума вставляются ники из БД, а в некоторых - из кукисов. Мне известны три случая, когда ник берется из кукиса: 1. На главной странице форума (там где пишется кто автор последнего сообщения в такой-то теме) 2. При ответе на реплику "с цитированием" - во фразе цитирования. 3. При редактировании сообщения (во фразе "отредактированно тем-то"). Отмечу, что 3.06.2002 фирма UBB выпустила патч на дырку в кукисах (не без моего скромного участия). Однако, несмотря на это, большинство форумов по прежнему используют старые версии :)).

    3. А вот еще одна дырка в форумах http://www.ikonboard.com: помимо того, что там срабатывает дырка связанная с тегом [IMG], там есть еще и дырка в теге [COLOR]. Например посылая в форум такое сообщение 

    [color=red;background-image:url('javascript:alert()')]Привет[/color] на экран каждого кто просмотрит ваше сообщение выскочет алерт. Суть дыры думаю не стоит объяснять: понятно и так.

    Всякая всячина

    Система безопасности аля микрософт подразумевает невозможность доступа с загруженной HTML странички к любой информации на машине, в том числе и к другим страничкам, открытым в данный момент. Однако эта система имеет некоторые странности в работе. Так, например, метод  window.open("http://ya.ru", "privat") джаваскрипта должен открывать новое окно с именем "privat" и загружать в него сайт ya.ru. Это так и происходит если... окно с таким именем еще не открыто. Если же одноименное окно или фрейм уже открыт, то сайт загружается в уже открытое окно (или фрейм). А прикол заключатеся в том, что это окно может не иметь никакого отношения к нашему скрипту, и вообще принадлежать другому сайту )). Убедитесь сами: Откройте в новом окне ссылку: http://chat.bigmir.net и зайдите в чат. А потом кликнете здесь: тыц, после чего посмотрите на свой приват в чате :)). Красиво ?

    В некоторых чатах существет автоматическая вставка ссылок. А ведь можно послать и ссылку на сниффер :). Типа вы посылаете сообщение Друг Билли (Вилли/Джони/Джимми)! Посмотри какой классный порносайт я откопал http://fig.vam.com/cgi-bin/girl.cgi, а в общак вставляется

    Друг Билли (Вилли/Джони/Джимми)! Посмотри какой классный порносайт я откопал &lt;a href=http://fig.vam.com/cgi-bin/girl.cgi target=_blank>http://fig.vam.com/cgi-bin/girl.cgi После чего ваш друг смело тыкает в ссылку и ничего не увидев, советует вам выпить рассольчика, на что вы виновато каетесь Ой, Билли (Вилли/Джони/Джимми), я ошибся :( , держа в руках IP адрес , номер сессии или пароль с логином вашегособеседника :).

    А вот еще один фокус на грани фантастики. Этот фокус я услышал от одного из админов чата. Правда сам его не проверял, но полагаю что это вполне может работать. Как вы наверное видели, во многих чатах есть счетчики посетителей. Всякие там Spy или top100. А ведь счетчик автоматически фиксирует множество параметров посетителей, в том числе IP адреса, парамтеры среды окружения, поле referer и т.д., то есть фактически является сниффером. А статистика счетчика может быть открыта для всех... Улавливаете :)

    Хочу еще раз остановится на взломе чатов через цвет. Некоторые чаты пропускают любые символы в поле цвета, однако при вставке в тело чата, перед введенным значением цвета, вставляют символ #. Например если пользователь задал цвет aaff00, то в тело чата этот цвет вставится в виде <font color=#aaff00>. В силу особенностей атрибута color, выяснилось следующее: если впереди цвета автоматом встявляется символ #, то чат ломается только если поле цвета пропускает пробел. Если же цвет пропускает любые символы, но не пробел, то взломать чат нельзя (можно только вызвать глюки например тегом <xml> задаваемым вместо цвета). Не буду объяснять почему это происходит, просто примите это на веру :).

    В предыдущих главах уже упоминалось про метод вставки скриптов через background-image:url(javascript:...). Эту запись можно сократить до background:url(javascript:...). Результат тот же самый. Часто в чатах или форумах стоят фильтрв на ключевые слова типа javascript. Это можно обходить следующим образом: background:url(VBScriptt:alert()) или background:expression(alert())
    Табличка часто применяемых кодов:
    Символ Десятичная кодировка 16-ая кодировка* Символьная кодировка Unicode
    " " " " "
    ' ' '   '
    ` ` `   `
    <пробел>   +
    = = =   %3D
    < < < < %3C
    > > > > %3E
    \ \ \   %5C
    % % %   %
    + + +   %2B
    <короткий дефис> ­ ­ ­ %AD
    & & & & &

    *-в некоторых случаях (если символ стоит в конце строки) точку с запятой можно опустить.