Защита от инъекций.

12
F
На сайте с 06.02.2012
Offline
124
1794

Недавно обнаружил вирусную активность у себя на сайтах.

Похоже дырявые Джумлы вскрыли. У меня их две.

Почистил всё айболитом, вроде все бекдоры выловил..

Джумлы обе удалил. Заменил простенькими самодельными движками, использовал только штатную базу.

У меня несколько самодельных движков на сайтах. Как-то прежде не задумывался о безопасности, пока не приспичило.

Вот теперь думаю, как быстро обезопасить сайты от популярных хакерских инъекций.

Читал обсуждения на эти темы.. в том числе и от хакеров.

Почему-то не обсуждается самый простой метод - ограничить длину get-переменных, например до 30 знаков. У меня все штатные переменные в урлах не более 20 знаков.

Сразу первой строкой

if (strlen($_GET['var']) > 30) {echo 'Бла-бла';return;}

MD5 и baze64 уже не пролезут через адресную строку...?

А чтоб прямые скрипты не пихали можно сразу обрезать опасные символы.

То же и в Post-запросах...

По частям ведь нельзя же код внедрить.. или как?

Где-то прочитал в инете фразу - Все известные методы защиты - это защита от школьников. Но если к вам на сайт придёт настоящий хакер, то не поможет ничего.

Пугают наверное...

VHS
На сайте с 28.09.2007
Offline
142
VHS
#1

А самопис какого года выпуска?

Метод защиты - проще некуда - все (абсолютно) входящие данные от пользователя - get, post, cookie - все это должно перепроверяться. Ограничение длины строки - как бы не совсем выход.

Для числовых нужно привести тип:

$a = intval($a);

Для строковых - произвести проверку на допустимые символы. Если вводится ключ для дальнейшей передачи в mysql, то есть mysql_real_escape_string на этот случай.

Чем меньше наше приложение принимает данных от пользователя, чем дотошнее мы их проверяем и приводим к нужному типу - тем меньше вероятность ошибки.

Про настоящего хакера - прям байка подростковая. Ломать самопис через тестирование ошибок приложения, в котором методы передачи данных и код обработки закрыты - дело муторное и сильно времязатратное, зачастую просто бесполезное, гораздо проще будет скоммуниздить пароли по дороге на сервер, подсунуть трояна, увести почту и т.п.

G-and-Y
На сайте с 29.06.2013
Offline
182
#2

Как вариант 444 на все файлы, только некоторым дать права на запись или сделать так /ru/forum/comment/14346275

Абузо-устойчивые впс ( http://vps-hosting.lv/?p=13408 )
Оптимизайка
На сайте с 11.03.2012
Offline
396
#3

Посмотрите в сторону modsecurity или naxsi

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
Joker-jar
На сайте с 26.08.2010
Offline
154
#4

Некоторые основы:

- Отключаем вывод ошибок (только логирование).

- Юзерские данные для запросов в БД прогоняем через intval, mysqli::real_escape_string, ... в зависимости от типа данных, сами данные в запросах обрамляем в ''.

- Если на сайте есть загрузка файлов, например, картинок, проверяем формат по содержимому, а не по расширению, например:

$info = getimagesize($files['tmp_name'][$i]);
switch ($info['mime']) {
case 'image/jpeg' : $ext = 'jpg'; break;
case 'image/gif' : $ext = 'gif'; break;
case 'image/png' : $ext = 'png'; break;
default : $error = true; break;
}

- Никаких include с пользовательскими данными. Если есть острая необходимость в подобном, стройте на условиях:

if ( $_GET['module'] == 'news' ) include 'news.php';

register_globals, я думаю, уже никто не использует.

А еще желательно к URL'ам, выполняющим администраторские функции, добавлять уникальные хеши и проверять их перед действием.

F
На сайте с 06.02.2012
Offline
124
#5

Спасибо! Всё учту.

VHS:
А самопис какого года выпуска?

Начал писать PHP скрипты года три назад, так постепенно и строил сайты сам себе.

Я технарь, не программист. На любительских началах сделал себе несколько сайтов в рекламных и информационных целях. Ещё в советские времена изучал и юзал Ассемблер, теперь нужда заставила, освоил PHP.

Когда количество посетителей перевалило за 5К, начали посещать мысли о безопасности. Вот уже и начались проблемы.

W
На сайте с 09.04.2013
Offline
46
#6

Векторов атак очень много. Вот например список - https://www.owasp.org/index.php/Category:Attack.

Другое дело ,интересен ли хакерам ваш сайт.

Своеобразной защитой от школьников и ботов является уже то,что это самопис.

Как верно заметил коллега выше, поиск уязвимости дело муторное - поэтому в основном ломают с помощью ботов используя уже известные уязвимости популярных CMS.

Ограничение по размеру не выход.Приведу пример.

Есть админка с таким кодом


$result = mysql_query("SELECT * FROM adminka WHERE login='$_POST[login]' and pass='$_POST[pass]'");
$num_rows = mysql_num_rows($result);
if ($num_rows) {
echo 'hello admin';
} else {
echo 'no authorization';
}

Остается ввести в поле login -


' OR '1'='1' #
и все мы авторизованы.Т.е меньше 30 символов.

Это конечно говнокод,просто для примера.

Но в самописах разное встечается...

Joker-jar:

$info = getimagesize($files['tmp_name'][$i]);

switch ($info['mime']) {
case 'image/jpeg' : $ext = 'jpg'; break;
case 'image/gif' : $ext = 'gif'; break;
case 'image/png' : $ext = 'png'; break;
default : $error = true; break;
}

Проверка mime это половина решения.

Если на сайте есть LFI -зальют шелл;

Допишите в файл с картинкой php код.


echo '<?php echo PHP_EOL,date("Y-m-d",time()),PHP_EOL;?>' >> 1.jpg

А затем выполните.


$info = getimagesize('1.jpg');
echo $info['mime'];
include '1.jpg';

PHP проигнорирует бинарные данные

картинки и выполнит код расположенный между <?php и?> .

А тем не менее mime = image/jpeg.

Выход? Проверять все данные:приводить типы,фильтровать,использовать pdo.

В интернете много информации , вот например википедия - https://en.wikipedia.org/wiki/SQL_injection

F
На сайте с 06.02.2012
Offline
124
#7

Ещё такой момент. Для подключения к базе и ввода данных подключаю теперь готовый класс от Vasiliy Makogon. Он широко разрекламирован в инете.. ссылки тут думаю не нужны.

Вроде там по безопасности работы с базой всё предусмотрено... Всё нормально работает.

Но насколько безопасно использовать вообще известные инету классы и скрипты?

Переименовал на всякий случай имя класса, чтоб не вызывали...

Есть ли смысл переименовывать там внутри свойства и методы?

Написать свой безопасный класс не готов. Пока плохо понимаю ООП...юзаю базовый синтаксис... Не планирую больших проектов, плюс консерватизм... ностальгия по ассемблеру.. не способствуют освоению ООП.

---------- Добавлено 16.04.2016 в 12:07 ----------

webjey:
Своеобразной защитой от школьников и ботов является уже то,что это самопис

Поработаю с пользовательскими переменными конечно же теперь поплотнее.

Как я понял, кавычки и вообще знаки препинания и всякие скобки можно просто вырезать или менять на спец-символы. Плюс ограничить длину до 31. Числовые обернуть в интвал. Уже полдела.

Переменные в инклудах вообще не использую. Ошибки в скриптах сервер по умолчанию не выдаёт и не включал их ни разу..

Ограничить права доступа - вариант тоже неплохой. На запись, на исполнение скриптов, где не нужно...

Спасибо!

---------- Добавлено 16.04.2016 в 12:57 ----------

Картинки у меня иногда валяются где попало... даже есть в корневых директориях... Тоже дыра по сути. Это же видно в исходном коде страницы...

Надо собрать в папки и закрыть там исполнение скриптов.

Да уж... тяжела доля чайника..

W
На сайте с 09.04.2013
Offline
46
#8
fordzon:
Но насколько безопасно использовать вообще известные инету классы и скрипты?

Код известных скриптов видят разные люди и могут найти в них ошибки и уязвимости.

Указанный вами класс мне показался хорошим решением. Если есть сомнения,можно

погуглить "название скрипта exploit","название скрипта Poc".

fordzon:
Есть ли смысл переименовывать там внутри свойства и методы?

Нет.

fordzon:
ностальгия по ассемблеру..

А теперь мы, чуть что, нажимаем reset...

Да, куда не пойдешь - везде наткнешься на RET,

И еще хорошо, если в стеке есть адрес возврата :)

TF-Studio
На сайте с 17.08.2010
Offline
334
#9
Для подключения к базе и ввода данных подключаю теперь готовый класс от Vasiliy Makogon
Он широко разрекламирован в инете.. ссылки тут думаю не нужны.

серьёзно?

может что-то более качественное пойдет?

AR, pdo к примеру. то, что много людей разрабатывало

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
F
На сайте с 06.02.2012
Offline
124
#10
webjey:
А теперь мы, чуть что, нажимаем reset...
Да, куда не пойдешь - везде наткнешься на RET

Давно это было... Ещё во времена Z80. Уже не вспомню даже как выглядела клавиатура Спектрума..

Но мне нравилась вся эта возня непосредственно с регистрами процессора, памятью и периферией.

TF-Studio:
то, что много людей разрабатывало

Не показатель.

Всем спасибо!

Основные направления понятны. Дело за малым - перелопатить свой быдлокод двух-трёх-летней давности... Тогда ещё мышкой программировал...

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий