В этой статье я расскажу каким образом организована публикация ссылки на сайт разработчика бесплатного компонента JoomShopping 3.7.x, используемого для организации каталога или магазина на базе Joomla 2.5.
ВНИМАНИЕ!
Автор данной статьи не несёт никакой ответственности за совершаемые читателями действия в отношении описываемого в данной статье программного кода. Всё, что Вы делаете - Вы делаете на свой страх и риск. Вы отдаете себе отчет в том что снимая копирайт с данного интелектуального продукта Вы нарушаете закон Украины об авторских правах. Автор настоятельно рекомендует читателям легально убрать копирайт, обратившись к разработчику. Данная статья является извещением о найденной уязвимости в системе защиты данного продукта и призвана подтолкнуть разработчиков на дальнейшее совершенствование системы защиты своих программных продуктов.
Итак приступим.
В отличии от прошлых версий скрипта в версии 3.7 разработчики постарались больше запутать следы вывода ссылки на свой сайт.
Теперь просто декодировать логику из BASE64 изменить условие, закодировать обратно и вставить в файл недостаточно. Разработчики предусмотрели проверку целостности данного кода. Для этого они обработали код, предварительно закодированный в base64 еще и в MD5.
{loadposition goomat}
Именно с этим в последствии шло сравнение если обнаруживалось несовпадение переставала работать или часть магазина(не выводились товары) или отключались CSS-стили. Но лазейка все таки найдена и ссылка после описанных ниже в статье модификаций станет доступна для изменения.
Итак для того чтобы выковырять ссылку делаем следующее:
1. Открываем в редакторе файл components/com_jshopping/lib/parse_string.php и в строках 66-69 видим следующий код:
1 2 3 4 5 6 7 8 9 10 11 |
function getPSencodersf(){return "ZnVuY3Rpb24gY2hlY2tMaWNlbnNlKCl7JGM9JkpTRmFjdG9yeTo6Z2V0Q29uZmlnKCk7cmV0 dXJuIGNvbXBhcmVYNjQocmVwbGFjZVdXVyhnZXRKSG9zdCgpKSwkYy0+bGljZW5zZWtvZC k7fQ==";};eval(base64_decode(getPSencodersf())); function getPSencodersh(){return 'Y2xhc3MgX2poY2R7ZnVuY3Rpb24gZGlzcGxheSgpeyRjPSRfUkVRVUVTVFsiY29udH JvbGxlciJdO2lmICgkYyE9ImNvbnRlbnQiKXtpZiAoIWNoZWNrTGljZW5zZSgpKXtzZWxm OjpwcmNwcigpO319fWZ1bmN0aW9uIHByY3ByKCl7cHJpbnQgJzxzcGFuIGlkPSJteGNwciI +PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWYgPSAiaHR0cDovL3d3dy53ZWJkZXNpZ25lci1wcm 9maS5kZS8iPkNvcHlyaWdodCBNQVhYbWFya2V0aW5nIFdlYmRlc2lnbmVyIEdtYkg8L2E+PC 9zcGFuPic7fX1nbG9iYWwgJGNvbnRyb2wxZXI7JGNvbnRyb2wxZXI9bmV3IF9qaGNkKCk7';}; eval(base64_decode(getPSencodersh())); |
Удаляем или комментируем данный код, он нам больше не понадобиться.
Вместо него вставляем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function checkLicense(){ $c=&amp;amp;amp;amp;amp;amp;amp;JSFactory::getConfig();return compareX64(replaceWWW(getJHost()),$c->licensekod); } class _jhcd{ function display(){ $c=$_REQUEST["controller"]; if ($c!="content"){ if (!checkLicense()){ self::prcpr(); } } } function prcpr(){ print '<a href="http://www.webdesigner-profi.de/" target="_blank"> Copyright MAXXmarketing Webdesigner GmbH </a>'; } } global $control1er;$control1er=new _jhcd(); |
в котором есть ссылка на сайт разработчиков, но уже на данный момент мы можем отредактировать ее или удалить. Для тех кто совсем-совсем не понимает что есть как в приведенном выше коде - код без ссылки выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function checkLicense(){ $c=&amp;amp;amp;amp;amp;amp;amp;JSFactory::getConfig();return compareX64(replaceWWW(getJHost()),$c->licensekod);} class _jhcd{ function display(){ $c=$_REQUEST["controller"]; if ($c!="content"){ if (!checkLicense()){ self::prcpr(); } } } function prcpr(){ print '<span id="mxcpr"></span>'; } } global $control1er;$control1er=new _jhcd(); |
С этим файлом все. Можем его сохранить и обновить на сервере.
Переходим к следующему файлу, который находиться по адресу: components/com_jshopping/lib/functions.php
Открываем файл в текстовом редакторе и в строке примерно 604 ищем следующий код:
1 |
if (md5(getPSencodersf().getPSencodersh())!="91248e5f661d5c5fe5098c2fe20753e6") $products = array(); |
комментируем эту строку. Все, этот файл тоже можно сохранить и обновить на сервере.
Переходим к последнему файлу из этой цепочки защиты. Он находиться по адресу: components/com_jshopping/controllers/checkout.php
в этом файле в строке примерно 149 ищем похожий код:
1 |
if (md5(getPSencodersf().getPSencodersh())!="91248e5f661d5c5fe5098c2fe20753e6") $cart->clear(); |
Поступаем с этой строкой так же как и в прошлом файле, т.е. комментируем ее. Тут тоже все. Файл можно сохранять и обновлять на сервере.
Все готово. Внешняя ссылка у нас на сайте ликвидирована.
Автор напоминает о том что разработчики предоставляют данный компонент совершенно бесплатно и в замен своих стараний требуют размещения на Вашем сайте ссылки на свой ресурс. Как бы то ни было, но люди старались, писали код, тестировали, исправляли ошибки и честно заслужили размещение на Вашем сайте свою ссылку.
Автор рекомендует не забыть их стараний и сделать на сайте раздел "Ссылки" или "Друзья сайта" и в нем разместить ссылку на разработчиков.
Свою благодарность автору статьи вы можете выразить просто кликнув в нужном месте на странице 🙂
автор: Руслан Овчинников