Перейти к содержанию

_Dark_

Ветеран
  • Постов

    3092
  • Зарегистрирован

  • Посещение

  • Победитель дней

    145

Активность репутации

  1. Лайк
    _Dark_ получил реакцию от YOLO в Хук "Кнопка наверх"   
    JQuery не поддерживается IP.Board и никак подключить его нельзя.
    Хук
  2. Лайк
    _Dark_ получил реакцию от AndrewBlackfest1 в Правила раздела   
    В данном разделе публикуются только темы связанные непосредственно с технической стороной IP.Board.
    Не следует путать данный раздел с разделом Запросов и разделом Статей и инструкций.

    Как правильно задать вопрос

    При создании темы во-первых, руководствуйтесь а во-вторых, прочитайте инструкцию ниже:
    Если ваша проблема связана с базой данных, а именно конкретно отображается ошибка БД или вы знаете, что эта проблема связана с базой данных - выкладывайте лог из папки cache в корне вашего форума. Файл называется sql_latest_error.cgi, выкладывайте именно его содержание. Если же у вас на форуме отображается другая ошибка - так же проверьте папку cache, посмотрите на файлы с расширением .cgi, выложите содержание того файла, у которого дата изменения соответствует дате возникновения вашей ошибки Проверьте, что в вашем профиле верно заполнено поле Версия IP.Board, очень важно знать используемую вами версию форума. Если на форуме отображаются ошибки, т.е. есть явная ошибка, лучше всего выложить скриншот этой ошибки. Если же такой возможности нет, скопируйте текст ошибки и выложите его при создании темы. Если ваша проблема связана с каким-либо хуком или компонентом обязательно указывайте его полное название и используемую вами версию. При создании темы указывайте теги с описанием вашей проблемы, этим вы поможете многим пользователям нашего форума. Кроме того, если ваша проблема решена или вы решили ее сами - отпишитесь в тему, укажите какие действия вы предприняли и что проблема решена. Это поможет и другим пользователям, если у них будет похожая проблема.
  3. Лайк
    _Dark_ получил реакцию от RealUser в Как я взлом сайта расследовал.   
    Если вы зашли сюда — будьте готовы к огромному количеству букв, различных терминов, непонятного кода и т.п.

    Началось все с темы.


    Fatal error: Cannot redeclare ololololololo1() (previously declared in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/av-128.jpg(33) : regexp code(1) : eval()'d code:2) in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/photo-128.jpg(33) : regexp code(1) : eval()'d code on line 3
    Как мы видим, ошибка незаурядная. Само наличие "ololololololo1" уже говорит о многом, а учитывая то, что все это происходит в файле av-128.jpg — вообще интересно. В общем то, только по вот этим признакам уже можно говорить о том, что сайт подвергся взлому. Первым делом были взяты эти два файла и пока отложены на просторы рабочего стола. Т.к. обсуждать все это на форуме было неудобно — списались с в ICQ. Для начала хотелось выяснить, кто это сделал. Файл uploads/profile/av-128.jpg является аватаркой пользователя с ID 128 (пока не будем говорить о том, как вообще в аватарке оказался PHP код), казалось бы нарушитель найден, но проблема в том, что владелец сайта чистил БД от старых записей и аккаунт пользователя удален. Ладно, к черту тогда личность взломщика, давайте разбираться, что произошло. Первое что приходит в голову — запросить у хостера список измененных .php файлов за последнюю неделю. Запрашиваем. Хостер предоставить их не может, но зато он нам любезно включает SSH доступ (это действительно хорошая черта тех.поддержки хостинга — они поняли в чем дело и без лишних разговоров предоставляют нам то, что в наш тарифный план не входит). Отлично, SSH у нас есть. При помощи простой команды find /public_html/ -type f -iname "*.php" -mtime -7[/code] (полный путь к директории вырезан за ненадобностью) получаем: [spoiler] [code]
    public_html/cache/cache_clean.php
    public_html/cache/globalCaches.php
    public_html/cache/furlCache.php
    public_html/cache/skin_cache/cacheid_1/skin_register.php
    public_html/cache/skin_cache/cacheid_1/skin_profile.php
    public_html/cache/skin_cache/cacheid_1/skin_online.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_support.php
    public_html/cache/skin_cache/cacheid_1/skin_editors.php
    public_html/cache/skin_cache/cacheid_1/skin_shoutbox.php
    public_html/cache/skin_cache/cacheid_1/skin_stats.php
    public_html/cache/skin_cache/cacheid_1/skin_upload.php
    public_html/cache/skin_cache/cacheid_1/skin_emails.php
    public_html/cache/skin_cache/cacheid_1/skin_promenu.php
    public_html/cache/skin_cache/cacheid_1/skin_ipseo.php
    public_html/cache/skin_cache/cacheid_1/skin_login.php
    public_html/cache/skin_cache/cacheid_1/skin_mod.php
    public_html/cache/skin_cache/cacheid_1/skin_search.php
    public_html/cache/skin_cache/cacheid_1/skin_shoutbox_hooks.php
    public_html/cache/skin_cache/cacheid_1/skin_boards.php
    public_html/cache/skin_cache/cacheid_1/skin_gms.php
    public_html/cache/skin_cache/cacheid_1/skin_messaging.php
    public_html/cache/skin_cache/cacheid_1/skin_legends.php
    public_html/cache/skin_cache/cacheid_1/skin_cp.php
    public_html/cache/skin_cache/cacheid_1/skin_post.php
    public_html/cache/skin_cache/cacheid_1/skin_mlist.php
    public_html/cache/skin_cache/cacheid_1/skin_modcp.php
    public_html/cache/skin_cache/cacheid_1/skin_global_other.php
    public_html/cache/skin_cache/cacheid_1/skin_reports.php
    public_html/cache/skin_cache/cacheid_1/skin_global.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_clients.php
    public_html/cache/skin_cache/cacheid_1/skin_topic.php
    public_html/cache/skin_cache/cacheid_1/skin_help.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_emails.php
    public_html/cache/skin_cache/cacheid_1/skin_ucp.php
    public_html/cache/skin_cache/cacheid_1/skin_global_comments.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_payments.php
    public_html/cache/skin_cache/cacheid_1/skin_forum.php
    public_html/cache/cache.php
    public_html/cache/aq.php
    public_html/cache/sd2178.php
    public_html/hooks/ipSeoPingTopics_9be3a8f6d34784b16a253af2060440da.php
    public_html/hooks/ipSeoAcronymsEditor_f29ecb558858bb04bf957fb505093329.php
    public_html/hooks/ipSeoMeta_1dfa8b1e2915158bcd0bc2ca20a90f4f.php
    public_html/hooks/dp3_fi_boardsClassActionOverloader_5fee7a7dd42c37cd850eba64e519789d.php
    public_html/hooks/cstopspamreg_cea6e736e42ab14fa64581f28c8c08d1.php
    public_html/hooks/passwordStrength_skin_7b219a756db0cc9bcbf78cb9b17ad92f.php
    public_html/hooks/ipSeoGuestSkin_ceb6061092c92fc4b36e682aabaa5c96.php
    public_html/hooks/globalProMenuRemovalTool_f73b5f48f7515d65c93216498d309aac.php
    public_html/hooks/cstopspamreg_bstats_99fac0fad97daf26fb18c4e61a46ed90.php
    public_html/hooks/topicosrecentes_ucp_8eced785d6487592b493fc683e778f68.php
    public_html/hooks/dp3_fi_forumsClassActionOverloader_0317c8e4a356386124447e57d90a0188.php
    public_html/hooks/globalProMenuJava_1e4b91655304505004f3429052bc0561.php
    public_html/hooks/ipSeoAcronymsBbcodeParser_46716b0eace16d346a426516a5a550ca.php
    [/code] [/spoiler] В глаза бросается [code]
    public_html/cache/aq.php
    public_html/cache/sd2178.php
    (названия файлов изменены, т.к. пока незачем их публиковать всем).
    [/code] (файл [font=courier new,courier,monospace]public_html/cache/cache.php[/font] я заметил только когда писал это, с ним тоже разберемся). Первый файл оказывается скриптом, значение которого я так и не понял. Второй файл имеет интересное содержание. После небольшой пробежки по Google оказываемся здесь. Все понятно, бэкдор из паблика. Удалять эти файлы как-то банально, сделаем по другому — заставим эти файлы работать на нас. Я не буду приводить код, скажу только, что IP-адрес, а так же информация о системе каждого, кто откроет эти файлы будут сохранены. С этим разобрались. Но очевидно, что "центр" взлома находится не здесь, а вон в тех аватарках с PHP кодом. Нам нужно определить, что этот код делает, чтобы установить, для чего был осуществлен взлом. Для начала берем первый файл — [b]av-128.php[/b]. Открываем его. Смотрим. Это кошмар. Во-первых, сразу видно, что код обфусцирован. Во-вторых, начисто нет форматирования кода. Начинаем с малого, приведем код к читаемому виду, в плане переносов строк. Для этого воспользуемся вот этим прекрасным сервисом, который отформатирует код за нас. Прогоняем код. Получаем результат, смотрим. Красота. Код стал более читабелен, мы можем сразу провести небольшой анализ. В коде нет зарезервированных слов PHP (if, function, for, while, и т.д.). Значит код в том виде, в котором он сейчас использует только стандартные функции PHP, не определяя свои. Из первого пункта получаем, что код обфусцирован несколько раз (почему? Потому что свои функции у скрипта все таки есть, помните ошибку, с которой все начиналось?). Скорее всего деобфусцировать код автоматически не выйдет. Поискав в Google сервисы для деобфускации становится понятно, что все что там есть — ерунда. Ну что ж, будем делать все самостоятельно. [size=5][b]Этап 1.[/b][/size] Бегло взглянув на код и обнаружив множество текстовых строк, а затем одну, которая все их объединяет [code]
    $v3IWiBF = // и здесь все эти текстовые строки
    [/code] приходим к выводу, что на данной стадии в коде минимум логики. Нужно найти переход с этого уровня кода на более низкий. Смотрим где же используется эта переменная [font=courier new,courier,monospace]$v3IWiBF[/font] с огромным текстом внутри. В коде таких упоминаний одно, это [code]
    $lGp2BqP = $Mb8Ze($v3IWiBF, $hFl0_($Jj1U($TjMGm), $Jj1U($VtLjYNP)));
    [/code] Ладно, смотрим где встречается собственно [font=courier new,courier,monospace]$lGp2BqP[/font], а это — последняя строка, вот [code]$d1QZk($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Значит переход на более низкий уровень кода находится на последней строке, это означает, что код обфусцирован [i]последовательно[/i], т.е. весь код (а не его отдельные части) был обфусцирован несколько раз. Это упрощает работу, значит нам тоже разбирать код можно последовательно, не пытаясь найти места, с которых начать. [size=5][b]Этап 2.[/b][/size] Есть такие задачки для маленьких детей, где нарисованы какие-то непрерывные линии, их начала и концы указаны и нужно найти какая линия к чему приведет, причем начал больше чем концов. Легче всего это решить пойдя по этим линиям с конца, вот и мы поступим так же. У нас есть функция, которая ведет к переходу на более низкий уровень кода — эта та самая последняя строчка [code]$d1QZk($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Будем работать над ней. Смотрим на образование названия самой функции: [code]
    $oWHh = "\160\162";
    $zYdUyk = 'eg';
    $XqVM = "\137\162";
    $PU0b = "\145\160";
    $I0Tf = "\154\141";
    $qGX8ht = "\143\145";
    $d1QZk = $oWHh . $zYdUyk . $XqVM . $PU0b . $I0Tf . $qGX8ht;[/code] Через секунд 10 раздумий в голову приходит, что 160, 162, 137 и т.д. — это ASCII коды и о них нам рассказывали где-то в школе. Ищем таблицу ASCII кодов, открываем, ищем число 160. Находим, это символ [b][size=4]á[/size][/b]. В PHP нет стандартных функций в названиях которых используются такие символы (а на данном уровне кода у скрипта тоже никаких своих функций нет, помните мы выше это выяснили). Значит 160 нам не подходит, но ведь в коде он используется. Вспоминаем синтаксис PHP, черт, ведь там код символа указывается в восьмеричной системе исчисления. Смотрим тогда колонку [i]Oct[/i] (Octal — восьмеричная система исчисления). Находим, это латинская буква [b]p[/b]. Подходит! Смотрим дальше. 162 — это буква [b]r[/b], получаем, что [code]$oWHh = "\160\162";
    $zYdUyk = 'eg';[/code] это ни что иное, как [b]preg[/b], т.е. это библиотека для работы с регулярными выражениями в PHP. Смотрим дальше, когда мы получаем[b] preg_r [/b]становится понятно, что вся функция имеет название [b]preg_replace[/b]. Промежуточный результат: [code]preg_replace($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Ну, совсем просто узнаем, что [font=courier new,courier,monospace]$phl6yJ[/font] это [code]/.*/e[/code] . Промежуточный результат: [code]preg_replace('/.*/e', $r6Q7D($lGp2BqP), $PJf4o9);[/code] Смотрим, что такое [font=courier new,courier,monospace]$r6Q7D[/font]. В коде это [code]
    $BiDR51n = "\142\141";
    $IhcdiCL = 'se';
    $Vq5GI = '64';
    $ID4o = "\137\144";
    $nBHq = 'ec';
    $ekeM_1 = "\157\144";
    $NViQXn = "\145";
    $r6Q7D = $BiDR51n . $IhcdiCL . $Vq5GI . $ID4o . $nBHq . $ekeM_1 . $NViQXn;
    [/code] Увидев [font=courier new,courier,monospace]..se64..ec...[/font] машинально вспоминаем [code]base64_decode[/code] Промежуточный результат: [code]preg_replace('/.*/e', base64_decode($lGp2BqP), $PJf4o9);[/code] [font=courier new,courier,monospace]$lGp2BqP[/font] — это результат работы какой-то функции, которая обрабатывает результат другой функции, пропустим пока. Остается [font=courier new,courier,monospace]$PJf4o9[/font]. Находим [code]
    $uRk52 = "";
    $PJf4o9 = $uRk52;
    [/code] в самом начале файла. Пустая строка. Отлично. Промежуточный результат: [code]preg_replace('/.*/e', base64_decode($lGp2BqP), '');[/code] Теперь будем разбираться с [font=courier new,courier,monospace]$lGp2BqP[/font]. Путем рассуждений которые мы делали выше узнаем, что [font=courier new,courier,monospace]$lGp2BqP [/font]— это [code]$lGp2BqP = strtr($v3IWiBF, array_combine(str_split($TjMGm), str_split($VtLjYNP)));[/code] Подставляем переменные и получаем [code]$lGp2BqP = strtr($v3IWiBF, array_combine(str_split('0=7ApLG%5HY#VS-$u_xsE 9,ZtD!crgq2b^/:6o3v1(&ln~k)\'B*IdQ[f4a`W\\'), str_split('8yaoY9jrcKuARDHlPC3S65nBwemEiN=Q1Vhf2stLZqJGUdIWbpM0zx4XvTFkgO')));[/code] А [font=courier new,courier,monospace]$v3IWiBF[/font] — это та огромная строка, про которую мы говорили в самом начале. Промежуточный результат: [code]preg_replace('/.*/e', base64_decode(strtr($v3IWiBF, array_combine(str_split('0=7ApLG%5HY#VS-$u_xsE 9,ZtD!crgq2b^/:6o3v1(&ln~k)\'B*IdQ[f4a`W\\'), str_split('8yaoY9jrcKuARDHlPC3S65nBwemEiN=Q1Vhf2stLZqJGUdIWbpM0zx4XvTFkgO')))), '');[/code] [code]'/.*/e'[/code] в регулярном выражении означает выполнение кода, указанного в строке. Значит нам нужно получить эту строку, это основной код скрипта. Выполняем [font=courier new,courier,monospace]base64_decode[/font] и получаем вот это. [b][size=5]Этап 3[/size][/b] Переходим на еще более низкий уровень кода, опять выполнив [font=courier new,courier,monospace]base64_decode[/font]. Результат. Вот мы и добрались до этой функции [font=courier new,courier,monospace]ololololololo1[/font]. Смотрим и видим это [code]\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'[/code] Это пошли уже HEX коды символов, расшифровав получаем [code]
    eval(gzinflate(base64_decode('/* зашифрованный код */')));
    [/code] Переходим еще на уровень ниже... [b][size=5]Этап 4[/size][/b] Вот он код, ребята! После небольшой паузы я начал смеяться, нет, правда Мы получили такой же код, как и в файле [code]public_html/cache/sd2178.php[/code] , отличие только в том, что он выполняется, если у пользователя установлена cookie с названием [b]zx[/b]. Получается, мы просто потратили время впустую? Нет. Во-первых, знаете, это вообще клёвое (я вообще никогда не ставлю букву Ё при набирании текста на клавиатуре, это исторический момент) чувство когда делаешь что-то вроде взлома. Ведь в самом деле, мы только что взломали защиту, которую кто-то делал. Во-вторых, лично я получил прекрасный опыт работы с [b]таким[/b] кодом. Можно считать эта была тренировка на умение ориентироваться и разбираться в защищенном коде. В-третьих, я могу сказать владельцу сайта (как писал я уже выше — это [member='Fensmas']), что ничего супер-страшного в этом коде не нашлось (нет, вообще этот скрипт может многое, вплоть до удаления всех файлов сайта, но мы сделали все вовремя). А вообще у нас есть еще один файл — [font=courier new,courier,monospace]uploads/profile/photo-128.jpg[/font], но разбирать его нет смысла. Вспомним ошибку: [CODE]
    Fatal error: Cannot redeclare ololololololo1() (previously declared in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/av-128.jpg(33) : regexp code(1) : eval()'d code:2) in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/photo-128.jpg(33) : regexp code(1) : eval()'d code on line 3
    [/code]
    Если кратко — код в этом файле является идентичным коду, который мы только что разбирали.

    [size=5][b]Итоги[/b][/size]

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

    Учитывая то, что в общем-то код был один и тот же, можно предположить, что через один бэкдор были закачаны все остальные (а не было взлома еще и механизма кэширования IP.Board).

    В любом случае, я считаю, что это время я потратил не зря, хотя бы потому что это было интересно.
    Спасибо.


    Respected: так же можете почитать эту статью:

    [size=5][b]UPDATE 09.11.2012[/b][/size]
    Способ взлома сайта найден.
    Подробности опубликованы в теме.
  4. Лайк
    _Dark_ получил реакцию от SUAMF в Статистика IPBMafia.Ru   
    Еще интересный факт:
    Пользователь _Dark_ набрал 2000 сообщений за 245 дней, причем зарегистрировался он в пятницу, а набрал 2000-ое сообщение тоже в пятницу.

    :D
  5. Лайк
    _Dark_ получил реакцию от Arthur1 в Нормальный спойлер   
    Я копать глубже не стал, сделал чтобы "Скрытый текст" заменялся на текст указанный при создании спойлера.

    Для этого идем в АЦ -> Внешний вид -> BB-коды -> Скрытый текст.

    Использовать опции в теге? Да.
    Шаблон замены BB-кода:


    <div class='bbc_spoiler'>
    <span class='spoiler_title'>{option}</span> <input type='button' class='bbc_spoiler_show' value='Показать' />
    <div class='bbc_spoiler_wrapper'><div class='bbc_spoiler_content' style="display:none;">{content}</div></div>
    </div>
    [/CODE]

    [i]Подсказка для 'option' [/i][b]Введите заголовок спойлера[/b]

    Сохраняем BB-код. При создании можно будет указать заголовок.

    Т.е. вместо

    [spoiler]надписи скрытый текст выше[/spoiler]

    будет указан ваш заголовок.
  6. Лайк
    _Dark_ получил реакцию от Sanshalay в IP.Content 2.3.2 (Retail)   
    Если бы этот компонент был нерабочий и никому не нужный, его бы вообще не делали.
    Он работает идеально, все зависит от администратора.
  7. Лайк
    _Dark_ получил реакцию от madbatman в Animated Social Icons 1.0.0   
    Только не говорите, что у вас Opera.
  8. Лайк
    _Dark_ получил реакцию от madbatman в Members Online Today 1.1.1   
    Такой возможности нет.
  9. Лайк
    _Dark_ получил реакцию от madbatman в Members Online Today 1.1.1   
    Нужно настроить права отображения в Системных настройках.
  10. Лайк
    _Dark_ получил реакцию от АлексМоскалёв в Правила форума IPBMafia.Ru   
    Правила портала IPBMafia.Ru
    (редакция от 10.02.12)
    В данном сообщении представлены все действующие правила сайта IPBMafia.Ru (далее – «Портал»), с которыми соглашается каждый пользователь при регистрации, а так же каждый уже зарегистрированный пользователь после принятия их в силу.
    Если вы не согласны соблюдать данные правила (далее – «Правила»), вы вправе обратиться к Администрации Портала (далее – «Администрация») с просьбой удалить ваш аккаунт, в противном случае, в случае нарушения Правил, вы будете заблокированы за нарушения данных правил.
    Обратите внимание: Правила могут изменяться без предварительного уведомления пользователей.


    1. Общие сведения.
    1.1. Структура пользовательских групп Портала.
    В рамках Портала действует внутреннее деление пользователей на группы, наделяющие пользователей, относящихся к той или иной группе, определенными привилегиями.
    На текущий момент существуют следующие группы пользователей:
    Перевод пользователей в ту или иную группу осуществляют администраторы Портала (за исключением группы «Актив», перевод в нее осуществляется автоматически).

    1.2. Структура Портала.

    В настоящий момент существуют два основных раздела портала – «Форум» и «Загрузки».
    Первый раздел представляет собственно форум, второй – Файловый центр. Оба раздела связаны между собой.
    «Форум» делится на категории и разделы. В разделах соответственно размещаются темы.
    «Загрузки» разбиты на разделы и категории файлов.
    Кроме того, к «Форуму» относится и «Чат», предназначенный для общения пользователей.

    1.3. Дополнительные сведения.
    1.3.1. Основной язык портала.

    В рамках Портала для общения используется русский язык, в связи с этим, ваше сообщение или комментарий должен быть только на русском языке. Если в виду отсутствия русскоязычной раскладки на вашей клавиатуре, это невозможно следует пользоваться сервисами по транслитерации текста.

     
    2. Правила Портала.
    2.1. Пользователи.
    2.1.1. Регистрация и авторизация пользователей.

    Общие сведения:

    В рамках Портала действует обязательная регистрация и авторизация пользователей. В случае если пользователь не зарегистрирован или не авторизован, он наделяется минимальными привилегиями, позволяющими только просматривать Портал.

    Запрещено:

    2.1.1.1. Регистрации с использованием запрещенного никнейма.
    В случае, если пользователь регистрируется, используя запрещенный #, его аккаунт блокируется.
    Список запрещенного содержания никнейма приведен в приложении 3.1.


    2.1.1.2. Многократные регистрации.
    Пользователи не имеют права регистрировать второй аккаунт. В этом случае, блокируются все аккаунты пользователя.
    В случае, если пользователь не может получить доступ к своему аккаунту, необходимо воспользоваться функцией восстановления пароля. Если нет возможности восстановить пароль, необходимо обратиться к Администрации.


    2.1.1.3. Попытки взлома аккаунтов.
    Запрещены попытки подобрать пароль к аккаунтам, это относится так же и к форме входа в Админ-Центр, в случае, если это будет замечено, будет заблокирован IP адрес нарушителя.

     
    2.2. Форумы.
    2.2.1. Темы.

    Общие сведения:

    Первым делом обращайте внимание на раздел, в котором вы собираетесь создавать тему! Темы, созданные в неподходящих для этих целей разделах, могут быть удалены!
    При создании темы в ее заголовке необходимо кратко передать основное содержание темы. В самом сообщении темы необходимо четко указать проблему или вопрос, передав всю необходимую информацию, чтобы людям, которые будут вам помогать, не пришлось многократно у вас уточнять данные. По возможности прикрепляйте скриншоты, а не перепечатывайте текст, т.к. вы можете ошибиться или указать не полную информацию.

    Рекомендации:
    Научитесь пользоваться поиском! Вполне вероятно, что на ваш вопрос уже был дан ответ. Увы, некоторые пользователи просто неверно указывают ключевые слова. Если вы хотите спросить «Как обновить IPB 3.1.4 до IPB 3.3.2», то в форме поиска следует указывать не весь вопрос (не весь!), а словосочетания, которые подходят по смыслу. Например, в данном случае следовало бы указать «обновление IPB» или «обновить IPB». Неплохо было бы для начала пролистать соответствующие разделы, в нашем случае – «Техническая поддержка», если поиск не нашел нужных результатов, это не всегда значит, что их вообще нет. Может быть, у тем, которые содержат ответы на ваши вопросы не очевидные названия (вот почему важно правильно указывать названия тем!). Запрещено:

    2.2.1.1. Многократное создание тем с одинаковым содержанием.
    Запрещено создание тем с одинаковым или частично различающимся содержанием в одном и том же или нескольких разделах. За это аккаунт автора этих тем может быть заблокирован.
    В случае если вы создали две одинаковых темы случайно, попросите Администрацию удалить одну из них, воспользовавшись кнопкой Жалоба.


    2.2.1.2. Создание тем с запрещенным названием.
    Аккаунт автора темы будет заблокирован, если тема в названии содержит содержание, описанное в разделе 3.2 данных правил.


    2.2.2. Сообщения.

    Общие сведения:
    Если вы собираетесь отвечать кому-то, вначале подумайте: «А к месту ли мое сообщение?». Если речь идет о выращивании апельсинов в домашних условиях при искусственном освещении на балконе, то, вероятно, ваш ответ об успехах футбольных команд в Английской лиге будет неуместен. Так же не стоит пытаться отвести остальных от темы. Если разговор идет про правильное обновление IP.Board, то не пишите, что-то вроде этого: «А вот в другом форумном движке . . .».
    Кроме того, не забывайте что вы скорее всего отвечаете живому человеку (а вы как думали?), если вы задали вопрос, то скорее всего, вам через 3 секунды не ответят, как в живом общении, поэтому нужно уметь ждать. Хорошо бы так же говорить действительно верные и понятные вещи, чтобы потом, тот, кто ожидал от вас помощи, не проклинал вас из-за того, что вы дали неверный ответ, и у него все сломалось.

    Рекомендации:
    Если вы размещаете код, заключайте его в соответствующий тэг. Для отображения доступных тегов для оформления кода используйте кнопку «Специальные BB-коды» в визуальном редакторе. Если вы размещаете изображения или видео следует заключать их в тег «Скрытый текст» -   Пишите, соблюдая правила орфографии и пунктуации. Невозможно с первого раза правильно понять смысл текста, если в нем нет запятых, а слова исковерканы. Запрещено:

    2.2.2.1. Отправка одинаковых сообщений более одного раза (спам) и отправка сообщений не несущих никакой полезной информации в данном контексте (флуд).
    Запрещается многократная отправка сообщений или многократная отправка сообщений, не несущих никакой ценной информации («+1», «круто!», «аыфжгвы», «!??!!*!!*:!:!*!:!:» и т.д.).
    Автор данных сообщений может быть заблокирован.
    В случае если вы отправили такое сообщение случайно, попросите Администрацию удалить его, воспользовавшись кнопкой Жалоба.

    2.2.2.2. Отправка сообщений с запрещенным содержанием
    Аккаунт автора может быть заблокирован, если сообщение содержит содержание, описанное в разделе 3.3 данных правил.
     
    2.2.2.3. Вставка изображений со сторонних ресурсов
    Все изображения (в т.ч. скриншоты) должны быть загружены только к нам на сервер, путем прикрепления их к сообщению.
    Если в сообщении содержится изображение со стороннего ресурса — изображение вырезается из сообщения и не учитывается при оказании тех.поддержки. При повторной загрузке изображения со стороннего ресурса — сообщение удаляется без уведомления автора, при повторной ситуации автор получает предупреждение, вплоть до блокировки аккаунта.
     
    2.2.2.4. Обсуждения действий модераторов и администраторов
    Запрещается обсуждать действия модераторов и администраторов, как на форуме, чате так и в ЛС.  Модератор знает свои полномочия, следовательно он поступает так как ему положено! Проявляйте уважение. При нарушении данного пункта автор может получить предупреждение либо же забанен, по усмотрению администратора(модератора).
     
    2.2.2.5. Запрещается, создание,обсуждение на форуме тем о удалении и изменении копирайтов!
    Команда IPBMafia советует уважать чужой труд! При нарушении данного пункта автору выдается предупреждение. 
     
    2.2.2.6 Чрезмерный подъем тем
    Запрещается поднимать темы, писать сообщения, с содержанием не несущей никакой информации (АП, UP, Подниму, вверх и т.д.) более чем раз в сутки (24 часа). При нарушении данного пункта, автору выдается предупреждение. 
     
    2.3. Загрузки.
    2.3.1. Правила оформления файлов.

    Рекомендации:
    1. Перед добавлением файла проверьте, нет ли его уже на сайте. Для этого используйте поиск. Укажите название файла (на английском языке (а потом и на русском, если это перевод, а поиск по английскому названию ничего не дал), без версии файла). Если файл уже добавлен, не расстраивайтесь – сравните версии. Если ваша версия новее той, которая уже добавлена – смело закачивайте свой файл.
    2. Укажите название файла на английском языке, а затем, если это перевод, через слэш на русском (User Agent in Online List 1.0.2 / Юзер-агенты в списке онлайн пользователей). Название версии пишите только после англоязычного названия.
    3. Загрузите скриншот. Убедитесь, что он отражает смысл файла, чтобы не получилось, что вы закачиваете новый стиль, а на скриншоте изображение Buggati Veyron 16.4. Кроме того, проверьте, чтобы на скриншоте не было логотипов других проектов (рекламы). В противном случае, ваш файл может быть удален.
    4. Архив с файлов должен быть в формате .ZIP (.RAR не рекомендуется, т.к. не у всех он есть), причем структура файлов должна быть следующей:
     
    - {Архив} [iPBMafia.Ru] Англ_название_файла v.версия / рус_название_файла.ZIP
    -- {Папка} Англ_название_файла
    --- ваши_файлы
    Другими словами, ваши файлы должны быть не в корне архива, а в папке внутри архива, чтобы можно было удобно распаковать архив.
    Убедитесь, что кроме необходимых файлов нет ничего другого (файлов Readme со ссылками на другими проекты), просто ссылок на другие проекты, рекламы, ненужной музыки и т.д. Скриншоты тоже в архиве не нужны. Они лишь занимают место.
    5. Заполните описание файла. Пожалуйста, не копируйте его оттуда, откуда вы взяли этот файл. Придумайте свой текст, четко отображающий содержание файла. Не нужно лишних ссылок на другие сайты, инструкции и т.д. Все пишите в описании, чтобы другим пользователям не пришлось «бегать» по вкладкам в браузере.
     
    Запрещено:

    2.3.1.1. Загрузка файлов не соответствующих описанию.
    Запрещено загружать файлы с заведомо ложным содержанием, суть которого не указана в описании. Другими словами, если в описании указано одно, а файл загружен другой, вы зря старались – файл будет удален.

    2.3.1.2. Загрузка файлов содержащих вредоносный контент.
    В случае если файл содержит вирус или что-то, что будет требовать отправить SMS и т.п., он будет удален, а вы можете быть наказаны за то, что у вас нет нормального антивируса.



    2.4. Чат.
    2.4.1. Общение в чате

    Общие сведения:

    Чат предназначен исключительно для общения пользователей, а не для вопросов технического характера, как это многие думают. Если вы создали тему, не надо трубить об этом в чате, все последние темы отображаются под чатом (кто бы мог подумать!), так что даже если вы не будете кричать в чате, что вы создали тему, ее все равно все увидят.
    Кроме того, не задавайте в чате вопросов технического характера. Может получиться, что чат превратится в службу онлайн поддержки, что, во-первых, запрещено Правилами, во-вторых, нарушает саму идеологию чата.
    Не забывайте, что чат тоже относится к Порталу, так что, если вы будете вести гиперактивность в виде флуда или спама, вы будете заблокированы.

    Запрещено:

    2.4.1.1. Отправка сообщений с запрещенным содержанием.
    Аккаунт автора может быть заблокирован, если сообщение содержит содержание, описанное в разделе 3.3 данных правил.

    2.4.1.2. Отправка одинаковых сообщений более одного раза (спам) и отправка сообщений не несущих никакой полезной информации в данном контексте (флуд).
    Запрещается многократная отправка сообщений или многократная отправка сообщений, не несущих никакой ценной информации («+1», «круто!», «аыфжгвы», «!??!!*!!*:!:!*!:!:» и т.д.).
    Автор данных сообщений может быть заблокирован.
    В случае если вы отправили такое сообщение случайно, попросите Администрацию удалить его.

    2.5. Дополнительно.
    2.5.1. Статусы пользователей.

    Запрещено:
     
    2.5.1.1. Использование запрещенного текста в статусе пользователя.
    Аккаунт автора может быть заблокирован, если статус пользователя содержит содержание, описанное в разделе 3.4 данных правил.


    2.5.2. Подписи пользователей.

    Общие сведения:

    Следует знать, что подпись – это не только средство самовыражения, но и неотъемлемая часть сообщений форума и отображается в каждом вашем сообщении. Так же не стоит думать, что подпись – это доска объявлений, поэтому не размещайте там рекламу (а в особенности ссылки на другие проекты).
    Не забывайте, что подпись тоже читают люди, поэтому постарайтесь сделать ее не броской и не выделяющейся, чтобы окружающий ее текст можно было читать, не отвлекаясь с мыслями («как это убрать отсюда!»). В частности, не размещайте много изображений, текста жирным шрифтом, красным цветом. Лучше всего сделать текст подписи почти сливающимся с фоном, шрифтом ниже обычного и курсивом. Почему? Все просто: при чтении самого сообщения, она попросту не будет отвлекать внимания читателя. Зато при простом просмотре темы, пользователю броситься в глаза ее непривычное оформление (обычно то, подписи с красным текстом, анимированными картинками и т.п.!).

    Запрещено:

    2.5.2.1. Использование запрещенного текста в подписи пользователя.
    В статусе пользователя запрещен текст описанный в пункте 3.3 данных Правил.

     
    3. Приложение.

    3.1. Никнеймы пользователей.

    В никнеймах запрещено использовать следующее:
    Беспорядочная последовательность символов (iqhpusdhgoau2912). Только цифры (872192802621). Многочисленные знаки пунктуации. Нецензурная лексика, использовать сленг, такой как: мля, епрст, пздц, ска, и т.д. - расценивается как мат, скрытый мат, брань. Рекламные материалы (ссылки на сторонние проекты). Текст, который может ввести в заблуждение других пользователей, неся в себе заведомо ложною информацию (admin, moderator, IPBMafia Bot и т.д.). Текст никнейма похожий на # другого пользователя (_Dark_. вместо _Dark_ и т.д.). Специальные символы (например ™, ♠, ✏ и тд)  
    3.2. Названия тем.
    В названиях тем запрещено использовать следующее:
    Текст не несущий информации о смысле темы. Заведомо ложное название, с целью привлечения внимания («На Марсе обнаружили жизнь!!!», а в самой теме «Подскажите, что делать с этой ошибкой»). Многочисленные знаки пунктуации. Нецензурная лексика, использовать сленг, такой как: мля, епрст, пздц, ска, и т.д. - расценивается как мат, скрытый мат, брань. Рекламные материалы (ссылки на сторонние проекты).  
    3.3. Сообщения

    В сообщениях запрещено использовать следующее:
    Текст не несущий информации о смысле темы. Многочисленные знаки пунктуации. Специально отформатированный текст (в т.ч. для привлечения внимания), например, жирный, выделенный цветом, написанный увеличенным размером шрифта и т.д., кроме тех случаев, когда это необходимо (например, подчеркнуть смысловое значение фразы в сообщении). Содержание которое может нанести вред компьютерам пользователей. Нецензурная лексика, использовать сленг, такой как: мля, епрст, пздц, ска, и т.д. - расценивается как мат, скрытый мат, брань. Рекламные материалы (ссылки на сторонние проекты). Контент нарушающий законодательство РФ. Изображения, которые не несут никакой полезной цели, в том числе - баннеры, сторонние смайлики и т.д. Копирование тем(сообщений) с других ресурсов, строго запрещено!   
    3.4. Статусы пользователей

    В статусе пользователя запрещено использовать следующее:
    Многочисленные знаки пунктуации. Нецензурная лексика, использовать сленг, такой как: мля, епрст, пздц, ска, и т.д. - расценивается как мат, скрытый мат, брань. Рекламные материалы (ссылки на сторонние проекты). Контент нарушающий законодательство РФ. Текст принадлежит пользователю _Dark_, копирование и распространение запрещено.
    Последнее редактирование правил: 13.06.2016, пользователем Respected.
  11. Лайк
    _Dark_ получил реакцию от Nemo4 в Спойлер   
    АЦ → Внешний вид → Сообщения → BB-коды → Добавить
  12. Лайк
    _Dark_ получил реакцию от Ryo в Invision Power Board 3.4.0 (ENG) Final Release / Nulled v2 by IPBmafia.Ru   
    Название: Invision Power Board 3.4.0 (ENG) Final Release / Nulled v2 by IPBmafia.Ru
    Добавил: _Dark_
    Добавлен: 28 Ноя 2012
    Категория: Релизы IP.Board

    Invision Power Board 3.4.0 Final / Nulled by IPBmafia.ru

    Представляем вам последнюю версию IP.Board на данный момент — 3.4 от команды проекта IPBmafia.Ru!



    Информация от IPS
    Что нового

    Компонент IP.Seo теперь является частью IP.Board
    Улучшения редактора текста
    Новый компонент — IPS Connect
    SEO оптимизация
    Интеграция с VigLink
    Новая функция — Лучший ответ
    Улучшения интерфейса Админ-Центра
    Интеграция с Mandrill
    Различные небольшие изменения
    CDN сервис от IPS
    Улучшения анти-спама

    Внимание владельцам IP.Board <= 3.2.x

    С выходом IP.Board 3.4 поддержка следующих продуктов прекращается:
    IP.Board 3.2.x
    IP.Blog 2.5.x
    IP.Gallery 4.x
    IP.Downloads 2.4.x
    IP.Content 2.2.x
    IP.Chat 1.3.x
    IP.Nexus 1.4.x

    Само собой поддержка более ранних версий уже закончилась.
    Однако патчи безопасности будут выпускаться до конца 2013 года.

    Информация от IPBmafia.Ru

    Информация о релизе
    Версия: 3.4.0
    Язык интерфейса: английский
    Статус: активация не требуется
    Автор: _Dark_

    Важные замечания
    Эта версия серьезно отличается от предыдущих версий. На данный момент не заявлено о русификации IP.Board 3.4, поэтому обновлять русифицированные версии на эту крайне не рекомендуется. Кроме того, способ русификации мной не подходит для этой версии.




  13. Лайк
    _Dark_ получил реакцию от DenShot666 в Dark's Anti-Fast-Quering System   
    Представляю вашему вниманию простой скрипт, который может защитить ваш сайт, если его атакуют.
    Скрипт защищает только если ваш сайт подвергнут механизму атаки описанному ниже.

    Недавно наш сайт (IPBMafia.Ru) был подвергнут этой атаке. Действовало все следующим образом:
    большое количество ботов постоянно открывали главную страницу сайта. Это не был HTTP флуд, это были реальные запросы, потому что IP.Board фиксировал этих ботов как гостей.
    Самому серверу сайта от этого ничего не было, это мелочь. Но вот база данных не могла справиться с этим, потому что около 10 раз в секунду к ней шли "тяжелые" запросы, направленные на построение главной страницы, которая сама по себе очень "тяжелая". Думаю всем понятно, что база данных не могла обработать все это и просто не отвечала.
    Таким образом основной целью этой атаки является не веб-сервер, а база данных.

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

    Скрипт подходит для любого движка, а установка очень простая.

    Забыл написать:



    Принцип работы

    Вы указываете какое количество запросов разрешено в указанное вами количество секунд. Если клиент выполняет больше запросов, чем разрешено, скрипт завершает работу и клиент видит пустую страницу. Движок сайта соответственно не выполняется, поэтому "тормозов" в работе для других пользователей не будет.

    Требования PHP 4 / 5 Установка

    IP.Board
    Загрузите файл DAFQS.php в корень вашего сайта. globalTemplate.zip Откройте файл index.php, находящийся в корне вашего сайта и после первой строчки <?php вставьте: require_once 'DAFQS.php'; Перейдите к пункту Настройка Другие движки


    Процедура установки скрипта зависит от архитектуры конкретного движка, поэтому если вам нужно установить этот скрипт не на IP.Board напишите в эту тему название движка, а я сделаю инструкцию под него.
    Настройка



    После строчки
    require_once 'DAFQS.php'; вставьте: new DAFQS(a, b, c); Где a - максимальное количество запросов от одного клиента, b - лимит секунд, c - время бана в секундах.
    Все это расшифровывается как "Если выполнено больше a запросов за b секунд, то выдается бан* на с секунд".
    Естественно, в
    new DAFQS(a, b, c); a, b, c нужно заменить на необходимые значения, я рекомендую поставить 3, 1, 5. После этого сохраните файл. Скрипт установлен.
    * под баном подразумевается время, в течение которого пользователю не будет отображаться сайт и соответственно, не будет никакой нагрузки от этого пользователя.
    Информация


    Версия 1.10
    Автор _Dark_
    Написано для посетителей IPBMafia.Ru
    Список изменений:
    1.11 - исправлен баг с баном пользователя. 1.10 - добавлена возможность вручную устанавливать время бана. 1.00 - первый релиз.
  14. Лайк
    _Dark_ получил реакцию от escher в Dark's Anti-Fast-Quering System   
    Представляю вашему вниманию простой скрипт, который может защитить ваш сайт, если его атакуют.
    Скрипт защищает только если ваш сайт подвергнут механизму атаки описанному ниже.

    Недавно наш сайт (IPBMafia.Ru) был подвергнут этой атаке. Действовало все следующим образом:
    большое количество ботов постоянно открывали главную страницу сайта. Это не был HTTP флуд, это были реальные запросы, потому что IP.Board фиксировал этих ботов как гостей.
    Самому серверу сайта от этого ничего не было, это мелочь. Но вот база данных не могла справиться с этим, потому что около 10 раз в секунду к ней шли "тяжелые" запросы, направленные на построение главной страницы, которая сама по себе очень "тяжелая". Думаю всем понятно, что база данных не могла обработать все это и просто не отвечала.
    Таким образом основной целью этой атаки является не веб-сервер, а база данных.

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

    Скрипт подходит для любого движка, а установка очень простая.

    Забыл написать:



    Принцип работы

    Вы указываете какое количество запросов разрешено в указанное вами количество секунд. Если клиент выполняет больше запросов, чем разрешено, скрипт завершает работу и клиент видит пустую страницу. Движок сайта соответственно не выполняется, поэтому "тормозов" в работе для других пользователей не будет.

    Требования PHP 4 / 5 Установка

    IP.Board
    Загрузите файл DAFQS.php в корень вашего сайта. globalTemplate.zip Откройте файл index.php, находящийся в корне вашего сайта и после первой строчки <?php вставьте: require_once 'DAFQS.php'; Перейдите к пункту Настройка Другие движки


    Процедура установки скрипта зависит от архитектуры конкретного движка, поэтому если вам нужно установить этот скрипт не на IP.Board напишите в эту тему название движка, а я сделаю инструкцию под него.
    Настройка



    После строчки
    require_once 'DAFQS.php'; вставьте: new DAFQS(a, b, c); Где a - максимальное количество запросов от одного клиента, b - лимит секунд, c - время бана в секундах.
    Все это расшифровывается как "Если выполнено больше a запросов за b секунд, то выдается бан* на с секунд".
    Естественно, в
    new DAFQS(a, b, c); a, b, c нужно заменить на необходимые значения, я рекомендую поставить 3, 1, 5. После этого сохраните файл. Скрипт установлен.
    * под баном подразумевается время, в течение которого пользователю не будет отображаться сайт и соответственно, не будет никакой нагрузки от этого пользователя.
    Информация


    Версия 1.10
    Автор _Dark_
    Написано для посетителей IPBMafia.Ru
    Список изменений:
    1.11 - исправлен баг с баном пользователя. 1.10 - добавлена возможность вручную устанавливать время бана. 1.00 - первый релиз.
  15. Лайк
    _Dark_ получил реакцию от dedushka в Не приходить письмо с активацией   
    Это говорит о том, что вы что-то сделали с настройками в IP.Board 3.3.3.
  16. Лайк
    _Dark_ получил реакцию от paplavok в Invision Power Board 3.4.1 Русифицированный выпуск / Nulled by IPBmafia.Ru   
    Название: Invision Power Board 3.4.1 Русифицированный выпуск / Nulled by IPBmafia.Ru
    Добавил: _Dark_
    Добавлен: 20 Янв 2013
    Категория: Релизы IP.Board

    Invision Power Board 3.4.1 Русифицированный выпуск / Nulled by IPBmafia.Ru

    Команда проекта IPBmafia.Ru рада представить русифицированный выпуск последней на данный момент версии IP.Board — 3.4.1.
    Обобщающая информация о версии 3.4.1 представлена в


    Информация о релизе
    Версия: 3.4.1
    Язык интерфейса: русский
    Статус: активация не требуется
    Автор: _Dark_



  17. Лайк
    _Dark_ получил реакцию от Marksman в Unreal Portal и ShoutBox   
    Насчет копирайтов:
    Открыть файл:
    /admin/applications_addon/other/uportal/modules_public/uportal/uportal.php

    Найти:


    $output = base64_decode('PGRpdiBhbGlnbj0nY2VudGVyJz5Qb3dlcmVkIGJ5IFVucmVhbCBQ
    b3J0YWwgdjMuMC4yICZjb3B5OyAyMDExIDxhIGhyZWY9J2h0dHA6Ly93d3cudW5yZWFsLXN
    vbHV0aW9ucy5vcmcnIHRhcmdldD0nX2JsYW5rJz5VbnJlYWwgU29sdXRpb25zPC9hPjwvZ
    Gl2Pg==');
    $this->output .= $output;
    [/CODE]
    Удалить.
  18. Лайк
    _Dark_ получил реакцию от vovchik в Unreal Portal и ShoutBox   
    Насчет копирайтов:
    Открыть файл:
    /admin/applications_addon/other/uportal/modules_public/uportal/uportal.php

    Найти:


    $output = base64_decode('PGRpdiBhbGlnbj0nY2VudGVyJz5Qb3dlcmVkIGJ5IFVucmVhbCBQ
    b3J0YWwgdjMuMC4yICZjb3B5OyAyMDExIDxhIGhyZWY9J2h0dHA6Ly93d3cudW5yZWFsLXN
    vbHV0aW9ucy5vcmcnIHRhcmdldD0nX2JsYW5rJz5VbnJlYWwgU29sdXRpb25zPC9hPjwvZ
    Gl2Pg==');
    $this->output .= $output;
    [/CODE]
    Удалить.
  19. Лайк
    _Dark_ получил реакцию от YOLO в Invision Power Board 3.4.2 Русифицированный выпуск / Nulled (IPBmafia.Ru)   
    Название: Invision Power Board 3.4.2 Русифицированный выпуск / Nulled (IPBmafia.Ru)
    Добавил: _Dark_
    Добавлен: 12 Фев 2013
    Категория: Релизы IP.Board

    Invision Power Board 3.4.2 Русифицированный выпуск / Nulled (IPBmafia.Ru)


    Команда проекта IPBmafia.Ru выражает благодарность пользователю instrumentariy за предоставленную локализацию.

    Команда проекта IPBmafia.Ru рада представить русифицированный выпуск последний на данный момент версии IP.Board — 3.4.2.
    Версия 3.4.2 является техническим и исправляет найденные ошибки в версии 3.4.1.

    Информация о релизе


    Версия: 3.4.2
    Язык интерфейса: русский
    Статус: активация не требуется
    Автор: _Dark_



  20. Лайк
    _Dark_ получил реакцию от Vyacheslav2 в Invision Power Board 3.3.4 English / Nulled by IPBMafia.Ru   
    Название: Invision Power Board 3.3.4 English / Nulled by IPBMafia.Ru
    Добавил: _Dark_
    Добавлен: 11 Июл 2012
    Категория: Релизы IP.Board



    Invision Power Board 3.3.4 (English version) Nulled by IPBMafia.Ru




    Несколько часов назад, как и ожидалось, вышла новая версия IP.Board - 3.3.4. Nulled версия уже готова


    Данное обновление не несет никаких изменений в функциональности, но содержит большое количество баг-фиксов и исправлений. Всем пользователям рекомендуется обновиться, т.к. в старых версиях могут содержаться критические проблемы в безопасности (что и было доказано несколько дней назад).


    Информация о версии:

    Издатель: IPS
    Версия: 3.3.4
    Язык: Английский ()
    Лицензия: Nulled


    Информация о nulled версии:
    Использован оригинальный дистрибутив из клиент-центра IPS
    Автоматическая активация. Вам не нужно ничего вводить, нажимать, и т.д. Просто установите скрипт, активация произойдет незаметно.
    Рабочий визуальный редактор стилей.
    Возможность удаления копирайтов скрипта через АЦ.

    Информация о релизе:

    Автор: _Dark_ (IPBMafia.Ru)

    Релиз обновлен 07.11.2012, встроено безопасности.


  21. Лайк
    _Dark_ получил реакцию от SUAMF в Как я взлом сайта расследовал.   
    Если вы зашли сюда — будьте готовы к огромному количеству букв, различных терминов, непонятного кода и т.п.

    Началось все с темы.


    Fatal error: Cannot redeclare ololololololo1() (previously declared in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/av-128.jpg(33) : regexp code(1) : eval()'d code:2) in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/photo-128.jpg(33) : regexp code(1) : eval()'d code on line 3
    Как мы видим, ошибка незаурядная. Само наличие "ololololololo1" уже говорит о многом, а учитывая то, что все это происходит в файле av-128.jpg — вообще интересно. В общем то, только по вот этим признакам уже можно говорить о том, что сайт подвергся взлому. Первым делом были взяты эти два файла и пока отложены на просторы рабочего стола. Т.к. обсуждать все это на форуме было неудобно — списались с в ICQ. Для начала хотелось выяснить, кто это сделал. Файл uploads/profile/av-128.jpg является аватаркой пользователя с ID 128 (пока не будем говорить о том, как вообще в аватарке оказался PHP код), казалось бы нарушитель найден, но проблема в том, что владелец сайта чистил БД от старых записей и аккаунт пользователя удален. Ладно, к черту тогда личность взломщика, давайте разбираться, что произошло. Первое что приходит в голову — запросить у хостера список измененных .php файлов за последнюю неделю. Запрашиваем. Хостер предоставить их не может, но зато он нам любезно включает SSH доступ (это действительно хорошая черта тех.поддержки хостинга — они поняли в чем дело и без лишних разговоров предоставляют нам то, что в наш тарифный план не входит). Отлично, SSH у нас есть. При помощи простой команды find /public_html/ -type f -iname "*.php" -mtime -7[/code] (полный путь к директории вырезан за ненадобностью) получаем: [spoiler] [code]
    public_html/cache/cache_clean.php
    public_html/cache/globalCaches.php
    public_html/cache/furlCache.php
    public_html/cache/skin_cache/cacheid_1/skin_register.php
    public_html/cache/skin_cache/cacheid_1/skin_profile.php
    public_html/cache/skin_cache/cacheid_1/skin_online.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_support.php
    public_html/cache/skin_cache/cacheid_1/skin_editors.php
    public_html/cache/skin_cache/cacheid_1/skin_shoutbox.php
    public_html/cache/skin_cache/cacheid_1/skin_stats.php
    public_html/cache/skin_cache/cacheid_1/skin_upload.php
    public_html/cache/skin_cache/cacheid_1/skin_emails.php
    public_html/cache/skin_cache/cacheid_1/skin_promenu.php
    public_html/cache/skin_cache/cacheid_1/skin_ipseo.php
    public_html/cache/skin_cache/cacheid_1/skin_login.php
    public_html/cache/skin_cache/cacheid_1/skin_mod.php
    public_html/cache/skin_cache/cacheid_1/skin_search.php
    public_html/cache/skin_cache/cacheid_1/skin_shoutbox_hooks.php
    public_html/cache/skin_cache/cacheid_1/skin_boards.php
    public_html/cache/skin_cache/cacheid_1/skin_gms.php
    public_html/cache/skin_cache/cacheid_1/skin_messaging.php
    public_html/cache/skin_cache/cacheid_1/skin_legends.php
    public_html/cache/skin_cache/cacheid_1/skin_cp.php
    public_html/cache/skin_cache/cacheid_1/skin_post.php
    public_html/cache/skin_cache/cacheid_1/skin_mlist.php
    public_html/cache/skin_cache/cacheid_1/skin_modcp.php
    public_html/cache/skin_cache/cacheid_1/skin_global_other.php
    public_html/cache/skin_cache/cacheid_1/skin_reports.php
    public_html/cache/skin_cache/cacheid_1/skin_global.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_clients.php
    public_html/cache/skin_cache/cacheid_1/skin_topic.php
    public_html/cache/skin_cache/cacheid_1/skin_help.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_emails.php
    public_html/cache/skin_cache/cacheid_1/skin_ucp.php
    public_html/cache/skin_cache/cacheid_1/skin_global_comments.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_payments.php
    public_html/cache/skin_cache/cacheid_1/skin_forum.php
    public_html/cache/cache.php
    public_html/cache/aq.php
    public_html/cache/sd2178.php
    public_html/hooks/ipSeoPingTopics_9be3a8f6d34784b16a253af2060440da.php
    public_html/hooks/ipSeoAcronymsEditor_f29ecb558858bb04bf957fb505093329.php
    public_html/hooks/ipSeoMeta_1dfa8b1e2915158bcd0bc2ca20a90f4f.php
    public_html/hooks/dp3_fi_boardsClassActionOverloader_5fee7a7dd42c37cd850eba64e519789d.php
    public_html/hooks/cstopspamreg_cea6e736e42ab14fa64581f28c8c08d1.php
    public_html/hooks/passwordStrength_skin_7b219a756db0cc9bcbf78cb9b17ad92f.php
    public_html/hooks/ipSeoGuestSkin_ceb6061092c92fc4b36e682aabaa5c96.php
    public_html/hooks/globalProMenuRemovalTool_f73b5f48f7515d65c93216498d309aac.php
    public_html/hooks/cstopspamreg_bstats_99fac0fad97daf26fb18c4e61a46ed90.php
    public_html/hooks/topicosrecentes_ucp_8eced785d6487592b493fc683e778f68.php
    public_html/hooks/dp3_fi_forumsClassActionOverloader_0317c8e4a356386124447e57d90a0188.php
    public_html/hooks/globalProMenuJava_1e4b91655304505004f3429052bc0561.php
    public_html/hooks/ipSeoAcronymsBbcodeParser_46716b0eace16d346a426516a5a550ca.php
    [/code] [/spoiler] В глаза бросается [code]
    public_html/cache/aq.php
    public_html/cache/sd2178.php
    (названия файлов изменены, т.к. пока незачем их публиковать всем).
    [/code] (файл [font=courier new,courier,monospace]public_html/cache/cache.php[/font] я заметил только когда писал это, с ним тоже разберемся). Первый файл оказывается скриптом, значение которого я так и не понял. Второй файл имеет интересное содержание. После небольшой пробежки по Google оказываемся здесь. Все понятно, бэкдор из паблика. Удалять эти файлы как-то банально, сделаем по другому — заставим эти файлы работать на нас. Я не буду приводить код, скажу только, что IP-адрес, а так же информация о системе каждого, кто откроет эти файлы будут сохранены. С этим разобрались. Но очевидно, что "центр" взлома находится не здесь, а вон в тех аватарках с PHP кодом. Нам нужно определить, что этот код делает, чтобы установить, для чего был осуществлен взлом. Для начала берем первый файл — [b]av-128.php[/b]. Открываем его. Смотрим. Это кошмар. Во-первых, сразу видно, что код обфусцирован. Во-вторых, начисто нет форматирования кода. Начинаем с малого, приведем код к читаемому виду, в плане переносов строк. Для этого воспользуемся вот этим прекрасным сервисом, который отформатирует код за нас. Прогоняем код. Получаем результат, смотрим. Красота. Код стал более читабелен, мы можем сразу провести небольшой анализ. В коде нет зарезервированных слов PHP (if, function, for, while, и т.д.). Значит код в том виде, в котором он сейчас использует только стандартные функции PHP, не определяя свои. Из первого пункта получаем, что код обфусцирован несколько раз (почему? Потому что свои функции у скрипта все таки есть, помните ошибку, с которой все начиналось?). Скорее всего деобфусцировать код автоматически не выйдет. Поискав в Google сервисы для деобфускации становится понятно, что все что там есть — ерунда. Ну что ж, будем делать все самостоятельно. [size=5][b]Этап 1.[/b][/size] Бегло взглянув на код и обнаружив множество текстовых строк, а затем одну, которая все их объединяет [code]
    $v3IWiBF = // и здесь все эти текстовые строки
    [/code] приходим к выводу, что на данной стадии в коде минимум логики. Нужно найти переход с этого уровня кода на более низкий. Смотрим где же используется эта переменная [font=courier new,courier,monospace]$v3IWiBF[/font] с огромным текстом внутри. В коде таких упоминаний одно, это [code]
    $lGp2BqP = $Mb8Ze($v3IWiBF, $hFl0_($Jj1U($TjMGm), $Jj1U($VtLjYNP)));
    [/code] Ладно, смотрим где встречается собственно [font=courier new,courier,monospace]$lGp2BqP[/font], а это — последняя строка, вот [code]$d1QZk($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Значит переход на более низкий уровень кода находится на последней строке, это означает, что код обфусцирован [i]последовательно[/i], т.е. весь код (а не его отдельные части) был обфусцирован несколько раз. Это упрощает работу, значит нам тоже разбирать код можно последовательно, не пытаясь найти места, с которых начать. [size=5][b]Этап 2.[/b][/size] Есть такие задачки для маленьких детей, где нарисованы какие-то непрерывные линии, их начала и концы указаны и нужно найти какая линия к чему приведет, причем начал больше чем концов. Легче всего это решить пойдя по этим линиям с конца, вот и мы поступим так же. У нас есть функция, которая ведет к переходу на более низкий уровень кода — эта та самая последняя строчка [code]$d1QZk($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Будем работать над ней. Смотрим на образование названия самой функции: [code]
    $oWHh = "\160\162";
    $zYdUyk = 'eg';
    $XqVM = "\137\162";
    $PU0b = "\145\160";
    $I0Tf = "\154\141";
    $qGX8ht = "\143\145";
    $d1QZk = $oWHh . $zYdUyk . $XqVM . $PU0b . $I0Tf . $qGX8ht;[/code] Через секунд 10 раздумий в голову приходит, что 160, 162, 137 и т.д. — это ASCII коды и о них нам рассказывали где-то в школе. Ищем таблицу ASCII кодов, открываем, ищем число 160. Находим, это символ [b][size=4]á[/size][/b]. В PHP нет стандартных функций в названиях которых используются такие символы (а на данном уровне кода у скрипта тоже никаких своих функций нет, помните мы выше это выяснили). Значит 160 нам не подходит, но ведь в коде он используется. Вспоминаем синтаксис PHP, черт, ведь там код символа указывается в восьмеричной системе исчисления. Смотрим тогда колонку [i]Oct[/i] (Octal — восьмеричная система исчисления). Находим, это латинская буква [b]p[/b]. Подходит! Смотрим дальше. 162 — это буква [b]r[/b], получаем, что [code]$oWHh = "\160\162";
    $zYdUyk = 'eg';[/code] это ни что иное, как [b]preg[/b], т.е. это библиотека для работы с регулярными выражениями в PHP. Смотрим дальше, когда мы получаем[b] preg_r [/b]становится понятно, что вся функция имеет название [b]preg_replace[/b]. Промежуточный результат: [code]preg_replace($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Ну, совсем просто узнаем, что [font=courier new,courier,monospace]$phl6yJ[/font] это [code]/.*/e[/code] . Промежуточный результат: [code]preg_replace('/.*/e', $r6Q7D($lGp2BqP), $PJf4o9);[/code] Смотрим, что такое [font=courier new,courier,monospace]$r6Q7D[/font]. В коде это [code]
    $BiDR51n = "\142\141";
    $IhcdiCL = 'se';
    $Vq5GI = '64';
    $ID4o = "\137\144";
    $nBHq = 'ec';
    $ekeM_1 = "\157\144";
    $NViQXn = "\145";
    $r6Q7D = $BiDR51n . $IhcdiCL . $Vq5GI . $ID4o . $nBHq . $ekeM_1 . $NViQXn;
    [/code] Увидев [font=courier new,courier,monospace]..se64..ec...[/font] машинально вспоминаем [code]base64_decode[/code] Промежуточный результат: [code]preg_replace('/.*/e', base64_decode($lGp2BqP), $PJf4o9);[/code] [font=courier new,courier,monospace]$lGp2BqP[/font] — это результат работы какой-то функции, которая обрабатывает результат другой функции, пропустим пока. Остается [font=courier new,courier,monospace]$PJf4o9[/font]. Находим [code]
    $uRk52 = "";
    $PJf4o9 = $uRk52;
    [/code] в самом начале файла. Пустая строка. Отлично. Промежуточный результат: [code]preg_replace('/.*/e', base64_decode($lGp2BqP), '');[/code] Теперь будем разбираться с [font=courier new,courier,monospace]$lGp2BqP[/font]. Путем рассуждений которые мы делали выше узнаем, что [font=courier new,courier,monospace]$lGp2BqP [/font]— это [code]$lGp2BqP = strtr($v3IWiBF, array_combine(str_split($TjMGm), str_split($VtLjYNP)));[/code] Подставляем переменные и получаем [code]$lGp2BqP = strtr($v3IWiBF, array_combine(str_split('0=7ApLG%5HY#VS-$u_xsE 9,ZtD!crgq2b^/:6o3v1(&ln~k)\'B*IdQ[f4a`W\\'), str_split('8yaoY9jrcKuARDHlPC3S65nBwemEiN=Q1Vhf2stLZqJGUdIWbpM0zx4XvTFkgO')));[/code] А [font=courier new,courier,monospace]$v3IWiBF[/font] — это та огромная строка, про которую мы говорили в самом начале. Промежуточный результат: [code]preg_replace('/.*/e', base64_decode(strtr($v3IWiBF, array_combine(str_split('0=7ApLG%5HY#VS-$u_xsE 9,ZtD!crgq2b^/:6o3v1(&ln~k)\'B*IdQ[f4a`W\\'), str_split('8yaoY9jrcKuARDHlPC3S65nBwemEiN=Q1Vhf2stLZqJGUdIWbpM0zx4XvTFkgO')))), '');[/code] [code]'/.*/e'[/code] в регулярном выражении означает выполнение кода, указанного в строке. Значит нам нужно получить эту строку, это основной код скрипта. Выполняем [font=courier new,courier,monospace]base64_decode[/font] и получаем вот это. [b][size=5]Этап 3[/size][/b] Переходим на еще более низкий уровень кода, опять выполнив [font=courier new,courier,monospace]base64_decode[/font]. Результат. Вот мы и добрались до этой функции [font=courier new,courier,monospace]ololololololo1[/font]. Смотрим и видим это [code]\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'[/code] Это пошли уже HEX коды символов, расшифровав получаем [code]
    eval(gzinflate(base64_decode('/* зашифрованный код */')));
    [/code] Переходим еще на уровень ниже... [b][size=5]Этап 4[/size][/b] Вот он код, ребята! После небольшой паузы я начал смеяться, нет, правда Мы получили такой же код, как и в файле [code]public_html/cache/sd2178.php[/code] , отличие только в том, что он выполняется, если у пользователя установлена cookie с названием [b]zx[/b]. Получается, мы просто потратили время впустую? Нет. Во-первых, знаете, это вообще клёвое (я вообще никогда не ставлю букву Ё при набирании текста на клавиатуре, это исторический момент) чувство когда делаешь что-то вроде взлома. Ведь в самом деле, мы только что взломали защиту, которую кто-то делал. Во-вторых, лично я получил прекрасный опыт работы с [b]таким[/b] кодом. Можно считать эта была тренировка на умение ориентироваться и разбираться в защищенном коде. В-третьих, я могу сказать владельцу сайта (как писал я уже выше — это [member='Fensmas']), что ничего супер-страшного в этом коде не нашлось (нет, вообще этот скрипт может многое, вплоть до удаления всех файлов сайта, но мы сделали все вовремя). А вообще у нас есть еще один файл — [font=courier new,courier,monospace]uploads/profile/photo-128.jpg[/font], но разбирать его нет смысла. Вспомним ошибку: [CODE]
    Fatal error: Cannot redeclare ololololololo1() (previously declared in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/av-128.jpg(33) : regexp code(1) : eval()'d code:2) in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/photo-128.jpg(33) : regexp code(1) : eval()'d code on line 3
    [/code]
    Если кратко — код в этом файле является идентичным коду, который мы только что разбирали.

    [size=5][b]Итоги[/b][/size]

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

    Учитывая то, что в общем-то код был один и тот же, можно предположить, что через один бэкдор были закачаны все остальные (а не было взлома еще и механизма кэширования IP.Board).

    В любом случае, я считаю, что это время я потратил не зря, хотя бы потому что это было интересно.
    Спасибо.


    Respected: так же можете почитать эту статью:

    [size=5][b]UPDATE 09.11.2012[/b][/size]
    Способ взлома сайта найден.
    Подробности опубликованы в теме.
  22. Лайк
    _Dark_ получил реакцию от NIKOLYA в Invision Power Board 3.4.2 Русифицированный выпуск / Nulled (IPBmafia.Ru)   
    Название: Invision Power Board 3.4.2 Русифицированный выпуск / Nulled (IPBmafia.Ru)
    Добавил: _Dark_
    Добавлен: 12 Фев 2013
    Категория: Релизы IP.Board

    Invision Power Board 3.4.2 Русифицированный выпуск / Nulled (IPBmafia.Ru)


    Команда проекта IPBmafia.Ru выражает благодарность пользователю instrumentariy за предоставленную локализацию.

    Команда проекта IPBmafia.Ru рада представить русифицированный выпуск последний на данный момент версии IP.Board — 3.4.2.
    Версия 3.4.2 является техническим и исправляет найденные ошибки в версии 3.4.1.

    Информация о релизе


    Версия: 3.4.2
    Язык интерфейса: русский
    Статус: активация не требуется
    Автор: _Dark_



  23. Лайк
    _Dark_ получил реакцию от Riddick в Как я взлом сайта расследовал.   
    Если вы зашли сюда — будьте готовы к огромному количеству букв, различных терминов, непонятного кода и т.п.

    Началось все с темы.


    Fatal error: Cannot redeclare ololololololo1() (previously declared in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/av-128.jpg(33) : regexp code(1) : eval()'d code:2) in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/photo-128.jpg(33) : regexp code(1) : eval()'d code on line 3
    Как мы видим, ошибка незаурядная. Само наличие "ololololololo1" уже говорит о многом, а учитывая то, что все это происходит в файле av-128.jpg — вообще интересно. В общем то, только по вот этим признакам уже можно говорить о том, что сайт подвергся взлому. Первым делом были взяты эти два файла и пока отложены на просторы рабочего стола. Т.к. обсуждать все это на форуме было неудобно — списались с в ICQ. Для начала хотелось выяснить, кто это сделал. Файл uploads/profile/av-128.jpg является аватаркой пользователя с ID 128 (пока не будем говорить о том, как вообще в аватарке оказался PHP код), казалось бы нарушитель найден, но проблема в том, что владелец сайта чистил БД от старых записей и аккаунт пользователя удален. Ладно, к черту тогда личность взломщика, давайте разбираться, что произошло. Первое что приходит в голову — запросить у хостера список измененных .php файлов за последнюю неделю. Запрашиваем. Хостер предоставить их не может, но зато он нам любезно включает SSH доступ (это действительно хорошая черта тех.поддержки хостинга — они поняли в чем дело и без лишних разговоров предоставляют нам то, что в наш тарифный план не входит). Отлично, SSH у нас есть. При помощи простой команды find /public_html/ -type f -iname "*.php" -mtime -7[/code] (полный путь к директории вырезан за ненадобностью) получаем: [spoiler] [code]
    public_html/cache/cache_clean.php
    public_html/cache/globalCaches.php
    public_html/cache/furlCache.php
    public_html/cache/skin_cache/cacheid_1/skin_register.php
    public_html/cache/skin_cache/cacheid_1/skin_profile.php
    public_html/cache/skin_cache/cacheid_1/skin_online.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_support.php
    public_html/cache/skin_cache/cacheid_1/skin_editors.php
    public_html/cache/skin_cache/cacheid_1/skin_shoutbox.php
    public_html/cache/skin_cache/cacheid_1/skin_stats.php
    public_html/cache/skin_cache/cacheid_1/skin_upload.php
    public_html/cache/skin_cache/cacheid_1/skin_emails.php
    public_html/cache/skin_cache/cacheid_1/skin_promenu.php
    public_html/cache/skin_cache/cacheid_1/skin_ipseo.php
    public_html/cache/skin_cache/cacheid_1/skin_login.php
    public_html/cache/skin_cache/cacheid_1/skin_mod.php
    public_html/cache/skin_cache/cacheid_1/skin_search.php
    public_html/cache/skin_cache/cacheid_1/skin_shoutbox_hooks.php
    public_html/cache/skin_cache/cacheid_1/skin_boards.php
    public_html/cache/skin_cache/cacheid_1/skin_gms.php
    public_html/cache/skin_cache/cacheid_1/skin_messaging.php
    public_html/cache/skin_cache/cacheid_1/skin_legends.php
    public_html/cache/skin_cache/cacheid_1/skin_cp.php
    public_html/cache/skin_cache/cacheid_1/skin_post.php
    public_html/cache/skin_cache/cacheid_1/skin_mlist.php
    public_html/cache/skin_cache/cacheid_1/skin_modcp.php
    public_html/cache/skin_cache/cacheid_1/skin_global_other.php
    public_html/cache/skin_cache/cacheid_1/skin_reports.php
    public_html/cache/skin_cache/cacheid_1/skin_global.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_clients.php
    public_html/cache/skin_cache/cacheid_1/skin_topic.php
    public_html/cache/skin_cache/cacheid_1/skin_help.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_emails.php
    public_html/cache/skin_cache/cacheid_1/skin_ucp.php
    public_html/cache/skin_cache/cacheid_1/skin_global_comments.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_payments.php
    public_html/cache/skin_cache/cacheid_1/skin_forum.php
    public_html/cache/cache.php
    public_html/cache/aq.php
    public_html/cache/sd2178.php
    public_html/hooks/ipSeoPingTopics_9be3a8f6d34784b16a253af2060440da.php
    public_html/hooks/ipSeoAcronymsEditor_f29ecb558858bb04bf957fb505093329.php
    public_html/hooks/ipSeoMeta_1dfa8b1e2915158bcd0bc2ca20a90f4f.php
    public_html/hooks/dp3_fi_boardsClassActionOverloader_5fee7a7dd42c37cd850eba64e519789d.php
    public_html/hooks/cstopspamreg_cea6e736e42ab14fa64581f28c8c08d1.php
    public_html/hooks/passwordStrength_skin_7b219a756db0cc9bcbf78cb9b17ad92f.php
    public_html/hooks/ipSeoGuestSkin_ceb6061092c92fc4b36e682aabaa5c96.php
    public_html/hooks/globalProMenuRemovalTool_f73b5f48f7515d65c93216498d309aac.php
    public_html/hooks/cstopspamreg_bstats_99fac0fad97daf26fb18c4e61a46ed90.php
    public_html/hooks/topicosrecentes_ucp_8eced785d6487592b493fc683e778f68.php
    public_html/hooks/dp3_fi_forumsClassActionOverloader_0317c8e4a356386124447e57d90a0188.php
    public_html/hooks/globalProMenuJava_1e4b91655304505004f3429052bc0561.php
    public_html/hooks/ipSeoAcronymsBbcodeParser_46716b0eace16d346a426516a5a550ca.php
    [/code] [/spoiler] В глаза бросается [code]
    public_html/cache/aq.php
    public_html/cache/sd2178.php
    (названия файлов изменены, т.к. пока незачем их публиковать всем).
    [/code] (файл [font=courier new,courier,monospace]public_html/cache/cache.php[/font] я заметил только когда писал это, с ним тоже разберемся). Первый файл оказывается скриптом, значение которого я так и не понял. Второй файл имеет интересное содержание. После небольшой пробежки по Google оказываемся здесь. Все понятно, бэкдор из паблика. Удалять эти файлы как-то банально, сделаем по другому — заставим эти файлы работать на нас. Я не буду приводить код, скажу только, что IP-адрес, а так же информация о системе каждого, кто откроет эти файлы будут сохранены. С этим разобрались. Но очевидно, что "центр" взлома находится не здесь, а вон в тех аватарках с PHP кодом. Нам нужно определить, что этот код делает, чтобы установить, для чего был осуществлен взлом. Для начала берем первый файл — [b]av-128.php[/b]. Открываем его. Смотрим. Это кошмар. Во-первых, сразу видно, что код обфусцирован. Во-вторых, начисто нет форматирования кода. Начинаем с малого, приведем код к читаемому виду, в плане переносов строк. Для этого воспользуемся вот этим прекрасным сервисом, который отформатирует код за нас. Прогоняем код. Получаем результат, смотрим. Красота. Код стал более читабелен, мы можем сразу провести небольшой анализ. В коде нет зарезервированных слов PHP (if, function, for, while, и т.д.). Значит код в том виде, в котором он сейчас использует только стандартные функции PHP, не определяя свои. Из первого пункта получаем, что код обфусцирован несколько раз (почему? Потому что свои функции у скрипта все таки есть, помните ошибку, с которой все начиналось?). Скорее всего деобфусцировать код автоматически не выйдет. Поискав в Google сервисы для деобфускации становится понятно, что все что там есть — ерунда. Ну что ж, будем делать все самостоятельно. [size=5][b]Этап 1.[/b][/size] Бегло взглянув на код и обнаружив множество текстовых строк, а затем одну, которая все их объединяет [code]
    $v3IWiBF = // и здесь все эти текстовые строки
    [/code] приходим к выводу, что на данной стадии в коде минимум логики. Нужно найти переход с этого уровня кода на более низкий. Смотрим где же используется эта переменная [font=courier new,courier,monospace]$v3IWiBF[/font] с огромным текстом внутри. В коде таких упоминаний одно, это [code]
    $lGp2BqP = $Mb8Ze($v3IWiBF, $hFl0_($Jj1U($TjMGm), $Jj1U($VtLjYNP)));
    [/code] Ладно, смотрим где встречается собственно [font=courier new,courier,monospace]$lGp2BqP[/font], а это — последняя строка, вот [code]$d1QZk($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Значит переход на более низкий уровень кода находится на последней строке, это означает, что код обфусцирован [i]последовательно[/i], т.е. весь код (а не его отдельные части) был обфусцирован несколько раз. Это упрощает работу, значит нам тоже разбирать код можно последовательно, не пытаясь найти места, с которых начать. [size=5][b]Этап 2.[/b][/size] Есть такие задачки для маленьких детей, где нарисованы какие-то непрерывные линии, их начала и концы указаны и нужно найти какая линия к чему приведет, причем начал больше чем концов. Легче всего это решить пойдя по этим линиям с конца, вот и мы поступим так же. У нас есть функция, которая ведет к переходу на более низкий уровень кода — эта та самая последняя строчка [code]$d1QZk($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Будем работать над ней. Смотрим на образование названия самой функции: [code]
    $oWHh = "\160\162";
    $zYdUyk = 'eg';
    $XqVM = "\137\162";
    $PU0b = "\145\160";
    $I0Tf = "\154\141";
    $qGX8ht = "\143\145";
    $d1QZk = $oWHh . $zYdUyk . $XqVM . $PU0b . $I0Tf . $qGX8ht;[/code] Через секунд 10 раздумий в голову приходит, что 160, 162, 137 и т.д. — это ASCII коды и о них нам рассказывали где-то в школе. Ищем таблицу ASCII кодов, открываем, ищем число 160. Находим, это символ [b][size=4]á[/size][/b]. В PHP нет стандартных функций в названиях которых используются такие символы (а на данном уровне кода у скрипта тоже никаких своих функций нет, помните мы выше это выяснили). Значит 160 нам не подходит, но ведь в коде он используется. Вспоминаем синтаксис PHP, черт, ведь там код символа указывается в восьмеричной системе исчисления. Смотрим тогда колонку [i]Oct[/i] (Octal — восьмеричная система исчисления). Находим, это латинская буква [b]p[/b]. Подходит! Смотрим дальше. 162 — это буква [b]r[/b], получаем, что [code]$oWHh = "\160\162";
    $zYdUyk = 'eg';[/code] это ни что иное, как [b]preg[/b], т.е. это библиотека для работы с регулярными выражениями в PHP. Смотрим дальше, когда мы получаем[b] preg_r [/b]становится понятно, что вся функция имеет название [b]preg_replace[/b]. Промежуточный результат: [code]preg_replace($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Ну, совсем просто узнаем, что [font=courier new,courier,monospace]$phl6yJ[/font] это [code]/.*/e[/code] . Промежуточный результат: [code]preg_replace('/.*/e', $r6Q7D($lGp2BqP), $PJf4o9);[/code] Смотрим, что такое [font=courier new,courier,monospace]$r6Q7D[/font]. В коде это [code]
    $BiDR51n = "\142\141";
    $IhcdiCL = 'se';
    $Vq5GI = '64';
    $ID4o = "\137\144";
    $nBHq = 'ec';
    $ekeM_1 = "\157\144";
    $NViQXn = "\145";
    $r6Q7D = $BiDR51n . $IhcdiCL . $Vq5GI . $ID4o . $nBHq . $ekeM_1 . $NViQXn;
    [/code] Увидев [font=courier new,courier,monospace]..se64..ec...[/font] машинально вспоминаем [code]base64_decode[/code] Промежуточный результат: [code]preg_replace('/.*/e', base64_decode($lGp2BqP), $PJf4o9);[/code] [font=courier new,courier,monospace]$lGp2BqP[/font] — это результат работы какой-то функции, которая обрабатывает результат другой функции, пропустим пока. Остается [font=courier new,courier,monospace]$PJf4o9[/font]. Находим [code]
    $uRk52 = "";
    $PJf4o9 = $uRk52;
    [/code] в самом начале файла. Пустая строка. Отлично. Промежуточный результат: [code]preg_replace('/.*/e', base64_decode($lGp2BqP), '');[/code] Теперь будем разбираться с [font=courier new,courier,monospace]$lGp2BqP[/font]. Путем рассуждений которые мы делали выше узнаем, что [font=courier new,courier,monospace]$lGp2BqP [/font]— это [code]$lGp2BqP = strtr($v3IWiBF, array_combine(str_split($TjMGm), str_split($VtLjYNP)));[/code] Подставляем переменные и получаем [code]$lGp2BqP = strtr($v3IWiBF, array_combine(str_split('0=7ApLG%5HY#VS-$u_xsE 9,ZtD!crgq2b^/:6o3v1(&ln~k)\'B*IdQ[f4a`W\\'), str_split('8yaoY9jrcKuARDHlPC3S65nBwemEiN=Q1Vhf2stLZqJGUdIWbpM0zx4XvTFkgO')));[/code] А [font=courier new,courier,monospace]$v3IWiBF[/font] — это та огромная строка, про которую мы говорили в самом начале. Промежуточный результат: [code]preg_replace('/.*/e', base64_decode(strtr($v3IWiBF, array_combine(str_split('0=7ApLG%5HY#VS-$u_xsE 9,ZtD!crgq2b^/:6o3v1(&ln~k)\'B*IdQ[f4a`W\\'), str_split('8yaoY9jrcKuARDHlPC3S65nBwemEiN=Q1Vhf2stLZqJGUdIWbpM0zx4XvTFkgO')))), '');[/code] [code]'/.*/e'[/code] в регулярном выражении означает выполнение кода, указанного в строке. Значит нам нужно получить эту строку, это основной код скрипта. Выполняем [font=courier new,courier,monospace]base64_decode[/font] и получаем вот это. [b][size=5]Этап 3[/size][/b] Переходим на еще более низкий уровень кода, опять выполнив [font=courier new,courier,monospace]base64_decode[/font]. Результат. Вот мы и добрались до этой функции [font=courier new,courier,monospace]ololololololo1[/font]. Смотрим и видим это [code]\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'[/code] Это пошли уже HEX коды символов, расшифровав получаем [code]
    eval(gzinflate(base64_decode('/* зашифрованный код */')));
    [/code] Переходим еще на уровень ниже... [b][size=5]Этап 4[/size][/b] Вот он код, ребята! После небольшой паузы я начал смеяться, нет, правда Мы получили такой же код, как и в файле [code]public_html/cache/sd2178.php[/code] , отличие только в том, что он выполняется, если у пользователя установлена cookie с названием [b]zx[/b]. Получается, мы просто потратили время впустую? Нет. Во-первых, знаете, это вообще клёвое (я вообще никогда не ставлю букву Ё при набирании текста на клавиатуре, это исторический момент) чувство когда делаешь что-то вроде взлома. Ведь в самом деле, мы только что взломали защиту, которую кто-то делал. Во-вторых, лично я получил прекрасный опыт работы с [b]таким[/b] кодом. Можно считать эта была тренировка на умение ориентироваться и разбираться в защищенном коде. В-третьих, я могу сказать владельцу сайта (как писал я уже выше — это [member='Fensmas']), что ничего супер-страшного в этом коде не нашлось (нет, вообще этот скрипт может многое, вплоть до удаления всех файлов сайта, но мы сделали все вовремя). А вообще у нас есть еще один файл — [font=courier new,courier,monospace]uploads/profile/photo-128.jpg[/font], но разбирать его нет смысла. Вспомним ошибку: [CODE]
    Fatal error: Cannot redeclare ololololololo1() (previously declared in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/av-128.jpg(33) : regexp code(1) : eval()'d code:2) in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/photo-128.jpg(33) : regexp code(1) : eval()'d code on line 3
    [/code]
    Если кратко — код в этом файле является идентичным коду, который мы только что разбирали.

    [size=5][b]Итоги[/b][/size]

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

    Учитывая то, что в общем-то код был один и тот же, можно предположить, что через один бэкдор были закачаны все остальные (а не было взлома еще и механизма кэширования IP.Board).

    В любом случае, я считаю, что это время я потратил не зря, хотя бы потому что это было интересно.
    Спасибо.


    Respected: так же можете почитать эту статью:

    [size=5][b]UPDATE 09.11.2012[/b][/size]
    Способ взлома сайта найден.
    Подробности опубликованы в теме.
  24. Лайк
    _Dark_ получил реакцию от pasha2189 в Предупреждение владельцам форумов, которые не устанавливали патч безопасности   
    Публикую эту тему здесь, т.к. она действительно важная.

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

    Патч от IPS был выпущен после публикации этого эксплоита, поэтому сейчас огромное количество форумов подвержено взлому.
    мной случай взлома сайта является ничем иным как результат использования этой уязвимости.

    Всем владельцам форумов на IP.Board необходимо установить ,?do=embed' frameborder='0' data-embedContent> в противном случае вам форум может быть подвергнут взлому.

    Внимание!
    Проверьте директорию /cache/ которая находится в корне вашего форума. Если в ней находится файл sh.php (это стандартное имя файла, который создается в результате использования эксплоита) — ваш сайт подвергся взлому.
    Вам необходимо срочно поменять пароль для подключения к базе данных, а так же запросить у хостера список PHP файлов которые были изменены за последние 7 дней.
    Необязательно появление новых файлов, могут быть отредактированы системные файлы IP.Board.
    После этого вы можете обратиться ко мне, отправив список измененных файлов и свои контактные данные, для получения помощи с восстановлением форума.
    Обязательно установите (в него входит и предыдущий патч) для обеспечения должной защиты вашего форума.
  25. Лайк
    _Dark_ получил реакцию от Lordbl4 в Как я взлом сайта расследовал.   
    Если вы зашли сюда — будьте готовы к огромному количеству букв, различных терминов, непонятного кода и т.п.

    Началось все с темы.


    Fatal error: Cannot redeclare ololololololo1() (previously declared in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/av-128.jpg(33) : regexp code(1) : eval()'d code:2) in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/photo-128.jpg(33) : regexp code(1) : eval()'d code on line 3
    Как мы видим, ошибка незаурядная. Само наличие "ololololololo1" уже говорит о многом, а учитывая то, что все это происходит в файле av-128.jpg — вообще интересно. В общем то, только по вот этим признакам уже можно говорить о том, что сайт подвергся взлому. Первым делом были взяты эти два файла и пока отложены на просторы рабочего стола. Т.к. обсуждать все это на форуме было неудобно — списались с в ICQ. Для начала хотелось выяснить, кто это сделал. Файл uploads/profile/av-128.jpg является аватаркой пользователя с ID 128 (пока не будем говорить о том, как вообще в аватарке оказался PHP код), казалось бы нарушитель найден, но проблема в том, что владелец сайта чистил БД от старых записей и аккаунт пользователя удален. Ладно, к черту тогда личность взломщика, давайте разбираться, что произошло. Первое что приходит в голову — запросить у хостера список измененных .php файлов за последнюю неделю. Запрашиваем. Хостер предоставить их не может, но зато он нам любезно включает SSH доступ (это действительно хорошая черта тех.поддержки хостинга — они поняли в чем дело и без лишних разговоров предоставляют нам то, что в наш тарифный план не входит). Отлично, SSH у нас есть. При помощи простой команды find /public_html/ -type f -iname "*.php" -mtime -7[/code] (полный путь к директории вырезан за ненадобностью) получаем: [spoiler] [code]
    public_html/cache/cache_clean.php
    public_html/cache/globalCaches.php
    public_html/cache/furlCache.php
    public_html/cache/skin_cache/cacheid_1/skin_register.php
    public_html/cache/skin_cache/cacheid_1/skin_profile.php
    public_html/cache/skin_cache/cacheid_1/skin_online.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_support.php
    public_html/cache/skin_cache/cacheid_1/skin_editors.php
    public_html/cache/skin_cache/cacheid_1/skin_shoutbox.php
    public_html/cache/skin_cache/cacheid_1/skin_stats.php
    public_html/cache/skin_cache/cacheid_1/skin_upload.php
    public_html/cache/skin_cache/cacheid_1/skin_emails.php
    public_html/cache/skin_cache/cacheid_1/skin_promenu.php
    public_html/cache/skin_cache/cacheid_1/skin_ipseo.php
    public_html/cache/skin_cache/cacheid_1/skin_login.php
    public_html/cache/skin_cache/cacheid_1/skin_mod.php
    public_html/cache/skin_cache/cacheid_1/skin_search.php
    public_html/cache/skin_cache/cacheid_1/skin_shoutbox_hooks.php
    public_html/cache/skin_cache/cacheid_1/skin_boards.php
    public_html/cache/skin_cache/cacheid_1/skin_gms.php
    public_html/cache/skin_cache/cacheid_1/skin_messaging.php
    public_html/cache/skin_cache/cacheid_1/skin_legends.php
    public_html/cache/skin_cache/cacheid_1/skin_cp.php
    public_html/cache/skin_cache/cacheid_1/skin_post.php
    public_html/cache/skin_cache/cacheid_1/skin_mlist.php
    public_html/cache/skin_cache/cacheid_1/skin_modcp.php
    public_html/cache/skin_cache/cacheid_1/skin_global_other.php
    public_html/cache/skin_cache/cacheid_1/skin_reports.php
    public_html/cache/skin_cache/cacheid_1/skin_global.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_clients.php
    public_html/cache/skin_cache/cacheid_1/skin_topic.php
    public_html/cache/skin_cache/cacheid_1/skin_help.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_emails.php
    public_html/cache/skin_cache/cacheid_1/skin_ucp.php
    public_html/cache/skin_cache/cacheid_1/skin_global_comments.php
    public_html/cache/skin_cache/cacheid_1/skin_nexus_payments.php
    public_html/cache/skin_cache/cacheid_1/skin_forum.php
    public_html/cache/cache.php
    public_html/cache/aq.php
    public_html/cache/sd2178.php
    public_html/hooks/ipSeoPingTopics_9be3a8f6d34784b16a253af2060440da.php
    public_html/hooks/ipSeoAcronymsEditor_f29ecb558858bb04bf957fb505093329.php
    public_html/hooks/ipSeoMeta_1dfa8b1e2915158bcd0bc2ca20a90f4f.php
    public_html/hooks/dp3_fi_boardsClassActionOverloader_5fee7a7dd42c37cd850eba64e519789d.php
    public_html/hooks/cstopspamreg_cea6e736e42ab14fa64581f28c8c08d1.php
    public_html/hooks/passwordStrength_skin_7b219a756db0cc9bcbf78cb9b17ad92f.php
    public_html/hooks/ipSeoGuestSkin_ceb6061092c92fc4b36e682aabaa5c96.php
    public_html/hooks/globalProMenuRemovalTool_f73b5f48f7515d65c93216498d309aac.php
    public_html/hooks/cstopspamreg_bstats_99fac0fad97daf26fb18c4e61a46ed90.php
    public_html/hooks/topicosrecentes_ucp_8eced785d6487592b493fc683e778f68.php
    public_html/hooks/dp3_fi_forumsClassActionOverloader_0317c8e4a356386124447e57d90a0188.php
    public_html/hooks/globalProMenuJava_1e4b91655304505004f3429052bc0561.php
    public_html/hooks/ipSeoAcronymsBbcodeParser_46716b0eace16d346a426516a5a550ca.php
    [/code] [/spoiler] В глаза бросается [code]
    public_html/cache/aq.php
    public_html/cache/sd2178.php
    (названия файлов изменены, т.к. пока незачем их публиковать всем).
    [/code] (файл [font=courier new,courier,monospace]public_html/cache/cache.php[/font] я заметил только когда писал это, с ним тоже разберемся). Первый файл оказывается скриптом, значение которого я так и не понял. Второй файл имеет интересное содержание. После небольшой пробежки по Google оказываемся здесь. Все понятно, бэкдор из паблика. Удалять эти файлы как-то банально, сделаем по другому — заставим эти файлы работать на нас. Я не буду приводить код, скажу только, что IP-адрес, а так же информация о системе каждого, кто откроет эти файлы будут сохранены. С этим разобрались. Но очевидно, что "центр" взлома находится не здесь, а вон в тех аватарках с PHP кодом. Нам нужно определить, что этот код делает, чтобы установить, для чего был осуществлен взлом. Для начала берем первый файл — [b]av-128.php[/b]. Открываем его. Смотрим. Это кошмар. Во-первых, сразу видно, что код обфусцирован. Во-вторых, начисто нет форматирования кода. Начинаем с малого, приведем код к читаемому виду, в плане переносов строк. Для этого воспользуемся вот этим прекрасным сервисом, который отформатирует код за нас. Прогоняем код. Получаем результат, смотрим. Красота. Код стал более читабелен, мы можем сразу провести небольшой анализ. В коде нет зарезервированных слов PHP (if, function, for, while, и т.д.). Значит код в том виде, в котором он сейчас использует только стандартные функции PHP, не определяя свои. Из первого пункта получаем, что код обфусцирован несколько раз (почему? Потому что свои функции у скрипта все таки есть, помните ошибку, с которой все начиналось?). Скорее всего деобфусцировать код автоматически не выйдет. Поискав в Google сервисы для деобфускации становится понятно, что все что там есть — ерунда. Ну что ж, будем делать все самостоятельно. [size=5][b]Этап 1.[/b][/size] Бегло взглянув на код и обнаружив множество текстовых строк, а затем одну, которая все их объединяет [code]
    $v3IWiBF = // и здесь все эти текстовые строки
    [/code] приходим к выводу, что на данной стадии в коде минимум логики. Нужно найти переход с этого уровня кода на более низкий. Смотрим где же используется эта переменная [font=courier new,courier,monospace]$v3IWiBF[/font] с огромным текстом внутри. В коде таких упоминаний одно, это [code]
    $lGp2BqP = $Mb8Ze($v3IWiBF, $hFl0_($Jj1U($TjMGm), $Jj1U($VtLjYNP)));
    [/code] Ладно, смотрим где встречается собственно [font=courier new,courier,monospace]$lGp2BqP[/font], а это — последняя строка, вот [code]$d1QZk($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Значит переход на более низкий уровень кода находится на последней строке, это означает, что код обфусцирован [i]последовательно[/i], т.е. весь код (а не его отдельные части) был обфусцирован несколько раз. Это упрощает работу, значит нам тоже разбирать код можно последовательно, не пытаясь найти места, с которых начать. [size=5][b]Этап 2.[/b][/size] Есть такие задачки для маленьких детей, где нарисованы какие-то непрерывные линии, их начала и концы указаны и нужно найти какая линия к чему приведет, причем начал больше чем концов. Легче всего это решить пойдя по этим линиям с конца, вот и мы поступим так же. У нас есть функция, которая ведет к переходу на более низкий уровень кода — эта та самая последняя строчка [code]$d1QZk($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Будем работать над ней. Смотрим на образование названия самой функции: [code]
    $oWHh = "\160\162";
    $zYdUyk = 'eg';
    $XqVM = "\137\162";
    $PU0b = "\145\160";
    $I0Tf = "\154\141";
    $qGX8ht = "\143\145";
    $d1QZk = $oWHh . $zYdUyk . $XqVM . $PU0b . $I0Tf . $qGX8ht;[/code] Через секунд 10 раздумий в голову приходит, что 160, 162, 137 и т.д. — это ASCII коды и о них нам рассказывали где-то в школе. Ищем таблицу ASCII кодов, открываем, ищем число 160. Находим, это символ [b][size=4]á[/size][/b]. В PHP нет стандартных функций в названиях которых используются такие символы (а на данном уровне кода у скрипта тоже никаких своих функций нет, помните мы выше это выяснили). Значит 160 нам не подходит, но ведь в коде он используется. Вспоминаем синтаксис PHP, черт, ведь там код символа указывается в восьмеричной системе исчисления. Смотрим тогда колонку [i]Oct[/i] (Octal — восьмеричная система исчисления). Находим, это латинская буква [b]p[/b]. Подходит! Смотрим дальше. 162 — это буква [b]r[/b], получаем, что [code]$oWHh = "\160\162";
    $zYdUyk = 'eg';[/code] это ни что иное, как [b]preg[/b], т.е. это библиотека для работы с регулярными выражениями в PHP. Смотрим дальше, когда мы получаем[b] preg_r [/b]становится понятно, что вся функция имеет название [b]preg_replace[/b]. Промежуточный результат: [code]preg_replace($phl6yJ, $r6Q7D($lGp2BqP), $PJf4o9);[/code] Ну, совсем просто узнаем, что [font=courier new,courier,monospace]$phl6yJ[/font] это [code]/.*/e[/code] . Промежуточный результат: [code]preg_replace('/.*/e', $r6Q7D($lGp2BqP), $PJf4o9);[/code] Смотрим, что такое [font=courier new,courier,monospace]$r6Q7D[/font]. В коде это [code]
    $BiDR51n = "\142\141";
    $IhcdiCL = 'se';
    $Vq5GI = '64';
    $ID4o = "\137\144";
    $nBHq = 'ec';
    $ekeM_1 = "\157\144";
    $NViQXn = "\145";
    $r6Q7D = $BiDR51n . $IhcdiCL . $Vq5GI . $ID4o . $nBHq . $ekeM_1 . $NViQXn;
    [/code] Увидев [font=courier new,courier,monospace]..se64..ec...[/font] машинально вспоминаем [code]base64_decode[/code] Промежуточный результат: [code]preg_replace('/.*/e', base64_decode($lGp2BqP), $PJf4o9);[/code] [font=courier new,courier,monospace]$lGp2BqP[/font] — это результат работы какой-то функции, которая обрабатывает результат другой функции, пропустим пока. Остается [font=courier new,courier,monospace]$PJf4o9[/font]. Находим [code]
    $uRk52 = "";
    $PJf4o9 = $uRk52;
    [/code] в самом начале файла. Пустая строка. Отлично. Промежуточный результат: [code]preg_replace('/.*/e', base64_decode($lGp2BqP), '');[/code] Теперь будем разбираться с [font=courier new,courier,monospace]$lGp2BqP[/font]. Путем рассуждений которые мы делали выше узнаем, что [font=courier new,courier,monospace]$lGp2BqP [/font]— это [code]$lGp2BqP = strtr($v3IWiBF, array_combine(str_split($TjMGm), str_split($VtLjYNP)));[/code] Подставляем переменные и получаем [code]$lGp2BqP = strtr($v3IWiBF, array_combine(str_split('0=7ApLG%5HY#VS-$u_xsE 9,ZtD!crgq2b^/:6o3v1(&ln~k)\'B*IdQ[f4a`W\\'), str_split('8yaoY9jrcKuARDHlPC3S65nBwemEiN=Q1Vhf2stLZqJGUdIWbpM0zx4XvTFkgO')));[/code] А [font=courier new,courier,monospace]$v3IWiBF[/font] — это та огромная строка, про которую мы говорили в самом начале. Промежуточный результат: [code]preg_replace('/.*/e', base64_decode(strtr($v3IWiBF, array_combine(str_split('0=7ApLG%5HY#VS-$u_xsE 9,ZtD!crgq2b^/:6o3v1(&ln~k)\'B*IdQ[f4a`W\\'), str_split('8yaoY9jrcKuARDHlPC3S65nBwemEiN=Q1Vhf2stLZqJGUdIWbpM0zx4XvTFkgO')))), '');[/code] [code]'/.*/e'[/code] в регулярном выражении означает выполнение кода, указанного в строке. Значит нам нужно получить эту строку, это основной код скрипта. Выполняем [font=courier new,courier,monospace]base64_decode[/font] и получаем вот это. [b][size=5]Этап 3[/size][/b] Переходим на еще более низкий уровень кода, опять выполнив [font=courier new,courier,monospace]base64_decode[/font]. Результат. Вот мы и добрались до этой функции [font=courier new,courier,monospace]ololololololo1[/font]. Смотрим и видим это [code]\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'[/code] Это пошли уже HEX коды символов, расшифровав получаем [code]
    eval(gzinflate(base64_decode('/* зашифрованный код */')));
    [/code] Переходим еще на уровень ниже... [b][size=5]Этап 4[/size][/b] Вот он код, ребята! После небольшой паузы я начал смеяться, нет, правда Мы получили такой же код, как и в файле [code]public_html/cache/sd2178.php[/code] , отличие только в том, что он выполняется, если у пользователя установлена cookie с названием [b]zx[/b]. Получается, мы просто потратили время впустую? Нет. Во-первых, знаете, это вообще клёвое (я вообще никогда не ставлю букву Ё при набирании текста на клавиатуре, это исторический момент) чувство когда делаешь что-то вроде взлома. Ведь в самом деле, мы только что взломали защиту, которую кто-то делал. Во-вторых, лично я получил прекрасный опыт работы с [b]таким[/b] кодом. Можно считать эта была тренировка на умение ориентироваться и разбираться в защищенном коде. В-третьих, я могу сказать владельцу сайта (как писал я уже выше — это [member='Fensmas']), что ничего супер-страшного в этом коде не нашлось (нет, вообще этот скрипт может многое, вплоть до удаления всех файлов сайта, но мы сделали все вовремя). А вообще у нас есть еще один файл — [font=courier new,courier,monospace]uploads/profile/photo-128.jpg[/font], но разбирать его нет смысла. Вспомним ошибку: [CODE]
    Fatal error: Cannot redeclare ololololololo1() (previously declared in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/av-128.jpg(33) : regexp code(1) : eval()'d code:2) in /home/o/ХХХ/pro-ucheba.com/public_html/uploads/profile/photo-128.jpg(33) : regexp code(1) : eval()'d code on line 3
    [/code]
    Если кратко — код в этом файле является идентичным коду, который мы только что разбирали.

    [size=5][b]Итоги[/b][/size]

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

    Учитывая то, что в общем-то код был один и тот же, можно предположить, что через один бэкдор были закачаны все остальные (а не было взлома еще и механизма кэширования IP.Board).

    В любом случае, я считаю, что это время я потратил не зря, хотя бы потому что это было интересно.
    Спасибо.


    Respected: так же можете почитать эту статью:

    [size=5][b]UPDATE 09.11.2012[/b][/size]
    Способ взлома сайта найден.
    Подробности опубликованы в теме.
×
×
  • Создать...