crossdomain.xml

Discussion in 'Уязвимости' started by SleepShadowWeb, 24 Feb 2009.

  1. SleepShadowWeb

    Joined:
    2 Feb 2006
    Messages:
    26
    Likes Received:
    15
    Reputations:
    0
    Ниже написанный текст отношу больше к исследованию и доработке, нежели к уязвимости...
    Собственно пару лет назад пришлось заниматься вот этим... Было нужно запустить сайт, который работал бы с bwin.com
    Писать своё за небольшим знанием ActionScript было глупо и поэтому целью стало запустить "родной" сайт локально.

    С первой проблемой, с которой пришлось столкнуться это вот этой:
    http://wiki.flash-ripper.com/?title=Безопасность_во_Flash_Player
    а именно файл:
    crossdomain.xml


    находится он в корне по адресу:
    https://www.bwin.com/crossdomain.xml

    содержимое этого файла:
    Code:
    <?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy 
      SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
       <allow-access-from domain="adadmin.bwin.com" secure="false"/>
       <allow-access-from domain="*.itsfogo.com" secure="false"/>
       <allow-access-from domain="*.itsfogo.com" secure="true"/>
       <allow-access-from domain="videostream.bwin.com" secure="false"/>
    </cross-domain-policy>
    
    видно, что доступ к данным из flash могут получать только те флешки, которые расположены на bwin.com и itsfogo.com
    пришлось заняться исправлением этого досадного недорозумения...

    для начала небольшой кусочек кода из флешки для примера (подобных участков получения данных от разных скриптов в коде несколько):
    Code:
    comm.getEvents = function ()
    {
        if (loadComplete)
        {
            if (getTimer() - comm.lastEventsResponse > comm.eventsTimeout)
            {
            } // end if
    
    //var _loc1 = liveUrl + "V2GetLiveEventsWithMainbets.aspx?cts=" + comm.eventsLastModified + "&lang=" + LID + "&cs=75A940F7&r=" + Math.floor(Math.random() * 1000000);
    //var tmp1 = "/V2GetLiveEventsWithMainbets.aspx?cts=" + comm.eventsLastModified + "&lang=" + LID + "&cs=75A940F7&r=" + Math.floor(Math.random() * 1000000);
    		var tmp1 = "/V2GetLiveEventsWithMainbets.aspx$cts=" + comm.eventsLastModified + "!lang=" + LID + "!cs=75A940F7!r=" + Math.floor(Math.random() * 1000000);
    		var _loc1 = "http://buk.ru/get.php?hostname=live.bwin.com&path="+tmp1;
    //trace(tmp1);
    //trace(_loc1);
    //		var _loc1 = "http://live.bwin.com/V2GetLiveEventsWithMainbets.aspx?cts=0&lang=17&cs=75A940F7&r=1000000";
            comm.xmlevents = new XML();
            comm.xmlevents.onLoad = comm.onGetEventsResponse;
            comm.xmlevents.load(_loc1);
        }
        else
        {
            gui.showEvent("txt_msg", 15, Stage.width / 2 + 84, 62, trans.loadFailed, "ATT");
        } // end else if
    };
    
    .....
    
    comm.getEvents();
    comm.getEventsTimer = setInterval(comm.getEvents, 30000);
    

    языковые файлы называютя messages_[LanguageID].xml
    для русского языка [LanguageID]=17
    вот начало файла messages_17.xml
    Code:
    <MESSAGES LID="17" lang="russian"
    sports = "Mixed,,,,Футбол,Теннис,Формула-1,Баскетбол,,Горные лыжи,Велоспорт,Американский футбол,Хоккей с шайбой,Гольф,..........,"
    calendarOn = "Показать календарь событий L!VE"
    calendarOff = "Скрыть календарь событий L!VE"
    expandAllEvents = "Показать детальный обзор всех событий"
    .....
    
    содержимое файла get.php
    PHP:
    <?php
    $hostname 
    $_GET['hostname'];     //     www.yandex.ru
    $path $_GET['path'];            //     /search.php?word=sss

    $path str_replace("$""?"$path);
    $path str_replace("!""&"$path);

    //print_r($_GET);
    /*
    http://buk.ru/get.php
    ?hostname=live.bwin.com
    &path=/V2GetEventData.aspx?eid=954767&cts=0&lang=17&mbo=0&cs=75A900F4&r=812318
    */

    //$hostname = "live.bwin.com";
    //$path = "/V2GetEventData.aspx?eid=954767&cts=0&lang=17&mbo=0&cs=75A900F4&r=462793";

    $fp fsockopen($hostname80$errno$errstr30);
    if (!
    $fp) {
        echo 
    "$errstr ($errno)<br />\n";
    } else {
        
    $out "GET $path HTTP/1.0\r\n";
        
    $out .= "Host: $hostname\r\n";
        
    $out .= "Accept-Encoding: deflate\r\n";
        
    $out .= "Connection: Close\r\n\r\n";

        
    fwrite($fp$out);

        while (!
    feof($fp))
        {
            
    $line fgets($fp2048);
            if(
    $line == "\r\n") break;
        }

        while (!
    feof($fp)) {
            echo 
    fgets($fp2048);
        }
        
    fclose($fp);
    }
    ?> 
    декомпелированный код в главном модуле составил 2738 строк..
    первоначально показалось что всё просто и с заменой функций получения данных сайт заработает локально как и на родном сервере..
    но как выяснилось всё оказалось совсем наоборот... пришлось приложить немало сил чтобы разобраться в коде и внести нужные изменения
    добавлю что главный модуль сотоит из нескольких подмодулей, подгружаемых в процессе его загрузки
    и поэтому часть кода, а именно ссылки, функции подгрузки моделей и логические условия пришлось заменить.
    также некоторый код пришлось закомментировать, поскольку с ним сайт категорически отказывался загружаться,
    но на функционал это никак не повлияло.

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


    вот такой небольшой получился обзор...
     
    Sitronik and Phm.phx like this.